虚拟机从 VMware 迁移到云宏后无法访问外网:一张缺失的默认路由

故障背景

一台运行 RHEL 8(Red Hat 8 / Rocky 8 / AlmaLinux 8 等同系发行版)的数据库服务器,从 VMware 平台整体迁移到云宏虚拟化平台后,出现无法访问外网的问题。具体表现为:
  • 同网段 IP(10.20.146.254)可以 ping 通
  • 跨网段 IP(10.20.141.254)提示 Network is unreachable
  • route -n 路由表中完全没有默认路由(0.0.0.0 那一行)
  • ifcfg-ens3 配置文件中的 IP、掩码、网关信息全部正确
在 VMware 环境中原虚拟机网络完全正常,迁移后才出现此问题。

排查过程

第一层:检查 NetworkManager 中的连接状态

nmcli connection show ens3 | grep -E "gateway|never-default|method"
发现三个异常:
ipv4.gateway:       --
ipv4.never-default: yes
ipv4.method:        auto
分析:
  • ipv4.gateway 为空,说明 NetworkManager 没有读取到 ifcfg 文件中的 GATEWAY= 配置。
  • ipv4.never-default: yes 表示"不将此连接作为默认路由使用",这就是路由表中没有 0.0.0.0 的直接原因。
  • ipv4.method: auto 说明 NetworkManager 仍在使用 DHCP 模式,手动写入的网关会被忽略。
尝试过 nmcli connection modify 手动修改 ipv4.never-default 为 no,但每次 down / up 连接后该值又自动恢复为 yes。这是因为在 auto 模式下,NetworkManager 以 DHCP 行为为优先,手动修改不会持久化。

第二层:排查 cloud-init 干扰

考虑到部分云平台会使用 cloud-init 管理网络,执行了以下检查:
systemctl status cloud-init
输出:Unit cloud-init.service could not be found.
确认 cloud-init 不存在,排除干扰。

第三层:发现真正的元凶

进一步检查全局网络配置文件:
cat /etc/sysconfig/network
输出:
NETWORKING=yes
HOSTNAME=FBGL-DB-140-115
GATEWAYDEV=ens192
GATEWAY=10.20.140.254
NOZEROCONF=yes
关键发现: 全局配置中 GATEWAYDEV=ens192,指定了默认路由由 ens192 这张网卡提供。而迁移到云宏后,网卡名称已经变为了 ens3,ens192 这张设备根本不存在了。
系统在全局层面"等待"一个不存在的网卡来提供默认路由,因此无论怎么修改 ifcfg-ens3,路由表里都不会出现 0.0.0.0。

为什么 VMware 里没有这个问题?

在 VMware 环境中,该网卡的设备名本身就是 ens192,全局配置中的 GATEWAYDEV=ens192 与实际设备名一致,默认路由可以正常生成。迁移到云宏后,底层虚拟网卡硬件标识改变,系统将其识别为 ens3,但全局配置文件没有同步更新,导致设备名错位。

解决方案

修改 /etc/sysconfig/network 文件,将 GATEWAYDEV 和 GATEWAY 更新为当前实际网卡的信息:
sed -i 's/GATEWAYDEV=ens192/GATEWAYDEV=ens3/' /etc/sysconfig/network
sed -i 's/GATEWAY=10.20.140.254/GATEWAY=10.20.146.254/' /etc/sysconfig/network
修改后文件内容:
NETWORKING=yes
HOSTNAME=FBGL-DB-140-115
GATEWAYDEV=ens3
GATEWAY=10.20.146.254
NOZEROCONF=yes
重启网络使配置生效:
nmcli connection down ens3 && nmcli connection up ens3

验证结果

# 查看路由表
route -n
输出中出现了默认路由:
0.0.0.0         10.20.146.254   0.0.0.0         UG    100    0        0 ens3
10.20.146.0     0.0.0.0         255.255.255.0   U     100    0        0 ens3
# 测试跨网段连通性
ping 10.20.141.254
跨网段 ping 通,外网访问恢复正常。

经验总结

  1. 虚拟机跨平台迁移后,网卡名称可能发生变化(受驱动类型、MAC 地址、PCI 插槽位置等因素影响),不能想当然地认为网卡名保持不变。
  2. /etc/sysconfig/network 是全局网络配置文件,其中的 GATEWAYDEV 指定了哪张网卡承担默认路由。如果该设备不存在,系统将不会在任何网卡上生成默认路由。
  3. 排查此类问题时,不要只盯着 ifcfg-xxx 文件,全局配置和 NetworkManager 内存中的连接状态同样重要。
  4. 迁移完成后,建议逐一核对以下文件/信息是否一致:
    • /etc/sysconfig/network(全局网关、设备名)
    • /etc/sysconfig/network-scripts/ifcfg-*(各网卡的 IP、掩码、网关)
    • ip link show(实际网卡名称和 MAC 地址)
    • nmcli connection show(NetworkManager 中的连接配置)
阅读剩余
THE END