Linux虚拟机NAT模式无法上网,核心原因逃不出这三类:网卡没激活、IP与NAT网段不一致、网关或DNS配置错误,先从虚拟网络编辑器查网段,再用 ip addr 和 ip route 定位,最后改配置,九成问题都能解决。
Linux虚拟机NAT模式设置:先确认虚拟网卡和网段是否同步
NAT模式下,宿主机承担“虚拟路由器”的角色,虚拟机的流量通过宿主机的虚拟网卡转发出去,虚拟机IP必须落在宿主机虚拟网卡的子网里,很多人直接拷贝网上的配置,把IP写成 168.1.100,但VMware的VMnet8默认网段是 168.30.0,VirtualBox的NAT网段又是 0.2.0,对不上自然上不了网。
查看当前虚拟机的网卡状态
先别急着改文件,执行以下命令:
ip addr ip route show
- 如果只看到
lo,说明网卡没启用,用sudo ip link set ens33 up拉起网卡,然后运行sudo dhclient ens33尝试自动获取IP。 - 如果网卡有IP但
default via没有,或者网关IP根本不是虚拟网卡的网关,问题就清楚了。
核对虚拟网络编辑器里的网段
VMware用户打开“编辑”->“虚拟网络编辑器”,选中VMnet8,查看“子网IP”字段,点击“NAT设置”,能看到真正的网关IP,通常是 168.30.2,VirtualBox用户则在“全局设定”->“网络”里查看NAT网络的CIDR,默认是 0.2.0/24,网关固定为 0.2.2。
常见情况是虚拟机手动配置了静态IP,但前缀(掩码)写错,导致系统认为网关不在同一子网,比如IP是 168.30.100,掩码却写成 255.255.0 以外的值,路由表就会乱掉,建议先用DHCP验证通不通,再谈静态IP。
VMware NAT模式静态IP配置后无法上网?网关和DNS是重点
手动配置静态IP时,最容易把网关写成宿主机IP,或者干脆不写网关,VMware NAT模式下的网关是VMnet8网卡的IP,不是物理路由器的 168.1.1。业内专家指出,NAT模式下故障排查应按“网卡 -> 网关 -> DNS -> 防火墙”的顺序来,不要一上来就怀疑DNS。
用三条命令快速定位
ip route show # 看默认路由是否指向VMnet8网关 ping 192.168.30.2 # 替换成你的NAT网关,不通就是网段或网关问题 ping 8.8.8.8 # 通而域名不通,基本是DNS配置问题
- 网关ping不通,先确认宿主机VMnet8网卡是否启用了,Windows下在“网络连接”里看有没有VMnet8,如果禁用了解除禁用。
- 如果网关能通但外网IP不通,检查VMware的NAT服务,服务名通常是“VMware NAT Service”,在Windows服务列表里设为自动启动并运行中。
不同发行版的静态IP配置写法
以Ubuntu 22.04的netplan和CentOS系的ifcfg文件为例,配置关键项必须包含地址、网关和DNS:
| 系统 | 文件路径 | 关键参数 |
|---|---|---|
| Ubuntu 22.04 | /etc/netplan/01-netcfg.yaml |
addresses、routes、nameservers |
| CentOS 7/8 | /etc/sysconfig/network-scripts/ifcfg-ens33 |
IPADDR、GATEWAY、DNS1 |
Ubuntu的netplan示例:
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses: [192.168.30.100/24]
routes:
- to: default
via: 192.168.30.2
nameservers:
addresses: [223.5.5.5, 119.29.29.29]
保存后执行 sudo netplan apply,注意老教程里的 gateway4 已经弃用,用 routes 替代。
CentOS的ifcfg文件示例:
DEVICE=ens33 BOOTPROTO=static IPADDR=192.168.30.100 NETMASK=255.255.255.0 GATEWAY=192.168.30.2 DNS1=223.5.5.5 ONBOOT=yes
修改后执行 systemctl restart NetworkManager 或 systemctl restart network(看系统版本),如果同时启用了NetworkManager和network服务,可能会相互干扰。
Linux虚拟机NAT模式DNS配置与NetworkManager冲突
能ping通网关和外网IP,但curl baidu.com报“Could not resolve host”,多半是DNS没配好,NAT模式下,VMware和VirtualBox的DHCP都会下发自己的DNS(比如VMware的 168.30.2,VirtualBox的 0.2.3),一般不需要手动写。
检查resolv.conf是否被覆盖
/etc/resolv.conf 是软链接时,手动写入的内容重启后会没,用 ls -l /etc/resolv.conf 查看,如果指向 ../run/systemd/resolve/stub-resolv.conf,说明由systemd-resolved管理,此时应该用 nmcli 或 netplan 配置DNS,而不是直接编辑该文件。
行业共识认为,对于纯上网场景,直接用DHCP自动获取DNS最省事,只有当内网有自定义域名时,才需要手动指定多个DNS,5.5.5 配合内网DNS。
NetworkManager与netplan/ifcfg并存
- Ubuntu中同时使用netplan和NetworkManager,需要确定网卡由谁接管,可以在netplan配置里声明
renderer: NetworkManager,之后用nmcli con show查看连接。 - CentOS/Rocky中如果改完ifcfg文件后执行
nmcli con reload不生效,最直接的办法是nmcli con down <连接名>再nmcli con up <连接名>。
VirtualBox NAT无法上网?检查宿主机服务状态
VirtualBox的NAT模式默认网关是 0.2.2,DNS是 0.2.3,虚拟机设为“DHCP自动获取”就能上网,如果你手动改成别的网段,反而可能出问题。VirtualBox NAT无法上网时,优先确认宿主机相关服务是否在运行。
Windows宿主机上的VirtualBox服务
在“运行”里输入 services.msc,找到 VirtualBox DHCP Server 和 VirtualBox NAT Service,确认状态是“正在运行”,如果未运行,右键启动,并将启动类型改为“自动”。
虚拟机网卡设置
打开虚拟机的“设置”->“网络”,连接方式选择“NAT”,勾选“启用网络连接”,如果之前用过桥接模式或仅主机模式,切换回NAT后要重启虚拟机再试,还可以在虚拟机内执行:
sudo dhclient eth0
如果提示没有DHCP进程,改用 sudo dhcpcd eth0。
宿主机防火墙和网络管理隐藏坑
有些问题不在虚拟机里,而在宿主机防火墙,Windows防火墙或第三方安全软件可能会拦截虚拟网卡之间的转发流量,VMware和VirtualBox都安装了虚拟网卡驱动,如果安全软件把虚拟网卡当成新网络并设为“公共网络”,就会阻止NAT流量。
快速验证防火墙影响
在宿主机上临时关闭防火墙测试,VMware Workstation在较多用户反馈中,NAT不通可以尝试重启“VMware NAT Service”和“VMware DHCP Service”,具体操作:
win + r输入services.msc。- 找到VMware NAT Service,右键重启。
- 再回虚拟机执行
udhcpc或dhclient重新获取IP。
虚拟机内部的防火墙也不能完全忽略,CentOS默认启用了firewalld,可以执行:
systemctl status firewalld
如果开启,先临时关闭 systemctl stop firewalld 测试,但多数情况下,Linux虚拟机网关ping不通才是根因,防火墙反而是次要嫌疑。
最后的排查顺序建议
从实际故障看,NAT模式上不了网往往是嵌套问题:网卡被NetworkManager管理但配置没生效,或者虚拟网络编辑器里的网段被修改过,导致虚拟机里旧IP成了“孤儿IP”,建议按以下顺序操作:
- 重置虚拟网卡设置,VMware中在虚拟网络编辑器点击“还原默认设置”,VirtualBox恢复默认NAT网络。
- 虚拟机网络管理器里删除旧连接,重新通过DHCP获取。
- 确认路由表里只有一条默认路由,存在多条时手动删掉冲突的。
- 不行就重启虚拟机,注意是“客户机操作系统”重启,不是挂起后恢复。
记住一句话:NAT模式不是桥接,IP段、网关、DNS每一项都依赖宿主机虚拟网卡,三者对齐才能上网,如果你的现象是“能ping通不能上网”或者“重启后配置丢失”,大概率就是NetworkManager或netplan的接管问题。
关于Linux虚拟机NAT模式无法上网的常见问题
为什么我的Linux虚拟机NAT模式设置成静态IP后,每次重启都变回DHCP?
因为网卡仍由NetworkManager管理,且连接配置里选择了“自动连接”加“DHCP”,你需要在nmcli con edit里修改IP地址为静态,或者用nmcli con mod命令指定ipv4.method manual,只改ifcfg文件而不重启网络服务,会被NetworkManager覆盖。
我把网关写成了宿主机IP,为什么ping不通外网?
NAT模式的网关不是宿主机IP,而是虚拟网卡本身的IP,宿主机IP用于和虚拟机通信,但虚拟机的默认路由必须指向虚拟网卡IP,例如VMware的 168.30.2,如果写成物理网卡的 168.1.1,数据包出了虚拟机却找不到对应路由,自然丢包。
VirtualBox NAT模式下需要手动配置DNS吗?
不需要,VirtualBox自带的DHCP会下发 0.2.3 作为DNS,这个地址由VirtualBox内置DNS代理提供,能解析外网域名,只有当你用NAT模式但关闭了DHCP时,才需要手动填DNS,通常设为公共DNS如 5.5.5 即可,据VirtualBox官方手册,NAT模式的核心就是无需任何手动物理网络配置,虚拟机通过DHCP获得IP是默认行为。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/737396.html




