ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CentOS宿主机无法访问虚拟机?网络模式、防火墙与虚拟网卡排查指南

2026/9/9 11:51:58 拓冰建站 浏览量
CentOS宿主机无法访问虚拟机?网络模式、防火墙与虚拟网卡排查指南 前几天同事抱着笔记本来找我说CentOS宿主机上的VMware虚拟机里跑了一个网站虚拟机里自己访问一切正常但从宿主机浏览器打开却一直超时ping也ping不通。我第一反应就是这就是典型的“centos主机无法访问虚拟机”问题。这类问题说大不大说小不小绝大多数情况下都卡在网络模式、虚拟网卡状态、防火墙这三个环节上。今天我把这些年排查这类故障的完整思路、命令和踩坑记录整理出来涉及VMware、VirtualBox和KVM三种常见平台希望能帮你在遇到类似问题时少走弯路。1. “主机访问虚拟机”到底卡在哪一层1.1 先分清谁访问谁、用什么身份访问排查之前一定要先搞清楚访问关系的具体形态因为不同的访问方向故障点完全不一样。这里说的“主机无法访问虚拟机”一般包含三种情况第一种是物理宿主机访问安装在它上面的虚拟机比如CentOS宿主机上装VMware再用宿主机浏览器访问VMware里的Web服务第二种是局域网里的另一台物理机器访问这台宿主机上的虚拟机第三种是远程机器通过跳板机间接访问虚拟机。三种情况里宿主机访问虚拟机最常见也往往是排查的基础因为宿主机访问不通其他机器大概率也不通。另外一个容易混淆的点如果宿主机本身能ping通虚拟机但浏览器打不开网站说明“网络通了、服务没通”如果ping都不通说明“网络层就断了”。这两个方向的性质完全不同前面那种是端口、服务、防火墙问题后面那种是IP、网卡、路由、虚拟网络服务的问题。所以拿到问题先别急着敲命令先问一句到底是ping不通还是只能ping通但服务不通这会直接决定排查路径。1.2 网络模式决定了排查方向虚拟机的网络模式是排查“主机访问虚拟机”的第一把钥匙。常见的有三种桥接模式Bridge、NAT模式、仅主机模式Host-Only。它们的核心区别在于虚拟机从哪拿IP、和宿主机以及外部网络是什么关系。桥接模式相当于虚拟机和宿主机共享同一块物理网卡虚拟机就像局域网里一台独立电脑和宿主机处在同一个二层网络IP在同一网段。正常情况下宿主机和虚拟机之间天然能互访出问题多半是防火墙或者交换机端口隔离。NAT模式是把宿主机当成一个路由器虚拟机躲在宿主机的虚拟网卡后面使用一个独立的私有网段。比如VMware的默认NAT网段一般是192.168.88.0/24或192.168.111.0/24宿主机通过vmnet8网卡参与通信虚拟机通过宿主机的IP去外网。这种模式下宿主机访问虚拟机通常是通的但需要注意VMware NAT服务、DHCP服务是否正常以及防火墙有没有拦。仅主机模式则是把宿主机和虚拟机用一根“虚拟网线”直连不提供外部网络。虚拟机只有和宿主机之间的通信能力比如VMware的vmnet1网卡默认给宿主机一个192.168.111.1地址虚拟机的IP也在192.168.111.0/24里。这个模式用来做主机和虚拟机之间的通信实验最干净干扰最少。所以在脑子里先立一个坐标当前虚拟机是什么网络模式宿主机对应的虚拟网卡叫什么、IP是多少虚拟机自己的IP又是什么。下面所有排查都是围绕这个坐标展开的。2. VMware、VirtualBox、KVM的虚拟网络差别2.1 VMware WorkstationVMnet0、VMnet1、VMnet8VMware Workstation安装后会创建几块虚拟网卡名字很好认VMnet0对应桥接模式VMnet1对应仅主机模式VMnet8对应NAT模式。打开“编辑”——“虚拟网络编辑器”就能看到它们的网段和DHCP设置。很多人在CentOS宿主机上装了VMware结果发现找不到VMnet1或VMnet8的IP原因往往是VMware的虚拟网络服务没有启动或者是安装后没有正确配置。特别要提醒一点如果你在Windows主机上装了VMware同时又在“Windows功能”里开启了Hyper-V或者Windows自带的内存完整性开了“内核隔离”VMware的虚拟网络会经常出幺蛾子表现为VMnet1/VMnet8接口地址消失、虚拟机网络时好时坏甚至启动虚拟机都报“VMware Workstation无法连接到虚拟机”。这类问题不是虚拟机配置错误而是宿主机虚拟化平台冲突需要把Hyper-V相关功能关掉或者换用VirtualBox等兼容方案。VMware NAT模式下两个关键服务要关注一个是“VMware NAT Service”一个是“VMware DHCP Service”。如果NAT服务没启动虚拟机可能通过桥接或仅主机模式还能运行但NAT网段的网络一定不通。排查时可以在Windows服务管理器里看这两个服务状态也可以直接在命令行里输入services.msc查看。2.2 VirtualBoxNAT、桥接、仅主机的连接特性VirtualBox的NAT模式和VMware有一些细微分歧。VirtualBox默认的NAT网络是10.0.2.0/24虚拟机的网关是10.0.2.2这个网关地址实际上就是宿主机提供的虚拟NAT服务入口。虚拟机可以主动访问外部网络但外部和宿主机想要直接访问虚拟机默认是做不到的因为VirtualBox NAT不主动做反向直达。如果你想在VirtualBox NAT模式下让宿主机访问虚拟机里的服务通常要配置“端口转发”。比如虚拟机里有个CentOS跑着nginx端口80就可以在VirtualBox网络设置里加一条规则宿主机端口8080映射到虚拟机IP的80端口。这样宿主机访问http://127.0.0.1:8080就能到虚拟机的80端口。这种做法适合测试但不适合长期当作固定访问方式因为每次虚拟机IP变化规则可能失效。VirtualBox的Host-Only模式默认网段是192.168.56.0/24宿主机自动分配192.168.56.1虚拟机在这个网段里拿一个地址。这个模式适合宿主机访问虚拟机也适合局域网内的端口转发实验但不适合虚拟机上网。桥接模式则和VMware一样虚拟机和宿主机在同一物理广播域配置好即可互访。2.3 KVM/libvirtvirbr0默认NAT网络如果CentOS宿主机用的是KVM虚拟化一般的图形界面工具或者virsh命令行会默认创建一个名叫virbr0的虚拟网桥IP通常是192.168.122.1/24子网是192.168.122.0/24。虚拟机默认接入virbr0以NAT方式访问外网宿主机也能通过virbr0访问到虚拟机的192.168.122.x地址。KVM场景排查“主机无法访问虚拟机”先确认libvirtd服务是否在运行。执行systemctl status libvirtd如果服务没起来virbr0操作会失败虚拟机的网络自然不可用。其次确认virbr0这块虚拟网卡有没有被降级或删除可以用ip link show virbr0看状态。有时候宿主机的网络管理工具比如NetworkManager会对virbr0做“托管”导致网桥的IP地址丢失进而宿主机访问不到虚拟机。这种情况需要在NetworkManager里把virbr0设为“不受托管”或不接管该接口或者用nmcli修改连接配置。如果你的KVM虚拟机打算长期被宿主机或其他局域网机器访问建议用桥接模式把虚拟机直接放进物理局域网这样最直观IP规划也更灵活。代价是需要额外建立一个物理网卡的桥接比如br0配置复杂度会高一些。2.4 三种平台虚拟网络模式对比平台模式默认网段典型值宿主机对应接口宿主机访问虚拟机难度VMware Workstation桥接与物理局域网同段vmnet0容易同网段互访VMware WorkstationNAT192.168.88.0/24 等vmnet8较容易检查服务与防火墙VMware Workstation仅主机192.168.111.0/24vmnet1容易独立网段互访VirtualBox桥接与物理局域网同段宿主物理网卡容易同网段互访VirtualBoxNAT10.0.2.0/24vboxnet/virtual NAT较难需端口转发VirtualBox仅主机192.168.56.0/24vboxnet0容易KVM/libvirtNAT192.168.122.0/24virbr0容易KVM/libvirt桥接与物理局域网同段br0容易同网段互访这张表你可以当作排查的“坐标系”。宿主机访问不了虚拟机时先确认自己落在哪一行再看服务状态和IP配置思路会清晰很多。3. 主机访问虚拟机排查通用五步走3.1 第一步确认虚拟机内有IP且网卡已启动很多场景下问题根本不在宿主机这一侧而是虚拟机自己压根没拿到IP。尤其是CentOS 7 minimal版本安装完后默认的网卡可能是关闭状态ifcfg-ens33里的ONBOOT参数是no导致虚拟机启动后网络一直起不来。所以第一步永远是进入虚拟机执行ip addr看网卡有没有地址再看状态是不是UP。如果网卡是down的可以用ip link set ens33 up把它拉起来然后执行dhclient获取IP。如果想让它开机自动启用需要编辑/etc/sysconfig/network-scripts/ifcfg-ens33把ONBOOT改成yes并且看你自己是打算用DHCP还是静态IP。还有一个细节CentOS 7里如果同时装了NetworkManager和network.service有时候网卡会被两边抢表现为你改完配置重启网络后又失效。建议要么统一用NetworkManagernmcli要么彻底停用NetworkManager、用network.service管理避免冲突。我遇到过一个特别典型的案例虚拟机里ip addr看不到任何地址但ifconfig -a能看到ens33存在说明网卡在系统里但没被启用。原因就是ONBOOTno加NetworkManager和network.service都开着配置互相覆盖。最后我禁用NetworkManager、重启network服务IP立刻就好了。这种“没IP”造成的假性不通非常常见排查前先花一分钟确认一下能省很多时间。3.2 第二步确认宿主机虚拟网卡和DHCP/NAT服务正常如果虚拟机里已经有了IP但宿主机还是ping不通那就回到宿主机侧检查虚拟网卡。以VMware为例VMware NAT模式下宿主机应该有一块vmnet8网卡IP和虚拟机在同一个网段通常是192.168.88.1。执行ip addr show vmnet8如果看不到这个接口或者有接口但没有IP说明VMware虚拟网络配置有问题或相关服务没启动。在Windows宿主机上可以在控制面板的“网络连接”里看到VMware Network Adapter VMnet1和VMnet8。如果这两块网卡变成了“网络电缆被拔出”的状态说明VMware虚拟网络服务没工作。在Linux宿主机上装VMware View或Workstation情况类似需要检查vmnet相关的内核模块是否加载比如使用lsmod | grep vmnet。如果是刚装完VMware或重装过系统建议打开“虚拟网络编辑器”点“更改设置”把VMnet1和VMnet8的网络配置恢复默认很多时候能一次性解决NAT网络出的问题。对于VirtualBox仅主机模式对应vboxnet0接口如果没有该接口需要在全局设置——网络——仅主机网络里新建一个。对于KVM要看virbr0是否存在并且UP如果IP地址没配置用ip addr add 192.168.122.1/24 dev virbr0补上再确认libvirtd服务状态。3.3 第三步用ping和arp判断链路通到哪一层ping是所有人都能想到的命令但很多人只会ping一次就放弃了。我建议按这个顺序来先ping虚拟机IP再ping宿主机的虚拟网卡IP比如从虚拟机里ping vmnet8或virbr0再ping网关最后才考虑ping外部网站。当主机ping不通虚拟机时在宿主机上执行arp -an看看ARP缓存里有没有对应虚拟机的记录。如果有记录但ping不通说明二层通了、三层被丢包了常见原因是防火墙拦截或反向路径过滤rp_filter设置过严。如果ARP表里都没有虚拟机的MAC那就说明二层广播域不同大概率是网络模式不匹配或者虚拟机所在网卡虚拟交换机没接入正确。反过来的方向也要测从虚拟机里ping宿主机。如果虚拟机ping得通宿主机宿主机ping不通虚拟机这个“单向通”的现象基本可以锁定在防火墙或者ICMP回显限制上。Linux主机的firewalld默认规则通常不丢弃同网段ping但有些定制系统或安全加固方案会丢弃ICMP甚至丢弃来自某个网段的所有转发包。这种时候别和内核参数死磕先把两边防火墙临时关掉再测试。3.4 第四步排查宿主机与虚拟机上的防火墙和SELinux防火墙是“主机无法访问虚拟机”的重灾区。很多CentOS系统默认开着firewalld如果你在虚拟机里部署了Web服务但只开了22端口宿主机访问80端口自然被拒。检查时在目标机器上执行firewall-cmd --list-all看当前放行规则。如果服务是nginx或httpd需要放行http或https服务也可以直接加端口比如firewall-cmd --permanent --add-port80/tcp然后firewall-cmd --reload。宿主机侧的防火墙也要看。不要觉得“我访问虚拟机和宿主机防火墙有什么关系”其实在NAT模式下宿主机访问虚拟机走的是vmnet8虚拟网卡数据包同样会经过宿主机的防火墙。部分系统对虚拟网卡的入站流量有默认drop规则导致宿主机的vmnet8接口收到了虚拟机的响应包后直接丢掉。所以两侧防火墙都要检查。SELinux的影响容易被忽视。在KVM场景下libvirt和SELinux有专门的安全上下文如果SELinux状态异常虚拟机的网络设备可能无法正常创建。虚拟机内部也开启SELinux的情况下如果你改了sshd端口可能因为SELinux策略拦截导致连接失败。临时排查时可以先用setenforce 0解除限制如果问题消失再去配置对应的布尔值或策略而不是直接关闭SELinux。3.5 第五步确认目标服务真的在监听网络通了服务不通是另一类常见故障。比如宿主机能ping通虚拟机ssh却连不上提示“Connection refused”这说明网络没问题是ssh服务或端口问题。执行ss -tlnp看监听情况确认sshd进程是否在运行监听的是0.0.0.0:22还是127.0.0.1:22。如果监听在127.0.0.1说明这个服务只允许本机访问需要修改配置文件监听所有地址。如果目标是Web服务比如虚拟机里用nginx或apache做了个网站宿主机curl http://虚拟机IP时超时或拒绝就去虚拟机里执行curl http://127.0.0.1确认服务本机是否正常再确认监听端口是8000还是80。很多时候端口写错了或者nginx默认的server_name只认域名不认IP也会导致浏览器打不开。这个环节的排查本质上是“应用层”问题和虚拟网络无关。这五步走完绝大多数网络不通问题都能定位到具体环节。实际执行时不需要每次都全查找到“症状—位置”的对应关系后会快很多。4. 常见问题速查表与实际案例4.1 症状、原因、解决方向对照现象最可能原因关键排查命令解决方向虚拟机里没有IP网卡没启用、DHCP失败ip addr、nmcli device status改ONBOOTyes、dhclient宿主机没有VMnet1/VMnet8VMware服务未启动或配置丢失services.msc、ip addr重启VMware相关服务、恢复默认网络同网段ping不通防火墙、ARP异常arp -an、firewall-cmd --list-all临时关防火墙、清理ARP表能ping通但ssh连不上sshd没启动或监听地址错误ss -tlnp启动sshd、改监听0.0.0.0能ping通但Web打不开防火墙没放行80/8080端口firewall-cmd --list-all添加端口放行规则NAT模式下虚拟机不能上网VMware NAT服务未启动systemctl status vmware启动NAT服务、检查DHCPVirtualBox NAT下主机访问虚拟机失败NAT模式默认不支持宿主机直接访问VBoxManage showvminfo配置端口转发或改用桥接/仅主机KVM下宿主机访问不到虚拟机virbr0未启动或libvirtd异常systemctl status libvirtd启动libvirtd、检查virbr0桥接模式下宿主机ping不通虚拟机虚拟机或宿主机防火墙拦截ICMPfirewall-cmd、iptables -L -n放行ICMP或临时关闭防火墙表格里的方向是经验之谈但实际排查请务必先确认表格第二列的“最可能原因”在自己的环境下真的成立。这能让你快速缩小范围不至于瞎试。4.2 案例一VMware NAT模式下宿主机访问不了虚拟机Web服务有一回我在自己电脑上给一个朋友演示Nginx配置宿主机是Windows虚拟机的CentOS 7里跑了Nginx虚拟机内curl 127.0.0.1很正常但宿主机浏览器打开虚拟机的IP就一直转圈。我先ping虚拟机IP通了说明链路没问题。接着在宿主机上telnet虚拟机IP 80发现连不上判断是80端口被拦。后来我在虚拟机里firewall-cmd --list-all发现80端口没放行firewalld默认只放行了ssh。加了一条firewall-cmd --permanent --add-port80/tcp并reload之后宿主机刷新页面立刻打开。这个案例特别简单但它提醒我虚拟机网络通、宿主机也能ping通不代表服务端口就放行了。排查顺序千万别跳步。4.3 案例二桥接模式下能上网但宿主机ping不通虚拟机另一个同事的CentOS宿主机上跑VMware虚拟机用桥接模式虚拟机自己能上网但宿主机ping不通虚拟机。这个现象很奇怪因为桥接模式下虚拟机和宿主机应该在同一网段二层是通的。我进入虚拟网络编辑器一看桥接模式绑定错了物理网卡宿主机有多块网卡VMnet0绑定到了一块没有实际网络连接的网卡上虚拟机拿到的是另一块网卡对应网段的IP而宿主机访问时走了错误的虚拟网桥天然就不通。解决办法是在虚拟网络编辑器里把VMnet0的桥接目标改成正确的物理网卡重启虚拟机网络就好了。类似的坑还有物理无线网卡连接WiFi时部分无线AP开了“AP隔离”会导致同一AP下的终端之间不可互访这时候即便配置全对桥接模式也会互相ping不通。遇到这种环境换成NAT或仅主机模式就能避开问题。4.4 案例三KVM虚拟机的默认网络下宿主机访问异常用KVM管理虚拟机时默认网络是NAT模式宿主机virbr0是192.168.122.1/24虚拟机自动拿192.168.122.x地址。有次我发现宿主机ping虚拟机的192.168.122.10一直丢包但虚拟机访问宿主机却正常。查了半天发现虚拟机网络配置没问题virbr0也正常最后看内核日志才发现是libvirtd服务在主机重启后被NetworkManager接管了virbr0导致网桥的IP地址时有时无。修复方式是把NetworkManager对virbr0的管理关掉在/etc/NetworkManager/NetworkManager.conf里配置unmanaged-devicesinterface-name:virbr0然后重启NetworkManager。这个操作对KVM环境尤其重要因为virbr0是否稳定直接决定宿主机与虚拟机之间的NAT通信。5. 从零复现VMware CentOS 虚拟机网络排查与配置5.1 规划网络固定IP比DHCP更省心这个实操流程以VMware Workstation上的CentOS 7虚拟机为例目标是实现宿主机访问虚拟机里的SSH和Web服务。首先我会在虚拟网络编辑器里把NAT模式的网段固定下来比如用192.168.88.0/24同时把宿主机vmnet8的IP固定在192.168.88.1。VMware的NAT网关一般是192.168.88.2保持默认即可。为什么建议固定网段和IP因为虚拟机如果走DHCP重启后IP可能变宿主机的访问脚本、配置文件、浏览器收藏夹都会失效。而静态IP虽然要自己写配置但一次配好终身省心。在生产环境或者实验环境里我都推荐静态IP至少在“主机访问虚拟机”这个场景下是更稳的。5.2 配置虚拟机静态IP进入CentOS虚拟机编辑网卡配置文件。先确认网卡名执行ip addr看到类似ens33、ens160这样的名字。然后vi /etc/sysconfig/network-scripts/ifcfg-ens33内容大致如下TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.88.130 NETMASK255.255.255.0 GATEWAY192.168.88.2 DNS1192.168.88.2DNS这里我习惯写虚拟机的网关地址因为NAT模式中网关本身就是DNS转发器只要宿主机能上网虚拟机一般也能解析域名。如果DNS解析出问题可以再补一个公共DNS备用。保存后执行systemctl restart network或者nmcli connection reload然后ip addr确认新IP生效。5.3 配置宿主机访问与防火墙放行虚拟机里要开启sshd并放行SSH和Web端口。如果你用的CentOS 7一般sshd是默认启动的但保险起见执行systemctl status sshd确认一下。然后执行systemctl start sshd systemctl enable sshd firewall-cmd --permanent --add-port22/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload宿主机侧如果使用的是CentOS且开启了firewalld访问虚拟机的流量走vmnet8网卡一般不需要额外放行但如果你发现宿主机ping虚拟机回显不通可以先临时systemctl stop firewalld测试。生产环境不建议直接关改成放开vmnet8网段或对应端口更合适。如果是Windows宿主机Windows防火墙偶尔也会拦VMware虚拟网卡的入站流量排查时同样可以先临时关闭防火墙试一下。5.4 最终验证在宿主机上依次执行ping 192.168.88.130 ssh root192.168.88.130 curl http://192.168.88.130如果ping通、ssh能连、curl能返回nginx或apache页面就说明整个链路都是通的。如果curl失败但ssh正常那就是Web服务或80端口的问题回到防火墙和服务监听状态复查。如果ssh和curl都正常但浏览器访问超时就要看宿主机是否有代理设置、浏览器是否走了系统代理这类“环境干扰”也经常坑人。6. 排查这类问题最实用的几个习惯说几个比较个人的习惯也算这些年踩坑踩出来的经验。第一个习惯是“改配置前先备份改完一步验证一步”。不管是改虚拟机的ifcfg文件还是在虚拟网络编辑器里调整网段全部改动前先拷贝原配置。很多人一顿操作猛如虎结果越改越乱最后都忘了自己动过什么这种时候回退起来特别痛苦。第二个习惯是“临时测试关防火墙最终回归开白名单”。我遇到网络问题会先把防火墙临时关掉确认问题是否在防火墙这一层。确认之后再把防火墙打开用最小化放行策略把对应网段或端口放开。这样既有排查效率又不至于给系统留一个裸奔口子。还有一个习惯多平台共存时保留一份虚拟网络配置的截图或文档。VMware的虚拟网络编辑器、VirtualBox的仅主机网络设置、KVM的virbr0网段这些配置一旦重新安装软件或重启宿主机就容易被重置提前记录下来会省很多时间。尤其是你同时装了VMware和VirtualBox两者默认NAT网段可能撞车轻则虚拟机IP冲突重则互相把虚拟网卡搞乱提前规划好网段能避开这种坑。最后再分享一个小技巧宿主机访问虚拟机这类问题别一上来就重装虚拟机、重装虚拟化软件。把网络模式、IP、虚拟网卡服务、防火墙、服务监听这五件事过一遍绝大多数问题都能定位。把这些命令熟练到肌肉记忆之后处理起来也就五分钟的事。希望这篇内容能帮你少走一些我当时走过的弯路。