解决虚拟机网络不通的问题: IP 与 DHCP 篇
在日常开发或运维工作中,虚拟机(VMware、VirtualBox 等)是我们不可或缺的利器。但相信每个人都遇到过这个令人抓狂的场景:昨天还好好的虚拟机,今天一打开突然连不上网了!
面对虚拟机网络不通的问题,很多人第一时间会去检查宿主机的网络、重启虚拟机软件,甚至重装系统。其实,很多时候问题并没有那么复杂,仅仅是虚拟机内部的网络配置“闹了脾气”。
本文将带你把目光聚焦于虚拟机内部,从 IP 和 DHCP 的角度,手把手教你一步步排查并解决网络不通的顽疾。
第一步:网卡有 IP 吗?
网络不通的本质,往往是数据包出不去。而数据包想出去,网卡必须得有一个合法的 IP 地址。我们可以通过以下命令查看当前网卡的 IP 情况:
ip a # 或者使用老牌命令 ifconfig -a
在输出的列表中,重点关注你的主网卡(通常是 ens33、eth0 或 ens160 等),寻找 inet 关键字:
场景 A:有 IP(例如 inet 192.168.x.x)
如果你看到了合法的 IP 地址,说明网卡已经成功获取了 IP,问题可能出在路由上(见第二步)。
场景 B:没有 IP,只有 <BROADCAST,MULTICAST>
如果你发现主网卡状态是 UP,但根本没有 inet 这一行,说明网卡压根没拿到 IP!请直接跳转至第三步。
第二步:有 IP 却 Ping 不通网关?查查路由!
有时候网卡明明有了 IP(比如 192.168.100.101),但 ping 8.8.8.8 不通,甚至连网关 ping 192.168.100.2 都不通。这时候极有可能是路由表配置错误,系统不知道该把数据包往哪发。
检查默认路由(网关):
ip route show default
正常情况下,你应该能看到类似这样的输出:
default via 192.168.100.2 dev ens33
如果:
- 没有输出:说明没有配置默认网关,系统无法访问外网。
- 网关 IP 错误:比如网关指向了
192.168.100.1,但在 NAT 模式下,VMware 的网关通常是.2(即192.168.100.2),这就会导致数据包发往错误的地址。
修复方法(临时添加默认路由):
sudo ip route add default via 192.168.100.2
第三步:没有 IP?手动唤醒 DHCP 客户端
如果第一步发现网卡没有 IP,最常见的原因是虚拟机启动时,DHCP 请求超时或未发起。我们可以尝试手动向 DHCP 服务器重新请求 IP:
sudo dhclient -v
注意加 -v 参数,它会输出详细的请求过程,这对于排查问题至关重要:
- 成功的情况:你会看到
DHCPDISCOVER->DHCPOFFER->DHCPREQUEST->DHCPACK,最后提示获得了 IP 地址。此时再ip a查看,应该就有 IP 了。 - 失败的情况:如果卡在
DHCPDISCOVER并最终提示No DHCPOFFERS received,说明虚拟机根本联系不到宿主机的 DHCP 服务。此时需要检查:- 宿主机的 VMware DHCP Service / VirtualBox DHCP 服务是否正常运行?
- 虚拟机的网络适配器是否设置为了“仅主机模式(Host-Only)”却没开 DHCP?
- 虚拟机内部的网卡配置文件是不是被改成了
static或者disabled?
第四步:DHCP 彻底罢工?静态 IP 来兜底
如果 DHCP 始终失败,或者你的工作场景需要固定 IP,我们可以手动配置静态 IP。
以最常见的 NAT 模式为例(NAT 网关通常是 192.168.x.2),我们可以临时给网卡塞一个 IP 和网关:
# 添加 IP 和子网掩码
sudo ip addr add 192.168.100.100/24 dev ens33
# 添加默认网关
sudo ip route add default via 192.168.100.2
配置完后,尝试 ping 一下网关,如果通了,说明网络链路本身没问题,纯粹是之前 IP 获取失败导致的。
⚠️ 注意:这只是临时方案! 一旦重启系统,这些配置就会灰飞烟灭。想要永久生效,必须修改配置文件:
Ubuntu 系统(Netplan):
编辑 /etc/netplan/ 目录下的 .yaml 文件(如 00-installer-config.yaml):
network:
ethernets:
ens33:
dhcp4: no
addresses: [192.168.100.100/24]
routes:
- to: default
via: 192.168.100.2
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
version: 2
然后执行 sudo netplan apply 使其生效。
CentOS / RHEL 系统:
编辑 /etc/sysconfig/network-scripts/ifcfg-ens33:
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=8.8.8.8
第五步:终极一招——重启网络服务
当你修改了配置文件,或者网络状态“玄学”卡死的时候,重启虚拟机内部的网络服务往往能解决 90% 的疑难杂症。不同的 Linux 发行版使用的网络管理工具不同,请对号入座:
1. 使用 NetworkManager 的系统(大多数现代桌面版及 CentOS 7+):
sudo systemctl restart NetworkManager
2. 使用 systemd-networkd 的系统(常见于 Ubuntu Server 18.04+ 等云镜像):
sudo systemctl restart systemd-networkd
3. 老旧系统(基于 sysvinit,如 CentOS 6、Ubuntu 14.04):
sudo service networking restart
# 或者
sudo /etc/init.d/networking restart
总结
虚拟机网络不通不要慌,按照以下逻辑链路排查,往往能药到病除:
ip a看有没有 IP -> 没有 IP 则查 DHCPping网关通不通 -> 不通则ip route查路由dhclient -v抓包看 DHCP 过程 -> 定位是宿主机还是虚拟机的问题- 临时配静态 IP 验证链路 -> 没问题则写入永久配置文件
- 最后,别忘了万能的
systemctl restart network
排查虚拟机网络问题,本质上是理解数据包从网卡出发,经过路由,到达网关的过程。掌握了这个逻辑,以后不管遇到什么网络奇葩问题,都能顺藤摸瓜,找到症结所在!