
1. 为什么虚拟机里的 Ubuntu 值得配一个固定 IP刚接触 vmware 虚拟机安装教程的朋友大概率都会经历这么一段装好 ubuntu 20.04网络用默认的 NAT能上网、能 apt install一切岁月静好。直到某天你想用 SSH 连进去、想跑个数据库对外提供服务、想把宿主机上的代码同步进去才发现每次重启后 IP 都变了昨天连的是 192.168.x.129今天变成 192.168.x.131脚本里的那串地址直接失效。这就是我坚持在任何一台长期使用的虚拟机上配静态 IP 的原因——不是强迫症是省命。这篇内容就是把我这些年反复折腾 vmware ubuntu 20.04 网络配置的经验完整地摊开讲一遍。核心围绕 vmware 的 NAT 模式讲清楚怎么给 ubuntu 20.04 设置一个永远不会变的静态 IP为什么 NAT 模式下要这么配配的时候哪些参数是从哪来的配完为什么会掉掉完怎么救。适合刚上手的运维新人、需要在本地搭开发环境的程序员、以及想学网络配置但一直被各种教程带偏的同学。不管你之前有没有碰过 netplan 或者 networkd读完都能自己动手搞定并且明白每一步背后的道理。我先把结论摆在这在 NAT 模式下配静态 IP最关键的三个数字是子网网段、网关地址和DNS 地址它们全部来自 VMware 的虚拟网络编辑器不是拍脑袋编的。把这三个数找准剩下的就是把它们写进 ubuntu 20.04 的 netplan 配置文件里重启生效。听起来简单但每个环节都有坑下面一步步来。1.1 NAT 模式到底做了什么很多人用 NAT 模式是因为它“开箱即用”——虚拟机不用额外配置就能上网。但很少有人真正搞清楚它在背后干了什么。VMware 在宿主机上装了一块叫VMnet8的虚拟网卡所有 NAT 模式下的虚拟机都接到这块虚拟交换机上形成一个封闭的内网。虚拟机要访问外网时请求先发到 VMware 的 NAT 设备通常就是这个网段里的 .2 地址由它帮你做一次地址转换把你的私有 IP 换成宿主机的 IP 再发出去回来的数据包再转回来。整个过程你在虚拟机里是无感的看起来就像直接联网。理解了这一点静态 IP 的配置逻辑就顺了。因为 NAT 网络是一个由 VMware 自己规划好的内网网关是固定的网段是固定的DHCP 池也是固定的。你要做的不是“创造一个 IP”而是从 VMware 已经划好的地盘里挑一个不在 DHCP 分配范围内的地址声明成我自己的。这就解释了为什么不能随便写个 192.168.1.100 就行——那可能根本不在你的 VMnet8 网段里写了也上不了网。注意NAT 模式下虚拟机之间可以互相通信宿主机也能访问虚拟机但局域网里其他物理机器默认访问不到你的虚拟机。如果确实需要被外部机器访问后面我会讲端口转发的办法不需要改成桥接。1.2 动态 IP 带来的三个真实麻烦先说为什么非得固定而不是“每次 ip a 看一眼就行”。第一个麻烦是远程连接不稳定。你配好 SSH 之后用 MobaXterm 或者 VS Code Remote 连上去写代码虚拟机一重启 IP 一变连接全部断开工具栏里的会话得重新建。如果是用 Ansible、脚本批量管理好几台机器那更崩溃配置里的地址全成了摆设。第二个麻烦是服务绑定出问题。有些中间件启动时会读取本机 IP 写进配置文件或者注册中心IP 一变服务之间的调用直接 404。第三个麻烦是端口转发失效。NAT 模式下想让宿主机固定访问虚拟机上的某个服务得在 VMware 里做端口转发而端口转发必须指向一个固定的虚拟机 IPIP 变了你得重新配。我自己踩过最狠的一次是在一台虚拟机上跑 MinIO 做对象存储测试本地应用连的是 192.168.x.130。结果某天宿主机断电重启虚拟机的 IP 变成 131应用报了一下午的连接超时我愣是排查了 API 网关、防火墙、路由最后才发现是 IP 变了。从那以后凡是生命周期超过一天的虚拟机我第一件事就是固定 IP。这个教训值好几杯咖啡。1.3 静态 IP 方案选型为什么优先 NAT 而不是桥接固定 IP 其实有两条路NAT 模式和桥接Bridged模式。很多人一听说要静态 IP第一反应是改桥接觉得“桥接就是跟真机一样配起来更直观”。我不否认桥接有它的场景但在本地开发和测试环境里我更推荐 NAT 打底。原因是桥接会让虚拟机和宿主机处于同一个局域网占用公司或家里路由器的 DHCP 地址IP 段还受路由器管控换个网络环境比如从公司带回家IP 又得重配。NAT 则完全自成一个封闭内网跟外部网络解耦无论换到哪个 Wi-Fi你那套 192.168.x.x 的规划都不受影响稳定得让人安心。当然桥接也不是没用武之地。如果虚拟机要作为局域网内的服务节点被同事的电脑、手机直接访问桥接确实更方便配合路由器里的静态 DHCP 绑定也能固定下来。但综合易用性和隔离性我的建议是本地开发、学习、测试一律 NAT 加静态 IP只有确实需要被局域网其他设备访问时才考虑桥接。这篇文章聚焦 NAT这也是搜索量最大、问题最多的场景。2. 动手前必须搞清楚的几个网络概念配置之前我想先把几个概念理清楚因为你会发现那些网上的教程之所以互相矛盾根本原因就是没讲清楚这些参数的来源。有人写 192.168.10.0有人写 192.168.100.0有人写 192.168.0.0你不知道该信谁。其实答案只有一个去你的 VMware 虚拟网络编辑器里看。每个人机器上的 VMnet8 子网都是安装时随机或者自行设定的没有统一标准。所以与其抄别人的地址不如学会看懂自己机器上的参数。2.1 VMware 虚拟网络的三层结构VMnet、DHCP、NAT 设备打开 VMware Workstation 的“编辑”→“虚拟网络编辑器”勾选右下角的“更改设置”拿到管理员权限你就能看到 VMnet0、VMnet1、VMnet8 等等。VMnet0 是桥接用的VMnet1 是仅主机模式Host-onlyVMnet8 就是我们 NAT 模式对应的网络。选中 VMnet8你会看到三块关键信息子网 IP比如 192.168.159.0、子网掩码一般是 255.255.255.0也就是 /24、以及下面 NAT 设置和 DHCP 设置里的具体参数。这三块拼起来就是你的静态 IP 配置的全部素材。NAT 设置里有一个“网关 IP”这就是你要填在 netplan 里的 gateway 地址通常是子网的第二个可用地址比如 192.168.159.2。DHCP 设置里有“起始 IP 地址”和“结束 IP 地址”比如 192.168.159.128 到 192.168.159.254这一段是 VMware 自动分配的池子。你要选一个不在 DHCP 池里、也不等于网关、也不等于广播地址的地址比如 192.168.159.10把它写死给虚拟机用。这样就避免了跟别的虚拟机抢地址也不会跟 VMware 自己的服务冲突。参数典型值来源说明网段192.168.159.0/24虚拟网络编辑器 · VMnet8你的虚拟机所在的内网网关192.168.159.2NAT 设置 · 网关 IP出网必经之路DHCP 池192.168.159.128 - 254DHCP 设置这段不要用留给自动分配可用静态地址192.168.159.3 - 127自己算挑一个并记住DNS223.5.5.5 / 114.114.114.114公共 DNS按需替换2.2 网段规划与地址分配表有了上面的表网段规划其实就水到渠成了。假设你的 VMnet8 子网是 192.168.159.0/24那么 .1 一般是宿主机上 VMnet8 虚拟网卡的地址VMware 会自动占用.2 是 NAT 网关.254 是广播地址128 之后是 DHCP 池。那么在 3 到 127 之间就是我们可以自由发挥的静态地址区间。如果你只固定一台机器随便挑个 .10 就行如果要固定好几台建议做个简单的规划表比如 .11 给开发环境、.12 给测试数据库、.13 给 Jenkins心里有数后期维护不头大。这里补一个经常被忽略的细节VMware 的 DHCP 池范围是可以在编辑器里改的。如果你觉得默认给的池子太宽想留更多空间给静态地址完全可以把它改小比如改成 192.168.159.200 到 254。改完之后 DHCP 和静态地址互不干扰更清爽。我自己习惯把池子改到 200 以后前面 3 到 199 全留给静态规划这样命名空间一下子宽敞了。2.3 Ubuntu 20.04 的网络管理工具netplan 与 NetworkManager为什么单独讲工具因为 ubuntu 20.04 的网络配置跟 centos 7 完全不是一套东西很多从 centos7.9 配置静态 IP 教程过来的朋友一上来就找/etc/sysconfig/network-scripts/ifcfg-eth0结果发现根本没有这个目录。ubuntu 20.04 默认用的是netplan它是一个基于 YAML 的前端工具负责读取/etc/netplan/下的配置文件然后翻译成后端渲染器的实际配置。桌面版 ubuntu 20.04 默认渲染器是 NetworkManager服务器版是 systemd-networkd。这个区别很重要因为它决定了你改完配置后怎么让它生效。怎么确认自己用的是哪个渲染器看/etc/netplan/目录下的文件里面通常有一行renderer: NetworkManager或者renderer: networkd。桌面版你大概率会看到 NetworkManager。不过好消息是用 netplan 写静态 IP 的语法对两者是一致的只是生效和验证的方式略有不同。桌面版如果你更习惯图形界面其实也可以直接在右上角网络菜单里点设置配静态 IP但 YAML 方式更通用、更适合脚本化也是我推荐的方式服务器和桌面通吃。提示动手改 netplan 之前先执行sudo cp /etc/netplan/xxx.yaml /etc/netplan/xxx.yaml.bak备份一下改坏了能快速还原这一步花不了三秒救过我不下五次。3. 从零开始的完整配置流程概念理顺了接下来就是纯实操。我按真实操作顺序走一遍先在 VMware 里把参数抄下来然后确认网卡名字接着写 netplan 配置最后应用并验证。整个过程十分钟以内能搞定但每一步都别跳尤其是抄参数和确认网卡名这两步跳过必踩坑。3.1 在 VMware 里确认并记录 NAT 网络参数打开 VMware Workstation菜单栏“编辑”→“虚拟网络编辑器”点“更改设置”授权。选中 VMnet8NAT 模式记下三样东西子网 IP例如 192.168.159.0、子网掩码255.255.255.0、以及点开“NAT 设置”看到的网关 IP例如 192.168.159.2。然后再点开“DHCP 设置”看看起始和结束地址比如 192.168.159.128 到 192.168.159.254。把这四个数字记在备忘录里后面写配置全靠它们。这一步有个坑要提醒有些人看到 VMnet8 的“将主机虚拟适配器连接到此网络”没勾导致宿主机没有 VMnet8 网卡网关也连不通。正常情况下这个选项应该是勾选的如果你发现没勾勾上并点应用Windows 会重新创建这块虚拟网卡。另外如果你同时装了 Docker Desktop 或者其他虚拟化软件可能会出现网段冲突表现为虚拟机网络时通时断这种时候换个不冲突的网段比如把 VMnet8 改成 172.16.x.0能解决大部分玄学问题。3.2 编辑 VMware 的 DHCP 设置可选但推荐前面说过把 DHCP 池改小能让静态地址规划更舒服。操作很简单在虚拟网络编辑器选中 VMnet8点“DHCP 设置”把起始 IP 改成 192.168.159.200结束保持 254确定应用。这样 3 到 199 就彻底解放了。这一步不是必须的但做了之后你会少很多“明明配了静态 IP 偶尔还是会冲突”的诡异问题。尤其是虚拟机克隆场景克隆出来的机器往往带着原来的 DHCP 痕迹池子小一点能减少撞车概率。需要说明的是改 DHCP 池不会影响已经运行中的虚拟机但对新开机的机器生效。如果你是在生产环境做类似操作最好选在业务低峰期避免正在做 DHCP 续约的机器短暂抖动。个人环境就随意了改完直接下一步。3.3 编写 netplan 配置文件现在进虚拟机。先用ip a或者ip link看一眼网卡名字。ubuntu 20.04 在 VMware 里网卡名通常是ens33、ens160这种可预测命名也可能是老式的eth0。注意别认错VMware 虚拟机一般只有一块业务网卡名字记下来。然后看看/etc/netplan/下现有的配置文件长啥样ls /etc/netplan/ # 常见输出01-network-manager-all.yaml 或 00-installer-config.yaml打开它看一眼通常是 DHCP 的配置。我们要么改它要么新建一个。我更推荐直接改现有的那个文件比如sudo nano /etc/netplan/01-network-manager-all.yaml把内容替换成下面这样。注意缩进必须用空格两个空格一级千万别用 TabYAML 对 Tab 是零容忍的。network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.159.10/24 gateway4: 192.168.159.2 nameservers: addresses: - 223.5.5.5 - 114.114.114.114逐行解释一下。renderer填什么取决于你 3.3 开头看到的原文件里是什么原来是 NetworkManager 就保持一致别乱改改错了可能导致网络管理服务打架。ethernets下面是你的网卡名填ens33。dhcp4: no表示关掉 IPv4 自动获取这是静态 IP 的前提。addresses填你选好的静态地址注意带上/24掩码光写 IP 不写掩码会报错。gateway4填网关。nameservers填 DNS我给了国内常用的两个公共 DNS你可以换成公司内网 DNS。注意从较新的 netplan 版本开始gateway4被标记为废弃推荐用routes写法。但 ubuntu 20.04 自带的 netplan 版本对gateway4支持良好用它是完全没问题的。如果你追求新写法可以改成routes: [{to: default, via: 192.168.159.2}]效果一样。3.4 应用配置并验证连通性配置写好后先别急着 apply用sudo netplan try更稳。它会先应用配置然后给你 120 秒确认如果网络不通时间一到会自动回滚。这是一个非常贴心的保险机制避免你 apply 之后 SSH 断了再也连不上只能删虚拟机重来。确认sudo netplan try显示 “Configuration accepted” 之后可以再执行一次sudo netplan apply让它永久生效。sudo netplan try # 确认键盘敲回车接受或者等待自动回滚 # 应用并验证 sudo netplan apply ip a show ens33 ip route ping -c 4 192.168.159.2 ping -c 4 223.5.5.5 ping -c 4 www.baidu.com验证要分层次做。ip a看 IP 是不是你写的那个ip route看默认路由是不是指向网关然后依次 ping 网关验证链路、ping 一个公网 IP验证 NAT 出网、ping 一个域名验证 DNS。三层都通说明配置完全正确。如果前两个通、域名不通那就是 DNS 的问题回看 nameservers 部分。如果网关都 ping 不通那问题在链路或网关地址抄错了。这种分层排查法能让你三分钟定位问题而不是瞎重启。3.5 配置 DNS 与 hosts 的小技巧DNS 这块我单独拎出来讲因为 ubuntu 20.04 的 DNS 解析链路有点绕。它默认装了systemd-resolved你的/etc/resolv.conf往往是一个指向/run/systemd/resolve/stub-resolv.conf的软链接直接改它没用重启就丢。正确做法就是在 netplan 里写nameservers让 netplan 把 DNS 推给 systemd-resolved。想确认当前生效的 DNS用resolvectl status或者systemd-resolve --status看那个 “DNS Servers” 一行是不是你配的。另一个提升开发效率的小技巧是配 hosts。如果你经常用主机名访问虚拟机上的服务比如dev.local可以在虚拟机里也配一份/etc/hosts把192.168.159.10 dev.local写进去。这样本机解析走 hosts不依赖 DNS 服务器响应更快。反过来如果你想让宿主机也能用主机名访问虚拟机那就去改宿主机的 hosts 文件指向这个静态 IP配合后面要讲的端口转发体验非常丝滑。4. 配置后经常翻车的几个地方与排查手法配置本身真的不难难的是那些“配完之后出问题”的场景。这一节我按我遇到过的高频故障来组织每一个都给出排查思路和解决办法。这些都是网上教程很少展开、但实战里几乎必遇的坑。4.1 重启后配置消失netplan 文件权限与 YAML 缩进“ubuntu 配置静态 IP 后重启配置没有了”是搜索频率极高的问题我遇到过好几次原因基本锁定在三个点上。第一YAML 缩进错误。用 Tab 缩进、冒号后面没空格、层级对不齐都会让 netplan 解析失败但有时它不报错直接忽略你的配置回退到别的来源表现就是重启后 IP 变回去了。解决办法是用sudo netplan generate或者sudo netplan try检查语法它会明确指出哪一行有问题。第二个原因是存在多个 netplan 配置文件冲突。如果你既改了 01 又新建了 99两个文件描述同一块网卡行为就很不可预测。原则是保持只有一个文件描述你的业务网卡。第三个原因是文件权限。netplan 出于安全考虑会拒绝权限过松的配置文件尤其是/etc/netplan/*.yaml如果被设成了 777 这种它会警告甚至不加载。正确权限是 600 或 644文件属主是 root。执行sudo chmod 600 /etc/netplan/xxx.yaml修一下就行。还有一个隐蔽情况桌面版 NetworkManager 会接管网卡如果你在图形界面里也手动设过静态 IP可能跟 netplan 打架这种时候去图形界面的网络设置里把它恢复成自动DHCP交给 netplan 管。4.2 有 IP 但上不了网网关、NAT 服务与转发另一种典型症状是ip a能看到你要的静态 IP但 ping 网关通、ping 外网不通。这基本是 NAT 出网环节的问题。先确认网关地址是不是抄对了——很多人把子网 IP 当成网关写成 192.168.159.0那是网络号不是网关肯定不通。网关应该是 .2。其次检查 VMware 的 NAT 服务是否正常运行Windows 下可以在服务管理器里找 VMware NAT Service 和 VMware DHCP Service确保它们在运行状态。这两个服务挂了NAT 直接失效。再有一种情况是宿主机自身的网络出问题了。因为 NAT 是靠宿主机转发出去的如果宿主机本身没联网虚拟机自然也出不去。还有一种容易被忽略的宿主机装了某些安全软件或者系统防火墙拦截了 VMnet8 的转发流量。这种情况可以在宿主机上临时关闭防火墙测试如果通了说明是防火墙策略问题需要放行 VMware 的相关进程。我给的建议是排查时按“虚拟机内 → 网关 → 宿主机 → 外网”的顺序一层层验证别一上来就怀疑最复杂的东西。4.3 宿主机访问虚拟机、SSH 连接异常NAT 模式下宿主机访问虚拟机相对简单因为宿主机和虚拟机在同一个 VMnet8 网络上直接用虚拟机静态 IP 就能 ping 通、SSH 上去。如果连不上先看虚拟机里的防火墙。ubuntu 20.04 默认没装 ufw 的启用规则但如果你启用了得放行 22 端口sudo ufw allow 22。其次确认 ssh 服务装了没sudo apt install openssh-server并sudo systemctl enable --now ssh。如果你需要从局域网其他机器访问这个虚拟机就得用端口转发。在虚拟网络编辑器里选 VMnet8点“NAT 设置”→“添加”把宿主机的某个端口比如 2222映射到虚拟机的 192.168.159.10:22。之后局域网内其他机器用ssh -p 2222 宿主机IP就能连进来。这个功能很好用配置也不算复杂代价是端口冲突要自己规划好。我一般预留 2200 段专门给虚拟机的 SSH 转发避免跟宿主机上的服务撞端口。4.4 常见问题速查表把高频问题整理成一张表遇到问题先查表能省不少时间。症状可能原因快速排查解决办法重启后 IP 变回 DHCPYAML 语法错、权限不对、文件冲突sudo netplan generate看报错修缩进、chmod 600、合并文件有 IP 但 ping 不通网关网关地址抄错对比虚拟网络编辑器改成正确的 .2 网关ping 网关通、外网不通NAT 服务未运行、宿主机断网查 VMware 服务状态启动 NAT/DHCP 服务域名解析失败DNS 未生效resolvectl status在 netplan 里补 nameservers宿主机连不上虚拟机虚拟机防火墙、sshd 未启动虚拟机内ss -tlnp看 22放行端口、装 openssh-server局域网访问不到NAT 隔离需端口转发虚拟网络编辑器端口映射添加宿主机端口 → 虚拟机端口网络时通时断网段与其他软件冲突查 Docker、其他虚拟化软件换一个不冲突的网段netplan apply报错YAML 缩进用了 Tab看报错行号改用空格缩进5. 进阶玩法与长期维护配置只是起点怎么让这套静态 IP 方案长期稳定、易维护才是真正体现经验的地方。这一节分享几个我常用的进阶技巧。5.1 用 VMware 的 DHCP 保留代替手工写死如果你不想动虚拟机内部的配置其实还有一条路子在 VMware 的 DHCP 设置里做“MAC 地址到 IP 的绑定”。选中 VMnet8点 DHCP 设置在列表里添加一条把虚拟机的 MAC 地址绑定到一个固定的 IP。这样虚拟机继续用 DHCP但每次拿到的都是同一个地址。好处是虚拟机内部零改动坏处是依赖 DHCP 服务且一旦 MAC 变化比如克隆或者重建网卡绑定就失效。我的做法是两者结合正式环境用 netplan 写死临时环境用 DHCP 保留各取所需。5.2 多台虚拟机批量固定 IP 的思路当你手上有十几台虚拟机的时候手工一台台改就是灾难。这时候思路是模板化 脚本化。先做一台“黄金镜像”配好静态 IP 框架然后把地址部分抽出来做成变量。克隆出新的虚拟机后用一段小脚本自动改网卡名对应的 YAML 地址、改主机名、重启网络。伪代码大概长这样#!/bin/bash # 用法./set-ip.sh 10 newhostname IP_SUFFIX$1 HOSTNAME_NEW$2 cat /etc/netplan/01-netcfg.yaml EOF network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.159.${IP_SUFFIX}/24 gateway4: 192.168.159.2 nameservers: addresses: [223.5.5.5, 114.114.114.114] EOF chmod 600 /etc/netplan/01-netcfg.yaml hostnamectl set-hostname ${HOSTNAME_NEW} netplan apply echo 已设置 IP: 192.168.159.${IP_SUFFIX}, 主机名: ${HOSTNAME_NEW}这个脚本的思路是把“变的部分”IP 尾号、主机名参数化不变的框架固化。配合前面的地址规划表克隆完跑一下脚本新机器就上线了。注意克隆之后 MAC 地址和 machine-id 会重复建议先清理一下再配 IP避免各种诡异问题。5.3 快照、克隆与 IP 冲突最后说一个特别容易被忽略的坑克隆虚拟机导致的 IP 冲突。当你用 VMware 克隆一台已经配好静态 IP 的机器时克隆出来的机器会带着原机器的静态 IP两台机器同 IP网络直接乱套表现为时通时断、随机丢包。解决办法很简单克隆之前把源机器的网卡配置清一下或者克隆之后立刻改 IP 再启动网络。另外一个好习惯是每次做完重要变更比如刚配好静态 IP就打一个快照起个名字叫“静态IP已配置-20240101”之类出问题一键回滚。我用快照救回过好几次被自己改崩的环境成本几乎为零收益巨大。还有一个小细节VMware 克隆时如果选择“创建完整克隆”会重新生成 MAC 地址但 machine-id 和 netplan 配置里的 IP 不会变所以 IP 冲突和主机名冲突都要手动处理。养成“克隆后先断网、改完配置再联网”的习惯能避免很多莫名其妙的问题。6. 一些实操心得与备份建议写了这么多技术细节最后分享点我个人的使用体会。netplan 这套东西虽然一开始看着别扭但它有个巨大的好处配置文件是声明式的写得清清楚楚不像以前 centos 那种改一堆 ifcfg 文件还得记各种参数。只要你把网段、网关、DNS 这三个源头参数搞清楚剩下就是填空。我现在配一台新机器基本五分钟搞定靠的就是这套固定流程抄参数、看网卡名、套模板、netplan try、分层验证。另外强烈建议大家养成两个习惯。第一改网络配置前一定备份原文件我在 3.3 节里提到的备份命令不是走过场是真的能救命。第二配置完成后把关键参数网段、网关、静态 IP、DNS记到一个文档里哪怕就是一个文本文件放在桌面。虚拟机多了以后没有这张“账本”你自己都会忘哪台机器用了哪个 IP。这些年在网络配置上踩的坑一大半都不是技术难而是信息没记录、参数抄错、状态没同步这类低级的细节问题。对了如果你是在公司环境里做这套配置动手前最好跟网络管理员对一下网段规划避免跟公司内网冲突。虽然 NAT 是封闭的但万一你手贱改成桥接或者网段撞了还是会影响别人。安全第一稳妥配置这才是长期运维的正道。