优先选择可访问互联网的网络接口的最佳实践咨询
嘿,这种多网络接口切换、还要自动判断连通性的需求,我在嵌入式设备上折腾过好多次,手动写轮询脚本确实容易顾头不顾尾,各种组合情况太头疼了。给你几个更省心的方案:
用NetworkManager自动管理(推荐)
大部分现代嵌入式系统都支持NetworkManager,它自带链路连通性检测和连接优先级管理功能。你只需要给不同接口设置路由优先级(metric值,数值越小优先级越高),比如给eth0设10,wlan0设20,wwan0设100,让有线和无线优先于计量的wwan。同时开启它的连通性检测(默认一般是开启的,会自动ping公共节点判断是否能上网),当某个接口检测到无法访问互联网时,NetworkManager会自动把流量切换到下一个可用且可达的接口,甚至接口突然消失的情况也能自动处理。
配置命令示例:nmcli connection modify eth0 ipv4.route-metric 10 nmcli connection modify wlan0 ipv4.route-metric 20 nmcli connection modify wwan0 ipv4.route-metric 100用systemd-networkd做精细化管控
如果你的系统用的是systemd生态,systemd-networkd也能搞定这个需求。你可以给每个接口单独配置路由表,然后通过ip rule设置优先级,同时在网络配置文件里添加Ping=字段指定探测地址(比如Ping=8.8.8.8),当接口探测失败时,systemd-networkd会自动调整路由规则,把流量切到能正常联网的接口。这种方式适合对网络配置有更精细化要求的场景。策略路由+轻量健康检查脚本(灵活定制)
要是上面两种工具都没法用,那可以用iproute2的策略路由配合简单的健康检查脚本。给每个接口分配独立的路由表,然后写一个脚本定期检测每个接口的连通性(比如ping 8.8.8.8几次),当检测到接口可达时,就添加对应的路由规则让流量走这个接口;不可达就移除规则。把脚本做成systemd定时服务或者用inotify监控接口状态变化,比无脑轮询要高效得多,也能覆盖接口不存在、连通性波动的各种情况。
备注:内容来源于stack exchange,提问作者bob mcgrath

