最近内网里几台机器陆续出现问题,特点很一致:
机器本身没改什么配置,却突然大量出现 host unreachable,容器、虚拟机、宿主机网络表现都不正常。
排查思路
因为最近刚更换了旁路由,而且网络是通过旁路由作为默认网关,所以优先怀疑:
路由器侧网关 IP 是指向旁路由的,旁路由IP变了,但部分机器没有正确刷新默认路由。
果然后面查路由表发现,问题就是这个。
典型表现包括:
- 旧网关还残留在默认路由里
- 新旧两个默认网关同时存在
- 宿主机表面能用,但 Docker bridge / PVE VM 先出问题
怎么确认
先看默认路由:
ip route
如果最近网关从 192.168.1.3 切到 192.168.1.4,而机器里还看到:
default via 192.168.1.3 ...
或者同时看到 1.3 和 1.4,基本就定位到了。
怎么解决
1. Ubuntu / 普通 Linux 宿主机
删除旧默认网关,只保留新网关:
sudo ip route del default via 192.168.1.3 dev eno2
必要时手动加回新网关:
sudo ip route add default via 192.168.1.4 dev eno2
2. Docker 宿主机
如果 Docker bridge 容器异常,先修宿主机默认路由。
这类问题很多时候不是 DNS,而是 宿主机默认路由残留导致 NAT 出网异常。
修完宿主机路由后,一般 Docker 就恢复了。
3. PVE Host
如果 PVE 宿主机网关还指向旧地址,改成新的:
ip route del default via 192.168.1.3 dev vmbr0
ip route add default via 192.168.1.4 dev vmbr0
4. PVE 网桥 / VM
如果 PVE 宿主机恢复了,但 VM 还是不通,通常还要刷新一遍防火墙桥状态:
systemctl restart pve-firewall
如果 VM 开了 firewall,这一步尤其关键。
结论
这次问题本质不是 Docker 坏了,也不是 PVE 坏了,而是:
旁路由切换后,默认网关变了,但部分机器没有及时刷新网络状态。
排查这类问题,先别急着看 DNS、容器、虚拟机,第一步先看:
ip route
很多时候问题就在那里。