Linux默认网关优先级由metric值决定,数值越小越优先;系统仅使用一条default路由,metric相同时行为不可控;确认生效路由应使用ip route show default或ip route get 8.8.8.8,而非仅看ip route | grep default的全部条目。
Linux 默认网关优先级由 metric 值决定,数值越小越优先;系统只用一条 default 路由,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,容易意外抢主路由。
立即生效、重启失效,适合验证网关连通性或做故障接管测试:
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 清晰可控。
临时命令一重启就丢,要持久化必须写进配置文件,但路径和语法因发行版而异:
/etc/netplan/*.yaml,在对应网口下用 routes 块,例如:routes: - to: default via: 192.168.1.1 metric: 100注意缩进必须是空格,不能用 tab;改完运行
sudo netplan apply
/etc/sysconfig/network-scripts/ifcfg-eth0,加 GATEWAY=192.168.1.1 和 METRIC=100;但若 NetworkManager 接管了该接口,得设 NM_CONTROLLED=no 才生效nmcli,例如 nmcli connection modify "Wired connection 1" ipv4.route-metric 100,然后 nmcli connection down && up 生效关键点:多个网卡都启 DHCP 时,务必禁用非主网卡的自动默认路由(如 Netplan 中设 use-routes: false),否则会和你手配的 metric 冲突。
内核策略很明确:同一时刻只用一条 default 路由,选法就是找 metric 最小的那个。如果两条都是 metric 0,后添加的那条可能被忽略,也可能触发未定义行为(取决于内核版本和编译选项)。
所以别指望“多加几条 default 就能自动 failover”——真要做冗余,得配一主(metric 100)一备(metric 200),再配合脚本监听链路状态,探测失败时用 ip route change 切换 metric 值,或者用 ip rule + 自定义路由表做更精细控制。