Ubuntu 虚拟机只有一个网卡时,如何在固定 IP 和 DHCP(手机热点)之间切换

适用场景:

  • Ubuntu 20.04 / 22.04
  • 虚拟机(VMware / Hyper-V / VirtualBox)
  • 只有一个网卡(eth0 / ens / enx...)
  • 需要在 固定 IP(如 10.10.10.20) 和 DHCP(如 192.168.x.x,手机热点) 之间切换

一、问题背景

在做 Kubernetes 主从验证时,我的环境是:

  • 一台 Ubuntu 物理服务器(Master)
  • 一台 Windows 上的 Ubuntu 虚拟机(Worker)
  • 虚拟机只有一个网卡

正常情况下我给虚拟机配置的是固定 IP:

复制代码
10.10.10.20/24

但在以下场景中经常会遇到问题:

  • 服务器没外网
  • 拉不到 K8s / Calico / CoreDNS 镜像
  • 临时需要用 手机 USB 热点

结果就是:

插上手机热点后,IP 变成了 192.168.42.x

重启后又变回 10.10.10.20

Kubernetes 通信直接炸掉 😅


二、核心原理(一定要懂)

1️⃣ 192.168.x.x 是怎么来的?

不是系统乱配的,而是 DHCP

  • 手机热点 = DHCP Server
  • Ubuntu = DHCP Client
  • 一插热点 → 自动分配 192.168.42.x

👉 这是临时 IP


2️⃣ 10.10.10.20 是什么?

这是你通过 netplan 手动配置的静态 IP

yaml 复制代码
dhcp4: no
addresses:
  - 10.10.10.20/24

👉 这是固定 IP


3️⃣ 为什么会"同时存在两个 IP"?

因为你做过其中一件事:

  • 开过 dhcp4: true
  • /etc/netplan 里有多个 .yaml
  • 没清理旧配置

于是结果变成:

text 复制代码
eth0:
  10.10.10.20   (静态)
  192.168.42.89 (DHCP)

⚠️ 对 Kubernetes 来说,这是灾难配置


三、正确的做法(强烈推荐)

原则一句话:

同一时间,只能用一种方式:要么 DHCP,要么静态 IP


四、方案一:切到手机热点(DHCP)

适合:

  • 拉镜像
  • 临时上网
  • 不跑 K8s

1️⃣ 删除所有旧 netplan 配置

bash 复制代码
sudo rm -f /etc/netplan/*.yaml

2️⃣ 新建 DHCP 配置(只有一个文件)

bash 复制代码
sudo tee /etc/netplan/01-dhcp.yaml <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
EOF

⚠️ 如果网卡不是 eth0,用 ip -br a 查看实际名称


3️⃣ 修复权限(非常重要)

bash 复制代码
sudo chmod 600 /etc/netplan/01-dhcp.yaml

4️⃣ 应用配置

bash 复制代码
sudo netplan apply

5️⃣ 验证

bash 复制代码
ip a

你应该看到类似:

text 复制代码
inet 192.168.42.x/24

五、方案二:切回固定 IP(10.10.10.20)

适合:

  • Kubernetes 主从通信
  • 内网集群
  • 稳定运行

1️⃣ 删除 DHCP 配置

bash 复制代码
sudo rm -f /etc/netplan/01-dhcp.yaml

2️⃣ 写固定 IP 配置

bash 复制代码
sudo tee /etc/netplan/01-static.yaml <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 10.10.10.20/24
      gateway4: 10.10.10.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 114.114.114.114
EOF

3️⃣ 修复权限

bash 复制代码
sudo chmod 600 /etc/netplan/01-static.yaml

4️⃣ 应用配置

bash 复制代码
sudo netplan apply

5️⃣ 验证

bash 复制代码
ip a

应只看到:

text 复制代码
inet 10.10.10.20/24

六、常见坑总结(血泪经验)

❌ 同时存在多个 netplan 文件

bash 复制代码
ls /etc/netplan

👉 只保留一个


❌ 文件权限不对

text 复制代码
Permissions too open

解决:

bash 复制代码
sudo chmod 600 /etc/netplan/*.yaml

❌ 同时开启 DHCP + 静态 IP

👉 表面能用

👉 K8s 一定出问题


七、和 Kubernetes 的关系(重点)

场景 是否适合
192.168.x(热点) ❌ 不适合集群
10.10.10.x(静态) ✅ 强烈推荐
IP 变化 ❌ kubelet 会反复重连
固定 IP ✅ Node 稳定 Ready

八、最终结论

手机热点 IP 是临时的,不会持久
netplan 写死的 IP 才是"开机必定生效的"

只要你:

  • /etc/netplan 里只有一个文件
  • dhcp4: no
  • 写死 10.10.10.20

那么:

✅ 重启多少次,IP 都不会变


相关推荐
大鹏的NLP博客10 小时前
WSL Ubuntu 26.04 升级与环境整理记录
linux·ubuntu·wsl
忆挽篱笙歌12 小时前
gdb/cgdb
linux·ubuntu
成为你的宁宁15 小时前
【Ubuntu 18.04安装Gitlab】
ubuntu·gitlab
MicrosoftCloud16 小时前
性能排查 02|vmstat、iostat、mpstat、sar 怎么读?性能四件套的分工与判读阈值
linux·ubuntu·vmstat·性能监控·iostat·sysstat
承渊政道20 小时前
Linux网络学习【UDP Socket编程实战:网络命令与客户端访问Linux验证】
linux·网络·学习·ubuntu·编程实战·udp socket
奔跑的大白啊2 天前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
缘友一世3 天前
银河护卫队在steam(linux Proton GE-Proton10-34)上启动无窗口问题修复
linux·ubuntu·steam·proton
刘胡子大叔3 天前
repo 与 index:站点目录该怎么切
ubuntu·php
zhangrelay4 天前
用ROS2Lyrical实验报告册思路重做蓝桥云课ROS1实验并改进
linux·笔记·学习·ubuntu·机器人
小小龙学IT4 天前
ROS2 安装完全指南(Ubuntu 版):从零开始到跑通第一个节点本文
linux·运维·ubuntu