linux 中路由解决方案1
在 Linux 的路由表中,当存在多条默认路由(0.0.0.0
)且它们的 Metric 值相同 时,内核会根据其他因素决定优先使用哪条路由。在你的例子中,eth1
和 wlan0
的 Metric 值均为 1024
,但系统优先选择 eth1
,可能原因如下:
可能原因分析
-
接口优先级(基于接口索引或名称顺序)
-
Linux 内核可能会根据网络接口的 创建顺序 或 接口索引号(ifindex) 决定优先级。
-
通常,先初始化的接口(如
eth1
)会被优先选择,尤其是当 Metric 相同时。
-
-
路由表顺序(第一条匹配的路由生效)
-
路由表的输出顺序可能反映内核的内部优先级。你的输出中
eth1
的路由排在wlan0
之前,可能直接被优先匹配。
-
-
内核策略路由规则
-
如果有自定义的
ip rule
策略路由规则(如基于源地址、防火墙标记等),可能会影响默认路由的选择。
-
-
接口状态或稳定性
-
如果
eth1
被视为更稳定(如有线连接),内核可能倾向优先使用它,即使 Metric 相同。
-
验证方法
-
检查接口索引号
运行以下命令查看接口的索引号(
linux 中 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.42.1 0.0.0.0 UG 1024 0 0 eth1 0.0.0.0 192.168.68.165 0.0.0.0 UG 1024 0 0 wlan0 为什么Metric 值是一样的, 路由优先走eth1, 通过eth1无法连接外网时,为什么不再尝试通过wlan0 连接外网?
在 Linux 中,当存在多条默认路由(0.0.0.0)且它们的 Metric 值相同 时,系统的行为可能不符合直观预期(如自动故障切换到另一条路由)。以下是详细解释和解决方法:
原因分析
-
Metric 相同时的默认行为
-
当多条默认路由的 Metric 值相同(如你的
eth1
和wlan0
均为1024
),Linux 默认会选择第一条匹配的路由(即eth1
),而不会自动故障切换到其他路由。 -
这是内核的默认策略:仅根据路由表顺序选择,不主动检测网关是否可达。
-
-
缺乏路由探测机制
-
默认情况下,Linux 不会因为
eth1
的网关(192.168.42.1
)无法访问外网而自动切换到wlan0
。 -
除非手动配置了 路由探测(如
ip route
的probe
或第三方工具),否则系统会持续使用eth1
,即使它已失效。
-
-
网络管理器的影响
-
如果使用
NetworkManager
或systemd-networkd
,它们可能提供高级的故障切换功能,但默认配置可能未启用。
-
解决方案
方法 1:调整 Metric 值(推荐)
-
为
wlan0
设置比eth1
更低 的 Metric(数值越小优先级越高),使系统优先使用wlan0
,仅在wlan0
失效时回退到eth1
:bash
复制
下载
sudo ip route add default via 192.168.68.165 dev wlan0 metric 100 sudo ip route add default via 192.168.42.1 dev eth1 metric 200
-
持久化配置(根据发行版选择):
-
在
/etc/network/interfaces
(Debian/Ubuntu)或/etc/sysconfig/network-scripts/
(RHEL/CentOS)中为接口设置metric
参数。
-
方法 2:使用策略路由(高级)
-
通过
ip rule
实现基于条件的路由选择(如源地址、数据包标记等):bash
复制
下载
# 为 wlan0 和 eth1 创建不同的路由表 echo "100 wlan0_table" >> /etc/iproute2/rt_tables echo "200 eth1_table" >> /etc/iproute2/rt_tables# 添加路由规则 ip route add default via 192.168.68.165 dev wlan0 table wlan0_table ip route add default via 192.168.42.1 dev eth1 table eth1_table# 设置优先级(优先尝试 wlan0) ip rule add from 192.168.68.0/24 priority 100 table wlan0_table ip rule add from 192.168.42.0/24 priority 200 table eth1_table
方法 3:启用路由探测(需额外工具)
-
使用
nethogs
、conntrack
或自定义脚本监控网关可达性,动态切换路由:bash
复制
下载
# 示例:检测 eth1 网关是否响应,若不响应则删除路由 ping -c 3 192.168.42.1 || ip route del default via 192.168.42.1 dev eth1
验证当前路由选择
-
查看实际使用的路由:
bash
复制
下载
ip route get 8.8.8.8
-
检查路由缓存:
bash
复制
下载
ip route show cache
总结
-
根本问题:Linux 默认不自动检测网关失效,且 Metric 相同时固定使用第一条路由。
-
推荐方案:通过 调整 Metric 或 策略路由 明确优先级,或借助外部工具实现故障切换。
-
如果希望完全自动化,建议使用网络管理工具(如
NetworkManager
)并启用其故障转移功能。