双DHCP接口路由冲突导致网络间歇性延迟问题求助
问题描述
我用LXD和cloud-init配置了一个实例,它有两个通过DHCP分配IP的网络接口:
- eth0(10.23.44.177/24):连接到主机的lxdbr0网桥,用于访问互联网
- enp5s0(192.168.100.179):连接到无互联网访问的私有LAN节点
现在遇到的问题是:ping 8.8.8.8或者私有LAN内的IP时,都会出现严重的间歇性延迟——经常10秒左右不通,偶尔才能ping通一次。但只要关掉其中一个接口,另一个就能完全正常工作。我确定是路由配置出了问题。
相关系统信息
路由表输出
$ ip route s default via 192.168.100.1 dev enp5s0 proto dhcp src 192.168.100.179 metric 100 default via 10.23.44.1 dev eth0 proto dhcp src 10.23.44.177 metric 100 10.23.44.0/24 dev eth0 proto kernel scope link src 10.23.44.177 10.23.44.1 dev eth0 proto dhcp scope link src 10.23.44.177 metric 100 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.179 192.168.100.1 dev enp5s0 proto dhcp scope link src 192.168.100.179 metric 100
网络接口输出
$ ifconfig enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.179 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::216:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link> ether 00:16:3e:xx:xx:xx txqueuelen 1000 (Ethernet) RX packets 144 bytes 15102 (15.1 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 705 bytes 55690 (55.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.23.44.177 netmask 255.255.255.0 broadcast 10.23.44.255 inet6 fd42:45c6:df12:80cb:216:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x0<global> inet6 fe80::216:3eff:xxxx:xxxx prefixlen 64 scopeid 0x20<link> ether 00:16:3e:12:xx:xx txqueuelen 1000 (Ethernet) RX packets 15620 bytes 95337338 (95.3 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10186 bytes 740093 (740.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 182 bytes 17262 (17.2 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 182 bytes 17262 (17.2 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
问题分析与解决办法
Hey,这问题一眼就能看出来是双默认路由冲突搞的鬼!你看路由表里有两条优先级完全相同(metric都是100)的默认路由,系统发往外网的流量会随机选其中一条走。当它选到enp5s0的时候,因为这个接口连的是没网的私有LAN,数据包直接就丢了,等系统重试切换到eth0的路由时才能通,这就是你看到间歇性卡顿的原因。
1. 临时修复(立即生效,重启后失效)
先把enp5s0的默认路由删掉,马上就能恢复正常:
sudo ip route del default via 192.168.100.1 dev enp5s0
这时候再看路由表,默认路由就只剩eth0那条了。外网流量会正常走eth0出去,而私有LAN的192.168.100.0/24段因为有直连路由,会自动走enp5s0,两边都能正常通信。
2. 永久修复(重启后不会复发)
因为你是通过DHCP自动获取IP,所以得让enp5s0的DHCP客户端不要请求默认路由,不同系统配置方式不一样,给你几种常用的:
方式一:Debian/Ubuntu系(用dhclient)
编辑/etc/dhcp/dhclient.conf,添加针对enp5s0的配置:
interface "enp5s0" { supersede routers ""; }
然后重启网络服务:
sudo systemctl restart networking
方式二:使用NetworkManager管理网络
直接用nmcli修改连接配置:
# 让enp5s0不设置默认路由 sudo nmcli connection modify enp5s0 ipv4.never-default yes # 重新加载配置生效 sudo nmcli connection up enp5s0
方式三:从LXD cloud-init源头解决
既然你是用cloud-init初始化实例,直接在cloud-init的网络配置里指定enp5s0不设置默认路由,以后新建实例也不会有这个问题:
network: ethernets: eth0: dhcp4: true enp5s0: dhcp4: true dhcp4-overrides: never-default: true # 禁止该接口生成默认路由 version: 2
3. 验证修复效果
执行ip route s确认只有eth0的默认路由,然后分别ping 8.8.8.8和私有LAN内的IP,确认都能稳定通信且无延迟。
备注:内容来源于stack exchange,提问作者Ender

