Linux多网卡路由异常_路由表分析与修复

5次阅读

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

Linux多网卡路由异常_路由表分析与修复

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,并确保执行权限和执行时机正确
text=ZqhQzanResources