linux多网卡路由异常主因是路由表冲突、冗余或策略规则优先级错乱;需用ip rule show和ip route show table查多表,ip route get模拟路径,识别重复默认路由、主机路由覆盖、规则顺序错误三类问题,再删旧、调序、加准修复,并通过nm dispatcher或systemd-networkd配置持久化。

Linux多网卡环境下路由异常,通常不是网卡本身故障,而是内核路由表中存在冲突、冗余或优先级错乱的路由条目。关键不在“加”路由,而在“理”路由——看清当前实际生效的路径,再针对性删、改、加。
查清真实路由走向:别只看ip route默认表
执行 ip route 显示的是主路由表(table main),但多网卡场景下,系统常启用策略路由(policy routing):不同源IP、不同接口流量可能被送入不同路由表。只看主表会漏掉真正起作用的规则。
- 用 ip rule show 查所有路由策略规则,重点关注 match src、from、to、lookup 等字段,确认哪些源地址/接口对应哪个路由表
- 对每个非默认路由表(如 table 100、table 200),运行 ip route show table
查其完整内容 - 用 ip route get from iif 模拟真实报文路径,验证实际走哪条路由
识别典型冲突模式:三类高频问题
多网卡路由异常往往表现为:能ping通网关但上不了外网、SSH连得上却无法curl、某网卡完全不响应等。常见根源有:
- 重复默认路由:多个网卡都配置了 default via X.X.X.X,而 metric 值未区分,内核按字典序选第一条,导致部分流量“误入”低优先级网关
- 主机路由覆盖:例如 eth0 配了 192.168.1.0/24,eth1 又配了 192.168.1.100/32 主机路由,后者会劫持所有发往该IP的包,绕过原网络路由
- 策略规则顺序错误:rule 中的优先级(pref)数值越小越先匹配,若一条 catch-all 规则(如 from all lookup main)排在具体规则之前,就会吞掉本该进自定义表的流量
安全清理与精准修复:删旧、调序、加准
修复不是盲目添加新路由,而是先归零再重建。操作前建议备份:ip rule save > /tmp/rule.bak && ip route save table main > /tmp/main.bak
- 删除冗余默认路由:ip route del default via dev (逐条删,勿用 flush)
- 重排策略规则:用 ip rule del pref
删除旧规则,再用 ip rule add pref ... 按期望优先级重建,确保具体规则(如 from 10.0.2.100)在通用规则(from all)之前 - 为每张网卡设独立路由表:例如为 eth1 创建 table 101,写入其子网和默认路由,再通过 rule 绑定源IP → table 101,避免跨表干扰
持久化需绕过NetworkManager或systemd-networkd陷阱
临时命令修好后重启即失效,但直接写入 /etc/network/interfaces 或 systemd-networkd 的 .network 文件,可能被NM自动覆盖。可靠做法是:
- 若用 NetworkManager:禁用其托管对应接口(nmcli connection modify
ipv4.ignore-auto-routes yes ),改用 dispatcher 脚本在 up/down 时执行 ip rule/route - 若用 systemd-networkd:在对应 .network 文件中启用 [Route] 和 [RoutingPolicyRule] 小节,明确指定 table=xxx 和 priority=xxx,避免依赖默认行为
- 通用兜底:将修复命令写入 /etc/network/if-up.d/ 自定义脚本,chmod +x,并确保执行权限和执行时机正确











