
在VMware里装Ubuntu Server最让新手头疼的一件事就是IP地址总在变。今天明明是192.168.1.100明天重启虚拟机一看怎么变成192.168.1.132了如果你在跑数据库、搭集群、配考试环境或者做远程部署这种“灵异漂移”分分钟让你心态爆炸。这篇文章我不讲那些花里胡哨的理论就围绕“VMware下Ubuntu Server改固定IP”这件事把网络模式怎么选、netplan怎么写、为什么会翻车、翻车了怎么救一次性讲透。没有废话全是实操。不管你是刚接触Linux的学生还是在机房部署考试机的运维这篇都能直接拿来当手册用。1. 动手前的逻辑框架固定IP方案的三个前置问题很多人一上来就打开终端改配置结果越改越乱。其实在动手之前只要想清楚三个问题后面的操作就是水到渠成的事情你用的是VMware的哪种网络模式系统里的网络管理工具到底是谁在接管网卡你想要的“固定IP”是只在内网固定还是需要和宿主机同一局域网互通这三个问题搞不明白配置写得再漂亮重启之后照样翻车。1.1 三种网络模式不搞懂后面配置全是瞎忙VMware Workstation或者Fusion里新建虚拟机时会让你选网络模式常见的就是NAT、桥接、仅主机这老三样。很多人直接一路点“下一步”用了默认的NAT后来又在里面折腾固定IP结果各种连不上。这里简单说清楚三者的区别。NAT模式下虚拟机不是直接暴露在物理局域网里的它躲在宿主机后面通过宿主机共享IP上网。VMware会虚拟出一个私有网段比如192.168.100.0/24虚拟机的网关就是这个网段的.2或.1DNS可以指向宿主机或者公网DNS。这种模式的好处是宿主机网络环境怎么变虚拟机都不受影响坏处是外部设备没法直接访问虚拟机除非你做端口映射。桥接模式就不一样了虚拟机直接“插”到物理局域网里相当于一台独立的机器。它需要和宿主机在同一个网段有自己的局域网IP。这种模式最适合“考试机与管理机处于同一局域网内”这种场景也适合你在家里把虚拟机当成局域网里的一台真机来用。仅主机模式则是完全封闭的只有宿主机和虚拟机之间能通信虚拟机不能访问外网。这个一般用于内网隔离实验现实中用得少但一旦用到就很讲究因为它的“固定IP”逻辑和前面两种完全不同。1.2 为什么明明配了静态IP系统还是显示“自动分配”打开网卡信息看到的还是DHCP分配的地址或者你手动指定了地址可系统根本没理你。这是我被问得最多的问题本质上是两套甚至三套网络配置体系在打架。Ubuntu Server从18.04开始默认用netplan来管理网络配置。netplan本身不是直接控制网卡的它更像一个翻译官把YAML格式的配置翻译给底层网络服务去执行。在Ubuntu Server上这个底层服务通常是systemd-networkd。但是如果你装的是Ubuntu桌面版或者你手动装过NetworkManager情况就复杂了——NetworkManager会抢着接管网卡netplan配置得再好也可能被覆盖。还有一类很隐蔽的情况你在VMware的NAT模式下虚拟机的DHCP还在运行你虽然把netplan改成了静态但由于配置文件格式错误、缩进不对、或者最后没有执行sudo netplan apply配置根本没生效。等下次重启系统又回到自动获取看起来就像“固定IP被识别为自动分配”了。后面我专门有一节讲这个坑怎么排查。2. 对症下药不同场景下的固定IP配置思路明白三种网络模式之后接下来就看你的实际使用场景。不同场景固定IP的目标网段、网关、DNS完全不一样先想清楚再动手可以省掉大量返工时间。2.1 场景一NAT模式下适合本机开发测试的固定IP如果你只是在自己电脑上开个虚拟机做测试不需要其他局域网设备访问它那NAT模式就够用了。这种情况下配固定IP网络参数反而特别简单子网掩码看VMware里这个虚拟网段的定义网关就是VMware NAT服务给你的那个虚拟网关DNS通常可以直接用8.8.8.8或者114.114.114.114也可以填宿主机的局域网DNS问题都不大。NAT模式下固定IP最关键的一点是要让VMware的DHCP地址池不要跟你的静态IP冲突。比如VMware的NAT网段是192.168.100.0/24DHCP默认分配的起止范围可能从128到254那你就配一个192.168.100.10这种靠前的地址一般不会冲突。更稳妥的办法是打开VMware的“虚拟网络编辑器”把DHCP地址池范围缩小或者直接勾选“使用本地DHCP服务”但把范围限制在很小一段这样静态IP空间就完全由你支配了。2.2 场景二桥接模式下让虚拟机成为局域网里的“正式成员”如果你要让宿主机之外的其他设备也能直接访问虚拟机或者模拟考试机和管理机处于同一局域网的环境就得用桥接模式。这种模式下的固定IP参数需要完全按照物理局域网来规划先去宿主机上执行ipconfigWindows或者ip addrLinux/macOS看看当前局域网的IP网段、掩码、网关是多少。比如宿主机是192.168.1.50掩码255.255.255.0网关192.168.1.1那虚拟机就可以配192.168.1.100掩码同样是255.255.255.0写上24即可网关也是192.168.1.1。DNS可以填局域网网关也可以填公共DNS。这里有个小坑Windows宿主机如果用无线网卡上网桥接后虚拟机的网络稳定性取决于无线网卡驱动有时候会出现“能ping通网关但上不了外网”的怪问题后面排查章节我再展开。2.3 场景三仅主机模式适合做隔离网络实验仅主机模式下虚拟机只能和宿主机通信网段是VMware单独划出来的一个私有网段。这种模式配置固定IP的思路类似NAT但不设置网关或者说不依赖网关访问外网。如果你在这个模式里强行写一个公网DNS或者一个不存在的网关反而会导致某些服务启动缓慢。大多数情况下仅主机模式只用于实验模拟不太会作为生产环境的日常选择所以这篇文章不展开细讲但思路和netplan配置方法完全一致。3. 核心实操Ubuntu Server上netplan一步一步配到固定IP前面铺垫了那么多现在进入正题。下面以常见的Ubuntu 22.04/24.04 Server含live server安装版为例完整走一遍从查看网卡到验证固定IP的全过程。3.1 先看清网卡名、当前地址和路由别凭感觉下手登录Ubuntu Server后第一步不是急着编辑配置文件而是先看一眼当前的网络状态。执行ip addr你会看到类似这样的输出2: ens33: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.100.128/24 brd 192.168.100.255 scope global dynamic ens33 valid_lft 1734sec; preferred_lft 1734sec第一行里的ens33就是网卡名不同的虚拟机可能叫ens32、ens160、eth0等这个必须记下来。第三行的inet后面是当前IP地址注意后面的“dynamic”字样这就是“当前是DHCP获取”的标志。如果你在之后配置完静态地址再执行ip addr发现依然有dynamic标志那就说明配置没生效排查方向就有了。执行ip route看默认路由通常长这样default via 192.168.100.2 dev ens33 proto dhcp src 192.168.100.128 metric 100这条信息告诉你当前网关是192.168.100.2。在NAT模式下这个网关一般就是VMware虚拟网关在桥接模式下它应该是你家路由器的地址。记住这个数值后面要填到配置文件里。3.2 先备份配置再编辑netplan文件Ubuntu Server的netplan配置文件一般位于/etc/netplan/目录下文件名常见的有00-installer-config.yaml、50-cloud-init.yaml等。先执行sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak做个备份然后sudo nano /etc/netplan/00-installer-config.yaml打开文件。典型安装完的默认配置是这样network: version: 2 ethernets: ens33: dhcp4: true把这个文件改成下面这样就以NAT模式为例把IP固定到192.168.100.10network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.100.10/24 routes: - to: default via: 192.168.100.2 nameservers: addresses: - 8.8.8.8 - 114.114.114.114如果是桥接模式假设局域网网关是192.168.1.1你想把虚拟机固定为192.168.1.100那routes里的via改成192.168.1.1addresses里的地址改成192.168.1.100/24即可。注意YAML格式的缩进这个文件对空格极其敏感一个缩进错误就会导致配置无法解析。field名字缩进两格列表项前面要有“- ”冒号后面必须有空格这些细节都能让你“一步错步步错”。3.3 DNS和网关参数怎么填才不容易出问题很多人配完静态IP发现内网能通、外网不通十有八九是DNS没写好。其实DNS的填法也是有讲究的NAT模式下你既可以填8.8.8.8这种公网DNS也可以填宿主机的局域网DNS。但如果你所在网络环境有内网域名解析需求比如公司内部系统、校园网那就必须填内网DNS否则虚拟机能上外网却解析不了内网主机名连数据库都连不上。网关参数则要严格区分模式。NAT模式的网关通常是VMware虚拟网络编辑器里看到的那个地址很多默认是x.x.x.2桥接模式的网关就是你家里或公司路由器的LAN地址。这里有个容易犯的错误有人把NAT模式的网关写成宿主机的IP结果IP通了但出不了网因为虚拟机的数据包根本没发到真正的虚拟网关上。如果你的环境是仅主机模式那routes这段可以直接删掉不需要默认网关。3.4 让配置生效与验证用netplan try而不是直接apply配置文件保存后先别急着用sudo netplan apply。更稳妥的做法是先执行sudo netplan try系统会先试着应用配置然后等待你确认。如果你发现IP没有按预期生效甚至SSH掉线了只要你不在120秒内按回车确认它会自动回滚到之前的配置这个机制对远程操作特别友好。等到确认无误再真正执行sudo netplan apply让它一次性生效。验证固定IP是否生效主要看三件事。第一ip addr看网卡IP是不是你设置的静态地址dynamic字样应该消失了。第二ip route看默认网关是不是对的。第三ping网关、ping外网域名比如ping baidu.com依次排查链路是否畅通。如果ping网关通了但ping外网不通重点检查DNS。如果ping网关都不通检查网段掩码是不是和网关匹配。4. 踩坑实录固定IP翻车的典型症状与排查思路配置静态IP这件事正常情况几分钟就搞定但翻车现场永远是千奇百怪的。我把自己在实际操作中遇到过的、以及帮别人排查过的典型问题整理成清单按症状、原因、解法写清楚你照着对应排查就行。4.1 症状一配完就断网连SSH都连不上这个基本上是压死新手的最后一根稻草。大多数情况是网关填错了或者网段掩码写错了。比如NAT模式下填了桥接模式的网关或者掩码写成/16导致路由表混乱。还有一种情况是忘了把dhcp4关掉导致系统和DHCP服务来回抢地址。排查方法如果SSH断了直接到VMware的虚拟机控制台用物理终端操作。执行ip addr看当前地址执行ip route看路由表和配置对比看有没有明显错位。实在不行就恢复备份的配置文件回到自动获取再说。这里给一个通用铁律如果配置不熟悉永远保存一份备份永远先用netplan try永远不要在没有控制台访问权限的情况下强行netplan apply。4.2 症状二配置都对了但系统还是从DHCP拿地址这通常是“两个网络管理服务打架”的结果。前面说过netplan只是上层翻译真正干活的是systemd-networkd或NetworkManager。如果你装的是Ubuntu桌面版或者Server版里手动装了NetworkManagerNetworkManager会优先接管网卡netplan配得再好它也会按自己的规则来。判断方法执行systemctl status NetworkManager看它是不是active。如果是你可以选择把NetworkManager停掉并禁用让systemd-networkd来接管systemctl stop NetworkManager systemctl disable NetworkManager。或者反过来不用netplan直接在NetworkManager的图形界面或nmcli里配置静态IP。两者用其一别让它俩同时管同一块网卡。还有一个隐蔽原因用户配好了netplan但配置文件里改了网卡名而文件里的网卡名是网卡的MAC地址对应的名字换了硬件比如VMware里改动了网卡类型后就匹配不上了配置自然失效。拿ip addr看当前实际网卡名再和配置文件里的名字对一下。4.3 症状三重启之后IP又变回原来的DHCP地址这比“完全不动”更令人抓狂——明明当场生效了重启就原形毕露。大概率是配置解析成功了但在启动过程中网络服务被其他服务延迟接管或者netplan配置文件权限不对导致systemd-networkd没有读取到。排查思路如下。先检查配置文件的权限netplan要求YAML文件权限不能太开放通常建议sudo chmod 600 /etc/netplan/00-installer-config.yaml。执行sudo netplan generate看看有没有报错再执行networkctl status看网卡当前是由哪个网络服务管理的是不是systemd-networkd。如果是NetworkManager接管直接把NetworkManager按前面提到的方法关掉让netplan接管到底。还有一种可能是你在VMware的虚拟机设置里把网卡类型改了。比如以前是e1000后面改成vmxnet3网卡名会变配置里写的旧网卡名对不上。这种情况在VMware里很常见尤其在克隆虚拟机之后。所以每次克隆或迁移之后先看看这个配置文件的网卡名是否还靠谱。4.4 四种症状的速查对照表症状优先排查方向快速解法配置完立即断网网关/掩码写错dhcp4未禁用控制台改成自动获取重新核对参数配置生效但外网不通DNS配置问题或桥接网线不通先ping网关再ping域名分步定位系统还是显示DHCP地址NetworkManager抢占接管停用NetworkManager让netplan接管重启后又变回自动分配netplan未真正生效、网卡名不匹配检查文件权限、网卡名、服务状态这个表格你可以截图存下来以后排查的时候直接对号入座。说实话网络问题90%都是“参数不对、服务打架、名字写错”这三类原因把基础逻辑理清了解决起来就不会慌。5. 几个长期用得上的实操小技巧最后分享几个我这几年在VMware里折腾Ubuntu Server时养成的小习惯不一定都写在文档里但非常管用。5.1 用sudo netplan try代替sudo netplan apply这个前面已经提过但还是值得单独强调一次。try模式会自动回滚的特性在远程管理服务器时相当于一个“后悔药”。如果你是通过SSH远程配置的尤其要养成这个习惯不然一个手误远程连接直接断掉你还得跑到机房或者虚拟机控制台去操作非常被动。apply之前先try确认无误再apply这是刻进骨子里的肌肉记忆。5.2 把VMware的DHCP地址池缩到最小或者干脆关掉NAT模式下就算你在Ubuntu里配置了静态IPVMware自带的DHCP服务还是会在那里跑着。如果你给虚拟机配的静态IP落在DHCP地址池的范围内偶尔还是会碰上地址冲突。我个人习惯是打开“编辑”-“虚拟网络编辑器”选中NAT模式对应的VMnet然后打开“DHCP设置”把地址池的起始地址和结束地址改成特别小的范围比如192.168.100.200到192.168.100.254把前面的地址全部留给静态分配。这样既保留了DHCP应急通道又能避免和静态IP冲突两全其美。5.3 快速查看宿主机网络参数的办法这招在桥接模式尤其好用。Windows上打开命令行执行ipconfig找“以太网适配器”或“无线局域网适配器”对应的IPv4地址、子网掩码、默认网关macOS/Linux上执行ip addr。很多人纠结虚拟机桥接该填什么网段其实答案就在宿主机网卡上先看宿主机再配虚拟机思路一下就清晰了。记住是看正在上网的那块网卡的参数不是虚拟机网卡VMnet8、VMnet1那些的参数。5.4 如果彻底改乱了怎么快速恢复干净环境假设你已经在虚拟机里把网络配置改得面目全非连恢复备份都懒得搞了最粗暴的办法是在VMware里把这个虚拟机的网卡改为“NAT模式”同时把物理网络连接设为“自动获取”Ubuntu里恢复默认配置重新生成netplan配置或者用cloud-init重置基本都能救回来。如果连系统网络服务都起不来的话还可以启动时进恢复模式GRUB里选Advanced options - recovery mode在root shell里修复配置文件或者重新生成netplan初始配置。实在不行就直接用Ubuntu安装镜像的live环境挂载磁盘进去改文件这招虽然笨但绝对有效。固定IP这件事表面上是一个配置文件的问题背后其实是“理解网络模式、理解系统的网络管理机制、理解每个参数的含义”。我在实际使用中最大的体会是把这个技能练好不仅是在VMware里受益后面不管是做集群、搭服务、还是部署到真正的物理服务器这些经验都能直接迁移过去。整理完这篇实操记录我也顺手把自己常用的一台Ubuntu Server虚拟机重新规整了一遍把以前遗留的DHCP残留问题彻底清掉了。如果你也在跟VMware和Ubuntu Server打交道希望这些内容能帮你少走几段弯路。