Linux默认网关优先级由metric值决定,数值越小越优先;系统仅使用一条default路由,metric相同时行为不可控;临时修改用ip route del/add/change,永久配置需按发行版写入对应文件(如ifcfg-、Netplan或nmcli)。

Linux 默认网关的优先级不是靠“谁先配”决定的,而是由 metric 值控制——数值越小,越优先。同一时刻系统只用一条 default 路由,哪怕你加了多条,metric 相同就可能被忽略或行为不可控。
查看当前生效的默认网关和 metric 值
别只看 route -n 或 ip route 的第一行,得确认哪条真在用:
-
ip route show default—— 只显示当前被选中的那条默认路由(最可靠) -
ip route get 8.8.8.8—— 模拟发包,看实际走哪个dev和via -
ip route | grep default—— 查看所有含default的条目,注意每行末尾的metric值
常见陷阱:DHCP 自动分配的路由常带 proto dhcp,metric 值可能被 NetworkManager 覆盖,手动加的 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,用change:ip route change default via 192.168.1.1 dev eth0 metric 20
注意:ip route replace 会先删后加,但不如显式 del+add 清晰;metric 必须是整数,负值无效,0 是合法最小值。
永久设置 metric(不同发行版写法差异大)
临时命令改完一重启就丢,持久化必须写配置文件,但路径和语法因管理工具而异:
- RHEL/CentOS 7+(NetworkManager + network-scripts):
编辑/etc/sysconfig/network-scripts/ifcfg-eth0,加一行METRIC=20;或在/etc/sysconfig/network-scripts/route-eth0中写default via 192.168.1.1 dev eth0 metric 20 - Ubuntu/Debian(Netplan):
在/etc/netplan/*.yaml的接口配置下加routes块:- to: default; via: 192.168.1.1; metric: 20,然后sudo netplan apply - 使用
nmcli的桌面环境:nmcli connection modify "Wired connection 1" ipv4.route-metric 30,之后nmcli connection down && up生效
关键点:NetworkManager 默认会覆盖手工写的 /etc/sysconfig/network-scripts/ 配置,所以要么禁用 NM 管理该接口(nm-control false),要么统一用 nmcli 或 Netplan。
多个默认网关共存时的典型踩坑点
想设主备网关?别直接加两条 default via ... 就完事:
- 如果两条
default路由metric相同,内核行为不一致:老内核可能只认第一条,新内核可能触发 ECMP(等价多路径),导致连接中断或 TCP 重传 - 备用路由不能只靠高
metric等着“自动切”,得配合监控脚本检测网关连通性,再调ip route change切换 -
ip route get显示的出口,不代表所有流量都走它——某些应用(如 Docker、Kubernetes CNI)会建自己的路由表,得单独查ip rule和对应表内容
真正稳定的主备方案,往往要结合策略路由(ip rule + 自定义路由表)和健康检查,单纯调 metric 只解决“选哪条”,不解决“断了怎么切”。


















