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 都不会变


相关推荐
内卷焦虑人士16 小时前
Windows安装WSL2+Ubuntu 22.04
linux·windows·ubuntu
门豪杰19 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
深蓝轨迹20 小时前
彻底删除VMware虚拟机并清理残留,解决虚拟网卡消失问题
windows·ubuntu·centos
²º²²এ松1 天前
vs code连接ubuntu esp项目
linux·数据库·ubuntu
徒 花1 天前
ubuntu远程连接ssh及VSCode配置远程ssh连接ubuntu
vscode·ubuntu·ssh
i建模1 天前
在Ubuntu中解压ZIP文件
linux·chrome·ubuntu
林鸿群1 天前
Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)
linux·ubuntu·gitlab·私有部署·代码托管·ubuntu 26.04·omnibus
YuQiao03031 天前
国内安装claude code
ubuntu·claude·vibe coding
Jiozg1 天前
ES安装到linux(ubuntu)
linux·ubuntu·elasticsearch
returnthem1 天前
Ubuntu 22.04 + XFCE4 + 非 Snap 版 Firefox + VNC/noVNC 部署全步骤
linux·ubuntu·firefox