一次把VMware NAT模式网络不通讲透从原理到排查照着做就能解决先说说我自己的经历。几年前第一次用VMware Workstation装CentOS虚拟机网络模式想都没想就选了NAT结果虚拟机里能ping通百度宿主机却死活ping不通虚拟机反过来虚拟机也ping不通宿主机。当时我第一反应就是防火墙关了没用又改了IP地址也没用折腾了大半天最后才发现是我压根没看懂VMware NAT网络的链路结构。那之后就明白了这类问题一旦理清原理排查起来其实特别快。这篇内容主要面向两类人一类是刚接触VMware、用NAT模式装好虚拟机却发现和宿主机通信不上的新手另一类是工作中经常用虚拟机调试服务、偶尔被网络问题卡住的开发者。我会先把NAT模式下数据到底怎么走的讲清楚再按步骤把“不通”的原因拆开最后附上我踩过的一些坑和通用的排查清单保证你照着做能快速定位问题。1. 先把“不通”这件事拆干净1.1 区分三种“不通”别一上来就乱改配置很多人遇到问题就急着去改虚拟机IP、关防火墙结果越改越乱。我的建议是先搞清楚“不通”到底是三种情况里的哪一种因为它们的排查方向完全不同。第一种是完全不通虚拟机刚装好就ping不通宿主机反过来宿主机也ping不通虚拟机这时候问题大概率出在VMnet8虚拟网卡、VMware服务或者网络配置上。第二种是单向通比如虚拟机ping宿主机能通但宿主机ping虚拟机不通这种情况通常和防火墙、ICMP规则或者虚拟机侧的IP配置有关系。第三种是最迷惑的虚拟机能上外网但和宿主机怎么都不通这说明NAT出网链路是好的问题出在宿主机与虚拟机之间那条专门用于互访的虚拟链路上。我见过太多人卡在第三种情况里出不来因为“能上外网”会给人一种“网络应该是好的”的错觉但实际上NAT模式里“出外网”和“与宿主机通信”走的是两条不完全相同的路径后面我会详细拆开讲。先花两分钟判断自己是哪一类能省下后面大量的弯路。1.2 为什么“能上外网”不等于“能和宿主机通信”这是NAT模式里最反直觉的地方。很多教程都只说“NAT模式可以让虚拟机通过宿主机上网”但没告诉你这里面其实有两个关键通道。虚拟机要上外网数据包先从虚拟机网卡发到VMnet8虚拟交换机然后交给VMware的虚拟NAT设备做地址转换最后由宿主机物理网卡发到真实网络。这条链路里NAT设备是核心它负责把虚拟机的私有IP转换成宿主机物理网卡的IP所以外网设备看到的流量全部来自宿主机。但如果虚拟机和宿主机之间互相访问数据包走到VMnet8虚拟交换机以后走的是另一条支路直接被转发到宿主机侧的VMnet8虚拟网卡再由Windows或Linux的协议栈处理根本不需要经过NAT设备。用一个生活化的类比就像一个小区的住户要出门买菜得走小区大门这个大门就是NAT设备但如果他要去物业办公室办事走的是小区内部的内部道路不需要出大门。NAT模式里的宿主机访问虚拟机走的就是“内部道路”也就是VMnet8网卡。问题恰恰出在这里很多人只检查了“大门”是不是好的看到虚拟机有外网就以为整条网络链路都正常但“内部道路”可能早就断了。所以你在排查时要建立这样一个基本认知NAT模式下“出外网正常”只能证明NAT服务、物理网卡、网关配置这些环节没大问题但宿主机和虚拟机之间的互访重点要看VMnet8虚拟网卡、VMware服务的运行状态、以及子网配置是否一致。2. 排查前必须看懂VMware的虚拟网络结构2.1 三个默认虚拟网络模式先明确你选的是哪个VMware Workstation装好以后会给宿主机制建出几个虚拟网络默认常见的是VMnet0、VMnet1、VMnet8分别对应桥接、仅主机、NAT三种模式。很多人只知道“选NAT能上网”却不知道VMnet8具体是怎么组织出来的。桥接模式相当于把虚拟机直接接到你办公室或家里的局域网里虚拟机就像旁边多了一台实体电脑IP地址应该和宿主机同网段由路由器分配。仅主机模式只有一台虚拟交换机VMnet1虚拟机只能和宿主机通信不能出外网名字里其实已经说明了。NAT模式用VMnet8组成一个独立的私有网络虚拟机在这个私有网络里通过虚拟NAT设备出外网。使用频率最高的就是NAT因为它既能满足虚拟机上网需求又不会占局域网IP宿主机换网络环境也不影响虚拟机出网。但代价就是通信链路多了一层虚拟结构排查起来比桥接稍微复杂一点。先确认自己虚拟机设置里选的是不是NAT很多人实际选的是“仅主机”然后来找我为什么虚拟机ping不通外网这类问题在现场其实经常发生。2.2 理解VMnet8里的三个“角色”别把它们混为一谈在VMnet8这个逻辑网络里有至少三个角色需要分清楚。第一个是虚拟机的虚拟网卡它在VMnet8网段里拥有一个IP地址。第二个是宿主机侧的VMware Network Adapter VMnet8这是安装在宿主机上的一个虚拟网卡在同一个网段里有一个IP地址它相当于宿主机在虚拟机私有网络里的“门牌号”。第三个是虚拟NAT设备它的IP地址通常是这个网段的网关地址虚拟机对外出网的数据包都交给它转发。注意一个经常被误解的点虚拟机和宿主机互相ping根本不需要经过虚拟NAT设备只要VMnet8虚拟网卡活着、子网配置正确、防火墙没有拦截就能通。反过来如果VMware NAT Service这个服务出问题虚拟机很可能就没法上外网但宿主机和虚拟机之间可能照样能通信。这就是为什么有时你会遇到“互Ping通但虚拟机没网”的怪现象。搞清楚了这三个角色后面所有排查步骤其实都是围绕它们展开的检查VMnet8网卡是否存在和启用、检查虚拟NAT设备所在的网关是否配置正确、检查虚拟机的网卡是否身处同一个子网。大概就是这么个思路下面进入实际排查。3. 从零开始的完整排查与修复流程3.1 第一步在虚拟机里确认自己的“位置”不管你是装的Windows虚拟机还是Linux虚拟机第一步一定是先看虚拟机里的网络信息确认它到底拿没拿到一百九十二点一六八开头的VMnet8网段地址。Linux里用ip addrWindows里用ipconfig /all我以Linux为例。如果在输出里看到eth0或ens33上有一个一百九十二点一六八.x.x的地址说明虚拟机的DHCP请求是成功的虚拟网卡也基本正常。如果发现IP是169.254.x.x这种以169.254开头的自动私有地址那基本可以判定虚拟机没有从DHCP服务拿到IP问题可能在VMware DHCP服务或者虚拟网卡配置上。如果发现IP完全是空的先检查虚拟机设置里的网络适配器是不是真的选了NAT模式以及是不是“已连接”前面的勾被去掉了。有了IP之后接着测连通性。先ping网关也就是192.168.x.2这个地址是VMware NAT设备的默认网关地址能通说明虚拟机到虚拟NAT设备这条路没问题。再ping宿主机的VMnet8网卡地址通常是192.168.x.1能通说明虚拟机到宿主机这条内部链路已经正常。最后再ping一个公网地址比如223.5.5.5能通说明出外网链路正常。一般我习惯按这个顺序测测到哪一步断了问题就缩小到哪一段。3.2 第二步重点检查宿主机上的VMnet8网卡排到宿主机和虚拟机不通的时候我首先看的就是VMnet8网卡。打开Windows的“网络连接”窗口或者运行里输入ncpa.cpl找到“VMware Network Adapter VMnet8”这个网卡。常见问题有三个网卡被禁用、网卡处于“未识别网络”状态、或者网卡压根不见了。如果是禁用状态右键启用就行然后等几秒再测这是最简单的修复。如果网卡显示未识别或没有有效IP地址先看它的IP地址是不是和虚拟机的网段对得上正常来说宿主机VMnet8网卡的IP应该是192.168.x.1子网掩码255.255.255.0。如果IP不是这个值说明网络配置曾经被改过我们可以手动改成和虚拟机同一网段的地址但更稳妥的办法是去虚拟网络编辑器里整体做一次统一配置这个我下面会说。还有一种情况是VMnet8网卡整个消失了网上邻居里根本找不到这种多半是VMware的虚拟网卡驱动被安全软件禁用或损坏了。最简单的办法是打开VMware虚拟网络编辑器点击左下角的“更改设置”这时候右侧会多出“还原默认设置”按钮点击后VMware会重新安装并注册所有虚拟网卡注意还原默认设置会把你以前自定义过的NAT、仅主机、桥接配置全部清掉重新创建一套默认配置字段如果你有已经配置好的端口转发或自定义子网操作之前记得先记下来。3.3 第三步检查VMware相关的两个服务是否在运行排除了网卡问题以后下一步是看服务。Windows的服务列表里注意找“VMware DHCP Service”和“VMware NAT Service”这两个服务。前者负责给虚拟机分配IP地址后者负责虚拟机出网时的地址转换。按Win加R输入services.msc打开服务管理器找到这两个服务如果状态不是“正在运行”右键启动。启动类型建议改成“自动”不然下次开机又忘了启动虚拟机网络大概率又断掉。有些优化软件会把这两个服务列为“非必要项”关掉这也是很多人重启电脑后虚拟机突然没网的常见原因之一。如果服务能正常启动那就去虚拟机里再ping一次网关确认DHCP和NAT链路恢复正常。如果服务启动时报错可以先试试重启VMware Workstation或者卸载重装VMware但绝大多数情况下服务启动失败是因为之前Windows系统更新或者驱动冲突导致的重装VMware Workstation往往能一并解决问题这个选择我放在最后。3.4 第四步检查虚拟网络编辑器里的关键配置这一步不能跳很多“改来改去还是不通”的问题最后都是在这里找到的。打开VMware菜单栏的“编辑”里面的“虚拟网络编辑器”注意要点击右下角的“更改设置”按钮它以管理员模式打开这样才能看到完整的可编辑选项。在这个窗口里先看列表中有没有VMnet8它的类型是不是NAT如果显示“已桥接”或者“仅主机”那说明之前有人改过配置把它改回NAT模式。然后选VMnet8下方子网IP这里通常会显示192.168.x.0子网掩码255.255.255.0这个x可以不是128只要整个网络设备都在同一个x网段就行不必纠结具体值。重点检查的是子网IP和宿主机VMnet8网卡IP是不是同一个网段。如果虚拟网络编辑器里子网IP是192.168.80.0而宿主机VMnet8网卡IP却是192.168.137.1那两边肯定连不通。正常的对应关系是VMnet8网段的第一位第三种如192.168.80.1一般是宿主机网卡IP192.168.80.2一般是NAT网关192.168.80.128到192.168.80.254之类的地段是DHCP地址池用于分配给虚拟机。还要检查“连接主机虚拟适配器到网络”这个选项前面的勾是不是勾着的这个选项就是决定宿主机VMnet8虚拟网卡是否存在的开关。如果没勾宿主机就不会有VMnet8这块网卡自然也就ping不通虚拟机。另外在“NAT设置”里可以看到网关IP正常情况下就是192.168.x.2不要随意改动某些教程把网关改成其他地址反而会引起混乱。如果你的需求比较简单只要让宿主机和虚拟机互通子网建议直接保持默认值。如果之前被人改过这里教一个统一的处理思路先把虚拟网络编辑器里的VMnet8子网记下来然后在宿主机VMnet8网卡上手动设置一个同网段的固定IP再把虚拟机网络改成DHCP自动获取或设置同网段的静态IP三者的网段保持一致问题基本就解决了。3.5 第五步虚拟机内部系统和防火墙的检查确认虚拟网络层面没问题以后最后要看虚拟机内部。先说虚拟机网卡是否真的绑定了NAT模式在虚拟机关机状态下进入“虚拟机设置”中的“网络适配器”选择“NAT模式”确认“已连接”的勾是选中的。很多人在创建虚拟机时选了NAT后来又克隆或导入虚拟机系统里的网卡配置和虚拟机的网络设备不一致也会导致不通。Windows虚拟机的话网络适配器属性里看看TCP/IPv4是不是自动获取IP如果之前配过静态IP而且网段和现在VMnet8不一致改成自动获取。Linux虚拟机的话用nmcli或者直接看网卡配置文件把网卡设为dhcp方式或者配成和VMnet8同一个网段的静态地址。这里的核心原则只有一个虚拟机IP必须落在VMnet8子网内网关必须指向192.168.x.2。防火墙这一层经常是最后的拦路虎。Windows宿主机Ping不通虚拟机时先临时把Windows防火墙关闭或者至少允许“文件和打印机共享”里的“回显请求-ICMPv4-In”规则这个规则是默认存在的很多优化工具或安全软件会把它禁用手动启用就行。虚拟机是Linux的话先执行systemctl stop firewalld临时关闭防火墙再测试连通性能通就把22、80等服务端口永久放行而不是直接关防火墙长期跑。提示临时关闭防火墙只是为了定位问题定位完成以后一定要记得把必要的端口、ICMP规则放行并且重新把防火墙打开。为了排查问题而永久关闭防火墙是我们在生产环境里最忌讳的操作。4. 三个典型“疑难杂症”案例复盘4.1 案例A虚拟机有外网宿主机和虚拟机互Ping不通这是一个真实的重现度很高的案例。虚拟机是CentOS 7NAT模式虚拟机里能正常yum安装软件但宿主机上面ping虚拟机显示“请求超时”虚拟机里面ping宿主机VMnet8网卡也一直丢包。按我们上面的流程先看VMnet8网卡发现它还在但被系统标记为“已断开连接”。进一步查看是这台Windows宿主机之前被安全软件优化过把VMnet8网卡在开机的时候设置为“已禁用”了。处理方式很简单网络适配器里右键VMnet8点击“启用”然后重新测试发现虚拟机里能ping通192.168.x.1了宿主机也能ping通虚拟机了。这个案例其实没有太高深的技术含量但它说明了为什么我坚持先看VMnet8网卡别在虚拟机里反复折腾。安全类软件、网络优化类工具经常把这些虚拟网卡当成“无用项”处理导致宿主机侧的网络入口直接被关掉。4.2 案例B虚拟机Ping得通宿主机宿主机Ping不通虚拟机这类“单向通”特别困扰人。常见的第一个原因是Windows防火墙默认禁止了外部对宿主机的ICMP回显请求但实际上按上面的逻辑这时是宿主机去ping虚拟机触发约束的却是宿主机自己发出的探测包和虚拟机返回的响应Windows防火墙的入站规则会拦住来自外部的回显请求导致宿主机ping虚拟机时虚拟机端把请求放行了、响应却被Windows防火墙拦了现象就变成虚拟机侧看到请求进来宿主机侧却收不到响应。另一个常见原因是虚拟机安全软件或系统防火墙禁用了ICMP很多人只检查了宿主机防火墙忘了虚拟机自己也有防火墙。我的建议是先把两头防火墙临时都关掉能够ping通以后再逐个打开并精确放行规则这样能快速定位是哪一侧在拦截。尤其是Windows虚拟机自带的Windows Defender防火墙默认也会阻止ICMPv4-In和宿主机一样需要手动放行“回显请求”规则。还有一种不那么常见的原因是虚拟机里配置了静态IP但是网关地址写错了比如写成了192.168.x.1而不是192.168.x.2。虽然这种错不影响虚拟机与宿主机之间在二层广播域的ping但在某些配置下会引发路由异常导致响应丢包。建议无论如何都检查一遍网关。4.3 案例C修改VMnet8子网之后宿主机和虚拟机双双“失联”很多文章会教你把VMnet8子网改成一个“看起来更顺眼”或者和自己局域网不冲突的网段比如改成192.168.88.0。改了以后当天没事第二天开机发现宿主机ping不通虚拟机了虚拟机也上不了网了。原因在于修改VMnet8子网之后宿主机VMnet8网卡的IP并不会平滑地跟着变化有时候虚拟机的DHCP租约还保留着旧网段的IP两边网段不一致自然就断了。我遇到过最头疼的场景是改了虚拟网络编辑器但宿主机VMnet8网卡却还是旧IP手动改宿主机网卡IP以后又发现虚拟机的静态IP还是旧的。这时候最靠谱的处理方式是在虚拟网络编辑器里把VMnet8的子网设置好以后去宿主机网络应用里把VMnet8网卡先禁用再启用让它重新获取与新子网匹配的地址然后虚拟机里把网络适配器先设为自动获取让DHCP重新下发新网段的IP确认拿到新IP以后如果确实需要静态IP再改回静态。这样能一套流程把三个节点的网段彻底统一。5. 应用场景延伸宿主机访问虚拟机Web服务、其他机器访问虚拟机、端口转发5.1 宿主机直接访问虚拟机里的网站或远程服务既然NAT模式下的虚拟机和宿主机是可以互相通信的那么宿主机访问虚拟机里的Web服务就非常直接。比如虚拟机里装了nginx监听80端口宿主机浏览器直接输入http://192.168.x.100就能打开这里的192.168.x.100是虚拟机的IP。不需要做任何端口转发。SSH连接也是一样宿主机终端直接ssh root192.168.x.100就能连上。Windows虚拟机开启远程桌面以后宿主机远程桌面输入虚拟机IP加端口3389即可。这里有个细节容易被忽略虚拟机里的服务通常默认监听0.0.0.0或局域网接口如果服务只绑定了127.0.0.1宿主机是访问不到的需要去服务配置里把监听地址改成0.0.0.0。还有一点如果你在虚拟机里跑的是Docker之类的容器服务记得确认端口是否真实映射到了虚拟机本身的地址上有时候容器端口只映射在Docker网桥上宿主机访问不到很正常。可以把容器端口映射到虚拟机IP上或者直接使用桥接网络模式。5.2 其他主机访问NAT模式下的虚拟机端口转发NAT模式下局域网里的其他主机直接访问虚拟机IP是不行的因为虚拟机的IP是私有网络地址只有宿主机和VMnet8网段内的设备知道它。其他主机要访问虚拟机里的服务通常的做法是用VMware的端口转发能力。打开虚拟网络编辑器选中VMnet8点击“NAT设置”然后在NAT设置窗口下方找到“端口转发”区域。例如我们想把宿主机的8080端口转发到虚拟机的80端口就添加一条规则主机端口填8080类型选TCP虚拟机IP地址填192.168.x.100虚拟机端口填80。这样配置以后局域网里的其他主机就可以直接访问宿主机IP的8080端口流量会被VMware NAT转发到虚拟机的80端口上。这里有个经典问题叫“NAT回流”也就是宿主机自己通过自己的IP加8080端口访问刚才配置的转发规则。Windows平台上这种行为的表现不太稳定有时能通有时不通原因是流量回环路径是否符合Windows自身路由策略。因此我建议宿主机自己访问虚拟机里的服务时直接用虚拟机IP加端口只有局域网里其他主机访问时才走“宿主机IP加端口”的方式这样最省心。如果你想用zabbix之类的监控系统去监控虚拟机里的服务外部机器访问NAT虚拟机也基本沿用一个思路要么监控插件直接部署在宿主机和被监控虚拟机里由zabbix服务端主动去连被监控端需要被监控端能通过网络接受请求在NAT模式下通过端口转发把10050等agent端口映射到宿主机即可要么把被监控虚拟机改成桥接模式直接暴露到局域网中看你的安全策略怎么权衡。5.3 按需选择模式不是所有场景都适合NATNAT模式最大的优点是虚拟机相对“安全”它不直接暴露在局域网中外部设备无法主动扫描到它同时多台虚拟机可以共享宿主机的一个IP出网。对于需要隔离调试、学习装环境、跑一些临时服务的场景NAT非常合适。但如果你的虚拟机要扮演一个局域网服务器让手机、平板、其他电脑直接访问或者要跑组播、广播、一些依赖局域网发现协议的应用那NAT模式往往会带来很多麻烦。这种时候直接改成桥接模式让虚拟机拥有一个和宿主机同一网段的局域网IP是最省事的选择。说白了模式没有好坏只有合不合适。6. 常见问题速查表与多年的排障经验6.1 快速定位表对着现象找原因以下这个表格是我在实际排查中反复用到的对照表基本覆盖了NAT模式下宿主机和虚拟机不通的大部分场景。出现问题时先对号入座再动手处理。现象最可能的根因解决思路虚拟机完全无法获取IPVMware DHCP Service未运行检查并启动服务设置开机自动运行虚拟机能拿IP但ping不通网关VMnet8子网和默认网关被改乱虚拟网络编辑器里核对子网IP和NAT设置的网关IP虚拟机没有外网宿主机能Ping通虚拟机VMware NAT Service未运行检查服务重启VMware NAT Service宿主机Ping不通虚拟机虚拟机Ping通宿主机Windows防火墙拦截ICMP入站启用ICMPv4-In规则或临时关防火墙验证双重Ping不通VMnet8网卡已启用宿主机和虚拟机不在同一网段统一三者的网段重启虚拟机网卡重新获取IPVMnet8网卡整个消失虚拟网卡驱动异常或被安全软件禁用虚拟网络编辑器里执行“还原默认设置”开机后有时通有时不通VMware服务启动类型不是“自动”调整服务启动类型并手动启动服务虚拟机网卡显示“已断开”虚拟机设置里未勾选“已连接”进入虚拟机设置勾选已连接并选择NAT模式“此主机不支持嵌套虚拟化模块HV启动失败”宿主机的Hyper-V或内核隔离处于开启状态关闭Hyper-V或添加vmx配置禁用侧信道缓解这类问题与网络链路无关第11种情况其实不是NAT模式网络不通的典型原因但好在确实有读者拿这个报错来问“是不是因为网络设置不对”这里说明一下这个报错更多是指CPU虚拟化环境之间的冲突是在虚拟机启动阶段发生的不是NAT网络链路本身的问题。遇到这种报错先排查Windows虚拟化功能是否开启和本期的话题是两码事别混在一起看。6.2 多年经验总结的几个重要提醒第一个是修改任何配置之前先记录原始值。虚拟网络编辑器里的子网IP、网关地址、NAT端口转发规则改之前先截图或记下来。很多人在排查时把配置来回改了好几次最后连初始状态是什么样的都不记得了出了问题也没法还原这是排障里最被动的情况。第二个是尽量不要同时使用多个虚拟化软件。比如同时装VirtualBox和VMware它们的虚拟网络都叫VMnet8但网段可能是不同的两个软件的网络服务同时运行很容易抢占或者造成宿主机的虚拟网卡配置混乱。装了一个虚拟机软件能把另一个的服务停掉就尽量停掉尤其是开机自启动的服务。第三个是重启不一定万能但在网络排障里却特别管用。改了虚拟网络设置以后把宿主机VMnet8网卡禁用再启用或者重启虚拟机强制让DHCP重新分配IP可以解决一大批看起来莫名其妙的“时通时不通”。尤其是你刚改完VMnet8的子网网段几乎必然要让VMnet8网卡和虚拟机网络适配器重新初始化一次。第四个是如果遇到的是“宿主机能联网、虚拟机也能上外网”的情况就不要再去动虚拟机里的DNS、网关了问题一定出在宿主机和虚拟机的互访链路上也就是VMnet8虚拟网卡或者防火墙。方向判断正确效率能提高一半以上。说句心里话VMware NAT模式这套网络设计入门时觉得绕但只要理解了它内部“大门”和“内部道路”的分工后面所有排查都会变得顺理成章。我后来不管是在电脑上搭测试环境还是给别人远程排查虚拟网络问题基本都遵循上面这套顺序先看VMnet8网卡再看服务接着统一网段最后排查防火墙。如果你现在正卡在宿主机和虚拟机不通的问题上别急着重装系统先打开虚拟网络编辑器再走到宿主机网卡设置里看一眼问题大概率就在那几项里面。