多宿主嵌入式Linux设备路由优先级配置及故障切换问题咨询
多宿主嵌入式Linux设备路由优先级配置及故障切换问题咨询
嗨,针对你这个多宿主嵌入式Linux设备的路由优先级和故障切换问题,我来给你梳理下可行的解决思路。先明确下你的核心场景和需求:
设备环境与基础信息
- 运行系统:自定义嵌入式Linux(内核5.1.x)
- 可用网络接口:eth0(有线以太网)、mlan0(WiFi)、mobile1(LTE调制解调器)
- 每个活跃接口会通过DHCP或移动运营商自动获取默认网关
核心需求:互联网连接优先级与故障切换
你需要实现严格的接口优先级,同时支持故障自动切换:
- 优先使用eth0(有线),仅当eth0无互联网访问时才切换到mlan0(WiFi)
- mlan0的优先级高于mobile1(LTE),仅当前两者都不可用时才启用LTE
- 任意接口故障恢复后,需要切回原优先接口
可行的配置方案
1. 静态路由优先级配置(基础框架)
首先通过调整默认路由的**metric(度量值)**来设定静态优先级——metric值越小,路由优先级越高。你可以按以下规则配置:
- eth0的默认路由metric设为最低(比如10),确保最优先
- mlan0的metric设为中间值(比如20)
- mobile1的metric设为最高(比如30)
手动配置命令示例
假设各接口已获取对应的网关地址,执行以下命令添加默认路由:
# 配置eth0默认路由,优先级最高 ip route add default via <eth0_gateway_ip> dev eth0 metric 10 # 配置mlan0默认路由,优先级次之 ip route add default via <mlan0_gateway_ip> dev mlan0 metric 20 # 配置mobile1默认路由,优先级最低 ip route add default via <mobile1_gateway_ip> dev mobile1 metric 30
如果是通过DHCP自动获取路由,你需要修改DHCP客户端配置(比如/etc/dhcp/dhclient.conf),给不同接口指定固定的metric值,避免DHCP自动生成的路由覆盖手动配置。比如在配置中添加:
interface "eth0" { supersede routers <eth0_gateway_ip>; supersede interface-metric 10; } interface "mlan0" { supersede routers <mlan0_gateway_ip>; supersede interface-metric 20; }
2. 健康检测脚本实现故障自动切换
仅靠静态metric只能处理优先级,无法应对接口故障。你可以写一个简单的定时检测脚本,定期验证各接口的互联网连通性,动态调整路由metric实现切换。
简化版检测脚本示例
#!/bin/bash # 定义各接口的网关和默认metric ETH0_GW="<eth0_gateway_ip>" ETH0_METRIC=10 MLAN0_GW="<mlan0_gateway_ip>" MLAN0_METRIC=20 MOBILE1_GW="<mobile1_gateway_ip>" MOBILE1_METRIC=30 FAIL_METRIC=40 # 故障时设置的高metric值 # 检测eth0连通性 ping -I eth0 -c 3 -W 2 8.8.8.8 > /dev/null 2>&1 if [ $? -ne 0 ]; then # eth0故障,调高其metric ip route change default via $ETH0_GW dev eth0 metric $FAIL_METRIC else # eth0正常,恢复原metric ip route change default via $ETH0_GW dev eth0 metric $ETH0_METRIC fi # 检测mlan0连通性(仅当eth0故障时生效) ping -I mlan0 -c 3 -W 2 8.8.8.8 > /dev/null 2>&1 if [ $? -ne 0 ]; then ip route change default via $MLAN0_GW dev mlan0 metric $FAIL_METRIC else ip route change default via $MLAN0_GW dev mlan0 metric $MLAN0_METRIC fi # 检测mobile1连通性(兜底) ping -I mobile1 -c 3 -W 2 8.8.8.8 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "所有接口均无互联网连接" else ip route change default via $MOBILE1_GW dev mobile1 metric $MOBILE1_METRIC fi
把这个脚本保存为route_monitor.sh,添加执行权限后,通过crontab设置定时执行(比如每分钟一次):
chmod +x route_monitor.sh crontab -e # 添加以下内容 */1 * * * * /path/to/route_monitor.sh
3. 专用工具进阶方案(复杂场景)
如果需要更稳定的切换逻辑,也可以考虑嵌入式Linux支持的专用工具:
- keepalived:虽然常用于VIP高可用,但可以配合自定义脚本触发路由调整,实现更可靠的故障切换
- network-manager:如果你的系统集成了NetworkManager,可以通过图形化或命令行配置接口的路由优先级和自动切换规则,适合有桌面环境的嵌入式系统
备注:内容来源于stack exchange,提问作者Cellcon




