先说个我自己的数字:这几年帮人看虚拟机断网的问题,前前后后大概处理过两百多台机器,其中真正属于“VMware 本身坏了”的,不到一成。剩下九成,要么是把三种网络模式的适用场景搞混了,要么是宿主机那边某个服务悄悄没起来,要么是虚拟机里网卡配置文件和虚拟网络对不上。VMware Workstation 虚拟机连不上网,表现出来的症状高度相似——浏览器转圈、ping 不通、图标显示已连接却没有流量,但根因分布在完全不同的层级上。桥接、NAT、仅主机这三种网络模式,各自有一套独立的“物理结构”,你不搞清楚数据包从虚拟机网卡出来之后走了哪条路,就只能靠重启和瞎猜。
这篇内容面向的是手上正在跑 Workstation、被虚拟机网络折腾过或者即将被折腾的人。不管你是刚装完虚拟机发现打不开网页的新手,还是带过实验环境、想系统性梳理一遍排查路径的老手,下面这套从模式原理到命令验证、再到配置文件落地的完整流程,都可以直接照着走。我会把三种模式各自的高频故障拆开讲,给出可直接复制的配置片段,也把那些官方文档里不会写、但实操中一定会撞上的坑摆出来。
1. 先搞清楚三种网络模式各自在管什么
1.1 虚拟交换机与虚拟网卡:Workstation 在宿主机里建的那张隐形网络
装完 Workstation,很多人只注意到多出来两个“未识别的网络”,却不知道这两个东西是整个虚拟网络的地基。Workstation 在宿主机里抽象出了一层虚拟交换机,编号从 VMnet0 到 VMnet19,其中三个是出厂就配好的:VMnet0 负责桥接,VMnet1 负责仅主机,VMnet8 负责 NAT。宿主机上的“网络连接”里能看到的那两张虚拟网卡,就是 VMnet1 和 VMnet8 的落地实体,它们各自带着一个 IP 地址,这个地址不是随便给的,它就是虚拟机眼中的“网关”。
理解这一点极其关键,因为它决定了排查的方向。虚拟机 ping 不通外网,第一步不是去虚拟机里改 DNS,而是先看宿主机上 VMnet8 那张网卡有没有地址、有没有被禁用、有没有被安全软件拦掉。我见过太多人一头扎进虚拟机里改配置,改了两小时,最后发现是宿主机上 VMnet8 的 IP 变成了 169.254 开头的自动私有地址,虚拟网络的地基塌了,上面怎么修都是白搭。
顺带说一个容易被忽略的点:VMnet0 在宿主机上是没有对应网卡的。桥接模式不需要 Workstation 在宿主机上占一个 IP,它做的事情是把虚拟机的网卡“挂”到物理网卡上,让虚拟机的帧直接从物理网卡发出去。所以你在宿主机网络连接里永远找不到 VMnet0,这不代表它不存在,只是它没有实体。
1.2 桥接模式:让虚拟机成为局域网里的另一个邻居
桥接模式的本质,是让虚拟机绕过宿主机,直接接入宿主机所在的那个物理局域网。虚拟机会像一台新插上网线的电脑一样,向路由器或 DHCP 服务器要地址,拿到的 IP 和宿主机在同一网段,网关也是同一个。局域网里的其他机器能直接访问它,它也能直接被访问,彼此完全平级。
这个模式的优点是拓扑简单、双向可达、不需要额外映射,做集群实验、搭多机服务、模拟真实网络环境时特别顺手。缺点也同样明显:它完全依赖物理网络的环境。路由器 DHCP 地址池满了,虚拟机就拿不到地址;办公网络做了端口安全或者 MAC 地址数量限制,虚拟机会被直接掐掉;更常见的是无线网卡,大量无线驱动并不支持在一张网卡上承载多个 MAC 地址,桥接过去之后虚拟机要么拿不到 IP,要么拿到 IP 但丢包严重。
这里有个实操判断标准,值得记一下:如果你的宿主机是连着 WiFi 的,桥接出问题的概率会显著高于有线连接。这不是 Workstation 的锅,是无线链路本身的工作机制决定的。所以只要我确认用户是笔记本、走的是无线,桥接出问题时我一般不会花时间去深挖,直接建议换 NAT,性价比高得多。
1.3 NAT 模式:虚拟机藏在宿主机身后,用一个独立子网
NAT 模式是 Workstation 默认给新建虚拟机的模式,也是绝大多数场景下的最优解。它让虚拟机待在一个完全独立的子网里,默认是 192.168.x.0/24 这种私有网段,VMnet8 这张虚拟网卡充当这个子网的网关,虚拟机所有的出网流量都交给宿主机的 NAT 服务做地址转换,再以宿主机的身份发出去。
这个设计带来一个巨大的好处:虚拟机的网络跟宿主机的上网方式解耦了。你今天在公司连有线,明天回家连 WiFi,后天在咖啡厅连热点,只要宿主机能上网,NAT 模式下的虚拟机就能上网,一次都不用改配置。这也是我给别人推荐虚拟机网络方案时的第一选择——除非有明确的“局域网内其他设备要访问虚拟机”的需求,否则没必要上桥接。
代价是单向可达。外部网络想主动连虚拟机,默认是连不上的,得在虚拟网络编辑器里配端口映射,把宿主机的某个端口转发到虚拟机的某个端口上。做 Web 服务调试的时候这一步免不了,但配置本身不复杂,后面会给具体参数。
1.4 仅主机模式:一个只跟宿主机说话的封闭网络
仅主机模式的边界画得很死:虚拟机和宿主机之间能通,虚拟机之间能通,但出不了这个圈子,因为 VMnet1 这张虚拟网卡没有连接到任何物理网络,也没有 NAT 服务给它做转换。默认网段同样是一个独立的私有网段,网关地址就是 VMnet1 在宿主机上的那个 IP。
这个模式最容易被误判成故障。我遇到过不止一次,有人在虚拟网络编辑器里顺手选了“仅主机”,然后发现虚拟机打不开网页,折腾半天以为是 DNS 配错了。实际上它从设计上就不该能上网,这是个功能,不是 bug。仅主机模式的正确用途是做隔离实验,比如测试内网服务、验证主机与虚拟机之间的通信、跑一些不希望暴露到局域网的靶场环境。
1.5 三种模式的横向对照与选型建议
把三种模式放在一张表里对比,选型的时候能省很多事。下面这张表里的默认网段只是出厂值,实际可能被改过,具体以虚拟网络编辑器里显示的为准。
| 对比项 | 桥接模式 | NAT 模式 | 仅主机模式 |
|---|---|---|---|
| 使用的虚拟交换机 | VMnet0 | VMnet8 | VMnet1 |
| 宿主机上是否有对应网卡 | 无 | 有 | 有 |
| 虚拟机 IP 来源 | 物理网络的 DHCP 或手工静态 | VMware DHCP 服务或手工静态 | VMware DHCP 服务或手工静态 |
| 能否访问外网 | 能(依赖物理网络) | 能(依赖宿主机转发) | 不能 |
| 局域网其他设备能否访问虚拟机 | 能 | 默认不能,需端口映射 | 不能 |
| 换网络环境后是否需要重新配置 | 需要 | 不需要 | 不需要 |
| 典型使用场景 | 多机组网实验、模拟真实拓扑 | 日常开发调试、装软件、查资料 | 隔离测试、主机与虚拟机互通验证 |
| 最高频故障原因 | 无线网卡不支持、DHCP 池耗尽、IP 冲突 | VMnet8 异常、NAT 服务未启动、地址池与网关不匹配 | 误以为应该能上网 |
选型上我的判断逻辑很简单:问自己一句“有没有别的设备需要主动连这台虚拟机”。有,选桥接,并且优先用有线;没有,无脑选 NAT。仅主机模式只在明确需要隔离的时候用,别拿它当默认。
2. 动手之前,先把问题压缩到具体某一层
2.1 三句话分清“完全没链路”和“链路通但出不去”
排查网络问题最忌讳一上来就乱改配置。我习惯先用三句话把问题定性,这三句话对应三个不同的层级,走完基本就能锁定范围。
第一句:虚拟机里的网卡图标是不是显示“已连接”。如果显示断开或者红叉,问题在链路层,说明虚拟机和虚拟交换机之间没搭上,这时候查 IP 配置全是无用功。第二句:网卡有没有拿到一个正常的 IP 地址。如果拿到的是 169.254 开头的地址,说明 DHCP 请求发出去了但没人应答,问题在地址分配层。第三句:能不能 ping 通网关,能不能 ping 通外部的公网地址。能通网关不通外网,问题在转发或 DNS;网关都不通,问题在虚拟网络的网关配置上。
这三句话看起来朴素,但它把排查范围从“网络有问题”这种模糊描述,压缩到了具体某一层。我处理过的案例里,只要老实走完这三步,八成的问题当场就能定位,剩下两成才是真正需要翻配置文件的。
2.2 四条命令把问题钉死在具体环节
定性之后就要用命令取证。虚拟机是 Linux 的话,四条命令足够;是 Windows 的话,对应的图形界面和命令行也能对上。下面这张表是我自己常用的取证清单,从左到右就是执行顺序。
| 目的 | Linux 命令 | Windows 命令 | 判读要点 |
|---|---|---|---|
| 看网卡有没有起来、有没有地址 | ip addr | ipconfig /all | 关注 state UP 和 inet 后面的地址,169.254 开头即为未获取到 |
| 看默认路由指向哪里 | ip route | route print | 有没有 default via,网关地址是否等于虚拟网络编辑器里的网关 |
| 测网关可达性 | ping -c 4 <网关IP> | ping <网关IP> | 不通说明二层到三层之间断了 |
| 测外网与域名解析 | ping -c 4 8.8.8.8与ping -c 4 example.com | 同左 | IP 通但域名不通,问题在 DNS |
这个顺序不能反。先看地址再看路由,先测网关再测外网,每一步都能排除掉一批可能性。举个最常见的判读:ip addr显示有 192.168.x.x 的地址,ip route里有 default via 192.168.x.2,ping 网关通,ping 8.8.8.8 不通——这个组合说明虚拟机和网关之间的链路、地址、路由全都正常,问题出在网关往外转发的环节,也就是宿主机的 NAT 服务或者宿主机自身的网络。这时候去虚拟机里改 DNS 是南辕北辙。
2.3 宿主机这一侧的四个检查点
虚拟机的网络能不能出去,宿主机这边至少有四个地方会使绊子,而且这四处的问题在虚拟机里完全看不出来,只能回到宿主机上查。
第一个是 VMware 的相关服务。Windows 下按 Win+R 输入services.msc,找到名字里带 VMware 的几个服务,重点看 VMware Authorization Service、VMware DHCP Service、VMware NAT Service 这三个是不是处于“正在运行”。DHCP 服务停了,NAT 模式下的虚拟机就永远拿不到地址;NAT 服务停了,虚拟机有地址也出不去。Linux 宿主机上对应的服务名是vmware-networks,用systemctl status vmware-networks看状态。
第二个是虚拟网卡本身。宿主机网络连接里,VMnet1 和 VMnet8 有没有被禁用,图标上有没有黄色感叹号。设备管理器里如果这两张网卡显示异常,右键禁用再启用往往能救回来;还不行就卸载掉,然后在虚拟网络编辑器里点一次“还原默认设置”让它重建。
第三个是安全软件。部分安全软件会把新建的虚拟网卡识别成异常网络接口,直接拦掉它的流量,或者把 VMware 的 NAT 进程当成可疑程序限制。判断方法很直接:临时关掉安全软件的防护再测一次,通了就说明是它干的,去加白名单而不是长期关防护。
第四个是宿主机的网络位置类型。Windows 把新网络默认识别成“公用网络”时,防火墙策略会更严格,某些情况下会影响虚拟网络的转发。把 VMnet8 对应的网络位置改成“专用”,能规避掉一部分莫名其妙的问题。
3. 三种模式的完整排查与修复流程
3.1 桥接模式:拿不到 IP 与 IP 冲突的两套处理路径
桥接模式最常见的症状是虚拟机拿到 169.254 开头的地址,或者干脆显示“无 Internet 访问”。根本原因通常有三个:无线网卡不支持多 MAC、物理网络没有可分配的地址、以及桥接的目标网卡选错了。
第一个原因在前面提过,无线驱动对多 MAC 的支持参差不齐,这种情况没有太好的绕法,换 NAT 是最省事的。第二个原因需要确认一下物理网络:宿主机自己是不是正常上网的,路由器的 DHCP 地址池是不是已经满了(有些家用路由器默认只给 50 个地址,实验环境开十几台虚拟机加上手机平板很容易占满)。第三个原因最隐蔽,虚拟网络编辑器里桥接模式默认选的是“自动”,它会自己挑一张当前有连接的物理网卡,但笔记本上往往同时存在有线、无线、甚至虚拟网卡,自动选择经常挑错。
处理方法是在虚拟网络编辑器里把桥接目标从“自动”改成明确指定的那张物理网卡。改完之后虚拟机里的网卡需要重新获取地址,Linux 下执行sudo dhclient -r && sudo dhclient,Windows 下执行ipconfig /release再ipconfig /renew。
另一个高频问题是 IP 冲突。有些人在桥接模式下给虚拟机手工配了静态 IP,图省事直接抄了宿主机的地址,或者抄了同网段里已经存在的地址,结果就是宿主机和虚拟机互相抢,两边都时通时断。桥接模式下配静态 IP 的正确做法是:地址选在路由器 DHCP 地址池之外,比如池子是 192.168.1.100 到 192.168.1.200,那就把虚拟机定在 192.168.1.50 这类池外地址;子网掩码和网关跟宿主机保持一致;DNS 填路由器的地址或者公共 DNS。改之前先用ping把目标地址探一遍,确认没人占用。
3.2 NAT 模式:从 VMnet8 到地址池,一层层往下捋
NAT 模式的排查路径比桥接清晰,因为它完全在 Workstation 自己的闭环里,变量少。我通常按“虚拟网络编辑器配置 → 宿主机服务 → 虚拟机内配置”的顺序往下走。
先打开虚拟网络编辑器(需要管理员权限,这点很多人不知道,普通权限打开时部分选项是灰的)。选中 VMnet8,看三处配置:子网 IP 和子网掩码是否正常、NAT 设置里的网关地址是否与子网匹配、DHCP 设置里的地址池是否落在子网范围内且没有和网关冲突。这三处只要有一处被改歪了,虚拟机就会出现“有地址但出不去”或者“压根拿不到地址”。
一个很典型的错误配置是这样:有人把子网改成了 192.168.100.0,但 NAT 设置里的网关还留着 192.168.10.2,DHCP 地址池也还是老的 192.168.10.128 起始。这种配置下虚拟机拿到的地址和网关不在一个网段,路由直接失效。修复方法是在虚拟网络编辑器里点“还原默认设置”,让 Workstation 把三处配置重新对齐。还原之前记一下原来的网段,还原之后如果你之前给虚拟机配过静态 IP,需要跟着改。
第二层看服务。前面提过,VMware DHCP Service 和 VMware NAT Service 必须处于运行状态。这两个服务有时候会因为宿主机异常关机、或者安全软件干预而停掉,而且停掉之后不会自动恢复。手动启动一次,如果起来之后过一会儿又停了,基本可以断定是被安全软件或系统策略掐的,得去查拦截日志。
第三层才是虚拟机内部。NAT 模式下建议直接用 DHCP 自动获取,因为 VMware 的 DHCP 服务跟虚拟网络编辑器里的配置是联动的,你手工配静态地址反而容易和地址池打架。非要配静态的话,参数是这样:IP 选在地址池范围内但没被占用的地址(或者干脆选池外同网段的地址),子网掩码跟 VMnet8 一致,网关填 VMnet8 在宿主机上的那个 IP,DNS 填宿主机正在用的 DNS 或者公共 DNS。
需要外部访问虚拟机的时候,在虚拟网络编辑器的 NAT 设置里加端口映射。参数就四个:宿主机端口、虚拟机 IP、虚拟机端口、协议类型。比如要把宿主机的 8080 映射到虚拟机的 80,就是宿主机端口 8080、虚拟机地址填虚拟机实际拿到的那个、虚拟机端口 80、类型 TCP。映射加完之后,用宿主机的http://127.0.0.1:8080就能访问到虚拟机里的服务。
3.3 仅主机模式:先确认它本来就不该出网
仅主机模式的“故障”里,大概有七成是误判。虚拟机 ping 不通外网、打不开网页,但能 ping 通宿主机,这完全是正常表现,因为 VMnet1 没有连到任何物理网络。判断方法很直接:ip route里看默认路由,如果网关指向的是 VMnet1 的地址,那它本来就没打算出网。
真要让它出网,正规做法是切成 NAT 模式,在虚拟机设置里把网络适配器改成“NAT 模式”,然后在虚拟机里重新获取一次地址。有一种老办法是把宿主机的物理网卡做 Internet 连接共享,共享给 VMnet1,这样 VMnet1 的地址会被系统改成 192.168.137.1,虚拟机通过它出网。这个办法能通,但我不推荐:它会强制改掉 VMnet1 的网段,破坏原有的隔离实验环境,而且和 Workstation 自己的 NAT 服务容易打架,出问题之后排查成本很高。需要出网就老老实实切 NAT,别绕。
仅主机模式自己也有故障,主要是宿主机和虚拟机之间 ping 不通。这种情况先看 VMnet1 在宿主机上有没有地址,再看虚拟机的地址是不是同一网段且掩码正确。另外 Windows 宿主机上,VMnet1 对应的网络位置如果是“公用网络”,防火墙可能会拦掉 ICMP,表现就是虚拟机 ping 不通宿主机但宿主机能 ping 通虚拟机,把网络位置改成“专用”即可。
3.4 配置文件层面:Linux 与 Windows 虚拟机的落地写法
命令能通但重启之后又断,说明配置没持久化,得动配置文件。不同发行版的写法差别不小,下面给三套常见的。
Debian 系的新版本用 netplan,配置文件在/etc/netplan/下,文件名一般是01-netcfg.yaml之类。写法如下,注意 YAML 对缩进极其敏感,必须用空格不能用 Tab:
network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.10.50/24 routes: - to: default via: 192.168.10.2 nameservers: addresses: - 192.168.10.2 - 8.8.8.8写完之后执行sudo netplan apply,如果报错就先用sudo netplan try试运行,它会给你一段确认时间,超时自动回滚,比直接 apply 安全。
RHEL 系的老写法是/etc/sysconfig/network-scripts/ifcfg-ens33:
TYPE=Ethernet BOOTPROTO=static NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.10.50 PREFIX=24 GATEWAY=192.168.10.2 DNS1=192.168.10.2 DNS2=8.8.8.8改完执行sudo systemctl restart NetworkManager或者sudo nmcli connection reload让配置生效。注意ONBOOT=yes这一行经常被人漏掉,结果就是每次开机网卡都不自动起来,表现为“刚重启就断网”。
如果系统用的是 NetworkManager,用 nmcli 改更省事,也不用记文件路径:
nmcli connection modify "Wired connection 1" ipv4.method manual nmcli connection modify "Wired connection 1" ipv4.addresses 192.168.10.50/24 nmcli connection modify "Wired connection 1" ipv4.gateway 192.168.10.2 nmcli connection modify "Wired connection 1" ipv4.dns "192.168.10.2 8.8.8.8" nmcli connection up "Wired connection 1"连接名称不一定是“Wired connection 1”,先用nmcli connection show看一眼实际的名称,中文环境下可能是“有线连接 1”,带空格一定要加引号。
Windows 虚拟机就简单得多,网络适配器属性里选 TCP/IPv4,自动获取或者手工填,填的时候注意网关必须是虚拟机所在虚拟网络的网关,别填成了宿主机用来上网的那个网关——这两个在 NAT 模式下不是一回事。
3.5 还原默认设置:什么时候该用,怎么用才不惹麻烦
虚拟网络编辑器里那个“还原默认设置”按钮,是解决虚拟网络配置错乱的终极手段,但它不是万能的,用错了会带来新麻烦。
该用的场景很明确:VMnet1 或 VMnet8 在宿主机上消失、地址变成 169.254 开头、虚拟网络编辑器里的参数被改得面目全非、试了各种办法都对不上。这种情况下与其一项项去猜,不如直接还原,让 Workstation 重建成出厂状态。
不该用的情况也很明确:虚拟机里配了静态 IP、或者做过端口映射、或者有多个虚拟机依赖特定的网段。还原会把网段、DHCP 地址池、NAT 网关、端口映射全部重置,之前的配置全丢。所以动手之前,先把虚拟网络编辑器里各个 VMnet 的参数截图或者记下来,还原之后再按记录的参数重新配一遍。
还原过程中会短暂卸载并重装虚拟网卡,宿主机上如果正开着虚拟机,建议先关掉。还原完成之后,Windows 下可能需要等一会儿让系统重新识别网络,然后重启一次 VMware 的相关服务,最后再启动虚拟机测试。
4. 高频故障速查表与踩坑实录
4.1 一张表覆盖八成常见现象
下面这张表是我这些年攒下来的,按现象查原因,比从头推快得多。里面的“验证方法”一栏可以直接复制执行。
| 现象 | 最可能的原因 | 快速验证 | 处理方式 |
|---|---|---|---|
| 虚拟机拿到 169.254.x.x | DHCP 没应答 | 宿主机查 VMware DHCP Service 状态 | 启动服务,或改静态 IP |
| 有 IP,ping 网关不通 | 网关地址与虚拟机不同网段 | ip route看 default via | 对齐虚拟网络编辑器里的网关 |
| ping 网关通,ping 8.8.8.8 不通 | NAT 服务未运行或宿主机无网 | 宿主机查 NAT 服务,宿主机自己 ping 外网 | 启动 NAT 服务或修复宿主机网络 |
| ping IP 通,域名不通 | DNS 配置缺失或被覆盖 | cat /etc/resolv.conf | 配置 DNS 并防止被覆盖 |
| 桥接模式下时通时断 | IP 冲突或无线网卡不支持 | arping或 ping 探测地址占用 | 换池外静态地址或改用 NAT |
| 宿主机网络连接里没有 VMnet8 | 虚拟网卡被删或被禁用 | 设备管理器查看 | 还原默认设置重建 |
| 虚拟机之间能通,出不了网 | 用的是仅主机模式 | 看虚拟机网络适配器设置 | 改为 NAT 模式 |
| 重启后网络配置丢失 | 配置文件未持久化 | 检查 ifcfg 或 netplan 文件 | 补 ONBOOT 或 apply 配置 |
| 克隆后两台虚拟机抢网 | MAC 地址重复 | 对比两台机器的 MAC | 重新生成 MAC 地址 |
4.2 那些官方文档不会提的坑
第一个坑是克隆虚拟机的 MAC 地址冲突。用克隆功能复制出来的虚拟机,如果选了“创建完整克隆”,Workstation 一般会自动生成新 MAC,但如果是从别处拷来的虚拟机文件、或者是链接克隆的某些版本,MAC 可能完全一样。两台 MAC 相同的机器在同一个虚拟网络里,表现就是轮流掉线、时通时断,ping 延迟忽高忽低。判断方法是在两台机器的网卡信息里对比 MAC 地址,一样就说明中招了。处理方法是关掉虚拟机,在虚拟机设置里找到网络适配器,点“高级”,点一次“生成”重新分配 MAC,两台都做一遍。
第二个坑是快照回滚之后网络配置错乱。这个坑的隐蔽性在于时间差:你在打快照的时候网络是好的,回滚回来发现网络不通,于是怀疑是回滚把网络搞坏了。实际上更常见的情况是虚拟网络编辑器里的配置在这期间被改过(比如你后来调整过网段),回滚回来的虚拟机还带着旧网段的静态 IP,自然对不上。遇到这种情况别急着改虚拟机,先去虚拟网络编辑器看一眼当前的实际网段,再回头对虚拟机的配置。
第三个坑是宿主机睡眠唤醒之后 VMnet8 丢地址。笔记本合盖再打开,VMnet8 的 IP 有可能变成 169.254 开头,这时候虚拟机全部断网,但宿主机自己上网完全正常,非常迷惑。处理很简单:在宿主机上禁用再启用一次 VMnet8 这张虚拟网卡,地址就回来了。如果频繁出现,可以在电源设置里检查一下是不是网卡被允许了“关闭以节省电源”,把这个选项关掉。
第四个坑是虚拟化功能的共存问题。Windows 宿主机上如果启用了系统自带的虚拟化平台功能,Workstation 会切换底层接口来兼容运行,这种状态下有些网络功能的表现会跟平时不一样,尤其是桥接。判断方法是看虚拟机能不能正常启动运行——如果启动时提示不兼容或者性能异常,那就是这个原因。要做实验的话,把不用的虚拟化功能在“启用或关闭 Windows 功能”里关掉,重启之后再试,往往能解决那些“配置全对就是不通”的玄学问题。
第五个坑在 DNS 上,而且特别容易把人带偏。Linux 虚拟机里手工改/etc/resolv.conf,当时生效,一重启或者一重连网络就被覆盖回默认值。原因是这个文件现在通常由 NetworkManager 或者 systemd-resolved 托管,手改不算数。正确做法是把 DNS 写进网卡配置文件或者用 nmcli 设置,让托管方去生成/etc/resolv.conf。如果系统用的是 systemd-resolved,还要注意它监听的是 127.0.0.53,用resolvectl status看实际的 DNS 来源,比盯着 resolv.conf 有用。
4.3 一个五分钟快速恢复清单
真遇上紧急情况,需要让虚拟机尽快恢复联网,我一般按下面这个顺序走,绝大多数情况五分钟内能解决。
- 宿主机上确认自己能上网,浏览器随便开一个页面验证。
- 打开虚拟网络编辑器,看当前虚拟机用的虚拟网络的子网、网关、地址池三处配置是否自洽。
- Windows 宿主机的服务列表里,确认 VMware 的 DHCP 与 NAT 两个服务处于运行状态,没运行就启动。
- 宿主机网络连接里,禁用再启用 VMnet8(或对应的虚拟网卡)。
- 虚拟机里重新获取地址,Linux 执行
sudo dhclient -r && sudo dhclient,Windows 执行ipconfig /release和ipconfig /renew。 - 依次 ping 网关、ping 外部 IP、ping 域名,定位卡在哪一层。
- 以上都不行,虚拟机设置里把网络适配器从当前模式切到 NAT,重新获取地址,先恢复联网再回头深究原因。
这个清单的价值不在于步骤本身多高明,而在于它把“随机尝试”变成了“按层级推进”,每一步都有明确的验证结果,不会陷入改了半天不知道改没改对的循环。
5. 长期使用中攒下的几条配置习惯
实验环境要长期用,网络配置最好一开始就规划好,省得后面反复返工。我自己的习惯是给每个虚拟网络固定一个网段用途:NAT 用 192.168.10.0/24,仅主机用 192.168.20.0/24,如果开了第二个 NAT 网络就用 192.168.30.0/24。这样不管开多少台虚拟机,看 IP 前两位就知道它走的是哪条路,排查的时候不用去翻配置。
静态地址的分配也建议做个表记下来,哪台机器用哪个地址、什么用途、对应哪个虚拟网络,写在一个文本文件里放在虚拟机目录旁边。多机实验做到后期,地址冲突是最高频的问题,有个表能省掉大量“为什么时通时断”的排查时间。
快照策略上,我的做法是在“系统装好、网络调通、必要工具装完”这个节点打一个干净快照,命名里带上当时的网段信息。以后不管怎么折腾,回滚到这个快照网络都是好的。回滚之后第一件事是去虚拟网络编辑器核对一遍当前网段有没有变,而不是直接怀疑快照有问题。
最后一个习惯:改任何网络配置之前,先把ip addr、ip route、cat /etc/resolv.conf三条命令的输出保存下来。改坏了想回退的时候,这三条输出就是你的原始状态,比凭记忆猜靠谱得多。我在被坑过几次“改了半天忘了原来是什么样”之后,这个动作已经变成肌肉记忆了,你也可以试试。