多网卡路由错乱根源是ARP响应失控、路由表冲突、策略规则错序;必须为每张网卡单独设arp_ignore=1和arp_announce=2,清理重复默认路由并按pref顺序配置ip rule,再通过sysctl、ip route get和tcpdump验证生效。
多网卡路由错乱不是“路由没加对”,而是“路由表太杂、响应太乱、回包走错路”。核心要抓三层:**ARP响应失控、路由表冲突、策略规则错序**。直接看现象、查关键点、改关键参数,不绕弯。如果两块网卡(比如 eth0 和 eth1)在同一个网段(如 192.168.1.0/24),但服务器对外表现是“时通时断”“ping 网关 MAC 频繁变”“tcpdump 看到多个接口同时回复 ARP”,那大概率是 arp_ignore=0 在作祟。
echo 1 | sudo tee /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 | sudo tee /proc/sys/net/ipv4/conf/eth1/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 | sudo tee /proc/sys/net/ipv4/conf/eth1/arp_announce
执行 ip route show,重点看有没有多条 default via,尤其是 metric 值接近或相同:
default via 192.168.1.1 dev eth0 metric 100 和 default via 192.168.2.1 dev eth1 metric 100 ——内核会按字典序或哈希随机选,回包路径不可控把主出口 metric 设低(如 100),备用设高(如 200);
或干脆删掉非必要默认路由,只留一个出口
运行 ip rule show,注意 pref 数值(越小越优先):
from all lookup main(pref=32766)排在前面,把本该走自定义表的流量全吞了例如:
ip rule add from 10.0.1.100/32 table 101 pref 100
ip rule add from all lookup main pref 32766
ip route get from 10.0.1.100 to 8.8.8.8 模拟真实路径,别只看 ip route
改完别急着重启服务,做三件事确认生效:
sysctl net.ipv4.conf.eth0.arp_ignore 返回 = 1 才算到位ip route get 192.168.1.100 from 172.16.1.50 iif eth0,确认源接口和出接口一致tcpdump -i eth0 arp 和 tcpdump -i eth1 arp 同时跑,确保只有目标网卡响应对应网段 ARP