解决虚拟机网络不通的问题: IP 与 DHCP 篇

在日常开发或运维工作中,虚拟机(VMware、VirtualBox 等)是我们不可或缺的利器。但相信每个人都遇到过这个令人抓狂的场景:昨天还好好的虚拟机,今天一打开突然连不上网了!

面对虚拟机网络不通的问题,很多人第一时间会去检查宿主机的网络、重启虚拟机软件,甚至重装系统。其实,很多时候问题并没有那么复杂,仅仅是虚拟机内部的网络配置“闹了脾气”。

本文将带你把目光聚焦于虚拟机内部,从 IP 和 DHCP 的角度,手把手教你一步步排查并解决网络不通的顽疾。

第一步:网卡有 IP 吗?

网络不通的本质,往往是数据包出不去。而数据包想出去,网卡必须得有一个合法的 IP 地址。我们可以通过以下命令查看当前网卡的 IP 情况:

ip a   # 或者使用老牌命令 ifconfig -a

在输出的列表中,重点关注你的主网卡(通常是 ens33eth0ens160 等),寻找 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

如果:

  1. 没有输出:说明没有配置默认网关,系统无法访问外网。
  2. 网关 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 服务。此时需要检查:
    1. 宿主机的 VMware DHCP Service / VirtualBox DHCP 服务是否正常运行?
    2. 虚拟机的网络适配器是否设置为了“仅主机模式(Host-Only)”却没开 DHCP?
    3. 虚拟机内部的网卡配置文件是不是被改成了 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

总结

虚拟机网络不通不要慌,按照以下逻辑链路排查,往往能药到病除:

  1. ip a 看有没有 IP -> 没有 IP 则查 DHCP
  2. ping 网关通不通 -> 不通则 ip route 查路由
  3. dhclient -v 抓包看 DHCP 过程 -> 定位是宿主机还是虚拟机的问题
  4. 临时配静态 IP 验证链路 -> 没问题则写入永久配置文件
  5. 最后,别忘了万能的 systemctl restart network

排查虚拟机网络问题,本质上是理解数据包从网卡出发,经过路由,到达网关的过程。掌握了这个逻辑,以后不管遇到什么网络奇葩问题,都能顺藤摸瓜,找到症结所在!

THE END