简单来说,Linux 选择默认网关的核心机制完全取决于 metric(路由度量)值:该值越小,优先级就越高。需要明确的是,系统永远不会同时使用两条 default 路由,内核只会采用 metric 数值最小的那一条。如果多条默认路由的 metric 值相同,则路由行为将变得不可预测——这并非简单的“谁先配置谁优先”,而是内核严格按照数值大小强制选择的结果。

如何确认当前生效的默认网关及其 metric 值
这里有一个常见误区:不要仅仅查看 ip route 输出的第一行就认为万事大吉,那一行可能只是众多候选路由之一。实际报文走哪条路径,最终取决于内核实际选中的那一条。
ip route show default—— 这是最可靠的命令,它只显示当前被内核选中的那条default路由。ip route get 8.8.8.8—— 模拟一次真实流量,输出结果会明确告知dev(出口网卡)和via(下一跳网关),这直接反映了实际的数据流走向。ip route | grep default—— 该命令会筛选出所有带default的条目,重点查看每条记录末尾的metric值,从而全面掌握优先级排序。
需要特别留意:许多由 proto dhcp 标记的路由,通常是 NetworkManager 等工具自动添加的,它们的 metric 值可能被覆盖。而手动使用 ip route add default 添加的路由,若不指定 metric,默认值为 0,这很容易意外地抢占主路由的位置。
临时调整 metric:适用于调试或应急切换
如果只是临时调试或进行故障切换测试,通过命令行操作可以即时生效,但重启后配置会失效。
- 先删除当前默认路由:
ip route del default(不带via也能删除,操作需谨慎)。 - 然后添加新路由并指定
metric:ip route add default via 192.168.5.1 dev wlan0 metric 50。 - 如果只想修改已有路由的
metric值:ip route change default via 192.168.1.1 dev eth0 metric 20。
注意:metric 必须是正整数或 0,负值无效。此外,ip route replace 虽然也可以使用,但其本质是先删除再添加,执行过程不如显式地 del + add 那样清晰可控。
永久配置 metric:根据发行版选择合适的方法
上述命令重启后会丢失,要实现持久化必须写入配置文件。但不同 Linux 发行版的方法不同,需要针对性地处理。
- Ubuntu/Debian(Netplan):编辑
/etc/netplan/*.yaml文件,在对应网口下使用routes块定义。例如:routes: - to: default via: 192.168.1.1 metric: 100注意缩进必须使用空格,不能用 tab。修改后运行sudo netplan apply生效。 - RHEL/CentOS(ifcfg-):编辑
/etc/sysconfig/network-scripts/ifcfg-eth0,手动添加GATEWAY=192.168.1.1和METRIC=100。关键点在于:如果该接口被 NetworkManager 接管,需要额外加上NM_CONTROLLED=no才能让自定义配置生效。 - NetworkManager 管理的桌面环境:使用
nmcli命令行工具更便捷。例如:nmcli connection modify "Wired connection 1" ipv4.route-metric 100,然后执行nmcli connection down && up重启连接。
这里有一个重要提醒:如果有多个网卡都启用了 DHCP,务必禁用非主网卡上自动生成的默认路由(例如在 Netplan 中设置 use-routes: false),否则这些自动产生的路由会与手动配置的 metric 值发生冲突,导致网络行为变得混乱。
为什么添加多条 default 路由却只有一条生效
内核的规则非常明确:同一时刻只使用一条 default 路由。选择规则就是寻找 metric 最小的那一条。如果两条路由的 metric 都是 0,后添加的那条可能会被直接忽略,甚至可能触发不可预测的行为(具体取决于内核版本和编译选项)。
因此,不要指望“添加多条 default 就能实现自动故障转移”。真正实现冗余,需要配置一主一备的方案:例如一条主路由 metric 100,一条备份路由 metric 200。然后结合脚本来监听链路状态,当探测到主链路可用时,通过 ip route change 动态调整 metric 值来实现切换。如果需要更精细的控制,还可以使用 ip rule 策略路由,配合自定义路由表来处理。
