
1. 虚拟机网络不通这件事先别急着改配置刚装完CentOS 8虚拟机兴冲冲打开终端想从主机ping一下结果要么是请求超时要么是目标主机不可达。这种场景我见过太多次了不管是刚接触虚拟化的新手还是用了几年虚拟机但一直用NAT模式没折腾过网络的老手遇到这个问题的第一反应往往是去搜CentOS 8 网络配置然后被一堆ens33、ifcfg、NetworkManager的命令绕晕。其实虚拟机与主机互相ping通这件事核心就三个问题虚拟机的网卡有没有拿到IP、虚拟网络编辑器的模式选对没有、防火墙有没有放行ICMP协议。这三个问题按顺序排查九成以上的情况都能解决。但很多人一上来就改配置文件改完发现还是不通然后继续改最后把网络配置搞得一团糟。这篇内容适合所有在Windows或Linux主机上跑CentOS 8虚拟机的朋友不管你用的是VMware Workstation、VirtualBox还是其他虚拟化平台排查思路是通用的。我会从网络模式的选择讲起把每种模式下的配置方法、容易踩的坑、以及验证手段都拆开说清楚。读完你不仅能解决当前的问题下次遇到类似场景也能自己判断该用哪种模式。需要提前说明的是CentOS 8在网络管理上和CentOS 7有一个很大的区别CentOS 8默认使用NetworkManager来管理网络传统的network.service已经被废弃了。这意味着你以前在CentOS 7上用的systemctl restart network命令在CentOS 8上可能根本不存在。这个变化坑了不少人后面我会详细讲怎么应对。2. 先搞清楚虚拟网络编辑器里的三种模式到底在干什么在动手改任何配置文件之前你得先理解虚拟机软件提供的几种网络模式分别意味着什么。这就像出门之前先看地图知道自己在哪、要去哪才不会走冤枉路。2.1 NAT模式默认选项也是ping不通的重灾区NAT模式是大多数虚拟机软件创建虚拟机时的默认网络模式。它的工作原理是虚拟机通过主机的网络接口访问外部网络但外部网络看不到虚拟机。虚拟机相当于躲在主机后面由主机帮它做地址转换。在NAT模式下虚拟机会被分配一个私有网段的IP比如VMware默认的192.168.x.x网段。主机在这个网段里会有一个虚拟网卡Windows上通常叫VMnet8地址一般是192.168.x.1。虚拟机的网关指向这个地址所以虚拟机可以ping通主机但主机能不能ping通虚拟机取决于主机上这个虚拟网卡的配置是否正确。很多人遇到的情况是虚拟机里ip addr能看到ens33有IP虚拟机也能ping通外网但主机ping虚拟机就是超时。这时候问题往往出在主机侧的VMnet8网卡被禁用了或者IP地址不在同一网段。2.2 桥接模式虚拟机和主机平起平坐桥接模式是把虚拟机的网卡直接桥接到主机的物理网卡上虚拟机就像局域网里另一台独立的设备。它会从你所在局域网的DHCP服务器获取IP和主机在同一网段。这种模式下主机ping虚拟机和ping局域网里另一台电脑没有区别。但桥接模式的问题在于如果你的局域网没有DHCP服务器或者公司网络做了端口安全限制虚拟机可能拿不到IP。另外桥接模式下虚拟机会占用局域网的一个IP地址在某些网络环境里可能会引起管理员的注意。2.3 仅主机模式封闭环境适合做实验仅主机模式下虚拟机只能和主机通信不能访问外部网络。虚拟机软件会创建一个独立的虚拟网卡VMware里是VMnet1主机和虚拟机在这个封闭网段里互相通信。这种模式最适合做网络实验因为不会影响外部网络也不会被外部网络影响。如果你只是想让主机和虚拟机互相ping通不关心虚拟机能不能上网仅主机模式其实是最省心的选择。模式虚拟机能否上网主机能否ping通虚拟机适用场景NAT能通常能需检查VMnet8日常开发需要上网桥接能能虚拟机需要被局域网其他设备访问仅主机不能能封闭实验环境提示如果你不确定该选哪种模式先用NAT模式排查。NAT模式不通换成仅主机模式验证一下如果仅主机模式能通说明问题出在NAT的配置上而不是虚拟机本身的网络配置有问题。3. CentOS 8的网卡配置NetworkManager和传统方式的区别确定了网络模式之后接下来要在CentOS 8里确认网卡是否正常工作。这里有一个关键点CentOS 8默认安装的是NetworkManager它管理网络的方式和传统的network.service不一样。3.1 用nmcli快速查看网卡状态CentOS 8里最直接的网络查看命令是nmcli。打开终端输入nmcli device status你会看到类似这样的输出DEVICE TYPE STATE CONNECTION ens33 ethernet connected ens33 lo loopback unmanaged --如果ens33的STATE显示的是disconnected说明网卡没有激活。这时候可以用nmcli connection up ens33如果提示找不到连接可能需要先创建一个连接nmcli connection add type ethernet ifname ens33 con-name ens33 nmcli connection up ens333.2 检查IP地址是否获取成功网卡激活之后用ip addr查看是否拿到了IPip addr show ens33如果看到inet 192.168.x.x这样的地址说明IP已经获取到了。如果没有inet行说明DHCP没有分配地址或者你配置的是静态IP但配置有误。在NAT模式下如果虚拟机没有拿到IP可以尝试手动触发DHCPnmcli connection modify ens33 ipv4.method auto nmcli connection up ens333.3 静态IP的配置方法如果你需要给虚拟机配置静态IP比如做服务器实验可以用nmcli命令nmcli connection modify ens33 ipv4.method manual \ ipv4.addresses 192.168.100.10/24 \ ipv4.gateway 192.168.100.1 \ ipv4.dns 192.168.100.1 nmcli connection up ens33这里要注意静态IP的网段必须和虚拟网络编辑器里设置的网段一致。比如VMware的NAT模式默认网段是192.168.100.0/24你配的静态IP就必须是192.168.100.x网关是192.168.100.1也就是VMnet8的地址。配错了网段主机和虚拟机就不在同一个逻辑网络里自然ping不通。注意CentOS 8里传统的/etc/sysconfig/network-scripts/ifcfg-ens33文件仍然存在但如果你用nmcli修改了配置直接编辑这个文件可能不会立即生效。推荐统一用nmcli来管理避免两套配置打架。4. 主机侧的关键检查虚拟网卡和防火墙虚拟机里面的配置确认没问题之后如果主机还是ping不通虚拟机问题大概率出在主机这一侧。这一侧有两个重点虚拟网卡的状态和主机防火墙的设置。4.1 确认主机上的虚拟网卡已启用在Windows主机上打开网络连接可以在运行框输入ncpa.cpl快速打开你会看到VMware Virtual Ethernet Adapter for VMnet8NAT模式或VMnet1仅主机模式。检查这个网卡是否处于已启用状态。如果显示已禁用右键启用即可。另外检查它的IP地址是否和虚拟机在同一网段NAT模式VMnet8的地址通常是192.168.x.1虚拟机应该是192.168.x.其他仅主机模式VMnet1的地址通常是192.168.x.1虚拟机应该是192.168.x.其他如果VMnet8的地址是169.254.x.x这种自动私有地址说明它没有正确获取到配置可以在虚拟网络编辑器里点击还原默认设置来重置。4.2 Windows防火墙的ICMP放行Windows防火墙默认会阻止ICMP回显请求这就是为什么主机ping不通虚拟机的一个常见原因。解决方法有两种第一种是临时关闭防火墙测试不推荐长期关闭# 以管理员身份运行PowerShell Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False第二种是只放行ICMP协议推荐# 以管理员身份运行PowerShell New-NetFirewallRule -DisplayName Allow ICMPv4-In -Protocol ICMPv4 -IcmpType 8 -Direction Inbound -Action Allow这条命令的意思是创建一个入站规则允许ICMPv4类型的第8种消息也就是回显请求即ping请求通过。4.3 Linux主机的防火墙处理如果你的主机是Linux系统防火墙规则用firewalld或iptables管理。以firewalld为例# 放行ICMP firewall-cmd --permanent --add-icmp-block-inversion firewall-cmd --reload或者更直接地把虚拟网卡所在的区域设为trustedfirewall-cmd --permanent --zonetrusted --add-interfacevmnet8 firewall-cmd --reload4.4 虚拟机内部防火墙的放行CentOS 8默认启用了firewalld它同样会阻止ICMP请求。在虚拟机里执行# 查看当前防火墙状态 systemctl status firewalld # 临时放行ICMP重启后失效 firewall-cmd --add-icmp-block-inversion # 永久放行 firewall-cmd --permanent --add-icmp-block-inversion firewall-cmd --reload或者简单粗暴地临时关闭防火墙来验证问题systemctl stop firewalld如果关闭防火墙后能ping通说明问题确实在防火墙规则上然后再按上面的方法配置放行规则。5. 完整排查链路从ping不通到ping通的每一步前面讲了各个模块的配置方法现在我把整个排查过程串起来按照从简到繁的顺序一步步定位问题。5.1 第一步确认双方IP地址和网段在虚拟机里执行ip addr在主机上执行ipconfigWindows或ip addrLinux把两边的IP地址记下来。判断标准两个IP地址必须在同一网段。比如虚拟机是192.168.100.10/24主机VMnet8是192.168.100.1/24它们就在同一网段。如果虚拟机是10.0.0.5主机VMnet8是192.168.100.1那肯定ping不通。5.2 第二步从虚拟机ping主机先在虚拟机里ping主机的VMnet8地址ping -c 4 192.168.100.1如果这一步不通说明虚拟机到主机的方向有问题。检查虚拟机的网关是否指向了这个地址以及主机防火墙是否放行了ICMP。5.3 第三步从主机ping虚拟机在主机上ping虚拟机的IPping 192.168.100.10如果虚拟机ping主机通但主机ping虚拟机不通重点检查虚拟机内部的防火墙。因为ICMP回显请求是入站方向虚拟机的firewalld默认会拦截。5.4 第四步用tcpdump抓包确认ICMP是否到达如果两边防火墙都关了还是不通可以在虚拟机上用tcpdump抓包tcpdump -i ens33 icmp然后在主机上ping虚拟机。如果tcpdump能看到请求包但没有回复包说明请求到达了虚拟机但虚拟机没有回应问题在虚拟机的网络栈或防火墙。如果tcpdump什么都看不到说明请求根本没到达虚拟机问题在虚拟网络层面比如虚拟网卡没启用、网段不对。5.5 第五步检查虚拟网络编辑器的设置打开虚拟网络编辑器确认NAT模式或仅主机模式的网段设置以及DHCP范围。有时候DHCP范围设置得太小虚拟机拿不到地址也会导致ping不通。排查步骤命令/操作预期结果异常处理确认IPip addr / ipconfig双方同网段检查虚拟网络编辑器网段虚拟机ping主机ping 网关地址有回复检查主机防火墙主机ping虚拟机ping 虚拟机IP有回复检查虚拟机防火墙抓包验证tcpdump -i ens33 icmp看到请求和回复根据方向判断问题侧检查虚拟网卡ncpa.cpl网卡已启用启用网卡或还原默认设置6. 几个容易忽略的细节和踩坑经验排查了这么多年的虚拟机网络问题有几个坑是反复出现的单独拎出来说一下。6.1 虚拟机克隆后MAC地址冲突如果你是从另一台虚拟机克隆出来的克隆后的虚拟机可能和原虚拟机有相同的MAC地址。在NAT模式下这会导致网络异常。解决方法是在虚拟机设置里重新生成MAC地址然后在CentOS 8里删除旧的连接配置重新创建nmcli connection delete ens33 nmcli connection add type ethernet ifname ens33 con-name ens33 nmcli connection up ens336.2 VMware Tools或open-vm-tools的影响安装了VMware Tools或open-vm-tools之后虚拟机的网络适配器可能会被识别为不同的设备名。有时候ens33会变成ens160或其他名字。用nmcli device status确认实际的设备名不要死记ens33。6.3 主机有多张网卡时的路由问题如果主机同时连接了有线和无线网络虚拟网络编辑器可能会绑定到错误的物理网卡上。在虚拟网络编辑器的桥接到设置里明确指定要桥接的物理网卡避免路由混乱。6.4 CentOS 8的NetworkManager和network-scripts冲突如果你手动编辑了/etc/sysconfig/network-scripts/ifcfg-ens33然后又用nmcli修改了配置可能会出现两套配置不一致的情况。建议统一用nmcli管理或者统一手动编辑文件后用nmcli connection reload重新加载。6.5 ping通之后SSH连不上有时候ping通了但SSH连不上。这通常是SSH服务没启动或者端口被防火墙拦截。检查systemctl status sshd firewall-cmd --list-all如果sshd没启动systemctl start sshd并设置开机自启。如果防火墙拦截了22端口用firewall-cmd --permanent --add-servicessh放行。7. 关于虚拟机网络配置的一点个人体会折腾虚拟机网络这些年我最大的体会是不要一上来就改配置文件。很多人遇到ping不通第一反应是去搜CentOS 8 静态IP配置然后照着教程改了一堆参数结果越改越乱。正确的做法是先确认网络模式再看IP地址最后查防火墙。这个顺序能帮你排除掉大部分问题。另外CentOS 8已经是一个比较老的版本了它的NetworkManager配置方式和CentOS 7有区别和后来的CentOS Stream 8/9也有差异。如果你在网上搜到的教程用的是systemctl restart network那大概率是CentOS 7的教程直接套用到CentOS 8上可能会报错。遇到这种情况把命令换成nmcli connection up ens33或者systemctl restart NetworkManager试试。最后分享一个我常用的验证方法在虚拟机里开一个终端跑tcpdump -i ens33 icmp然后在主机上ping虚拟机。如果tcpdump有输出但ping还是超时问题在虚拟机的回应环节如果tcpdump没输出问题在请求到达虚拟机的环节。这一招能快速把问题范围缩小一半比盲目改配置高效得多。