You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多宿主嵌入式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

火山引擎 最新活动