Linux下如何基于下一跳可用性动态调整路由?
Linux下如何基于下一跳可用性动态调整路由?
看了你的组网场景,这种多下一跳冗余的需求在没法用标准动态路由协议的环境里确实挺常见的,下面给你梳理几种可行的方案,结合你的实际情况来选:
方案一:基于ping检测的脚本(最直接、依赖最少)
这其实就是你在编辑里提到的思路,也是最简单、最不需要额外软件的方案,完全依赖Linux自带的ping、iproute2工具,再配合cron定时执行就行。
大致实现逻辑:
- 写一个Shell脚本,依次检测三个VPN盒子的下一跳IP(192.168.1.177/178/179)的连通性;
- 对每个下一跳,如果连续几次ping不通,就调整对应路由的metric(改成比其他路由高很多的值,比如100),或者直接删除这条路由;
- 如果后续检测到下一跳恢复连通,再把metric改回原来的优先级(比如1/2/3),或者重新添加路由;
- 用
cron每分钟(或者更短间隔)执行一次这个脚本,实现自动检测和调整。
脚本示例片段:
# 目标网段和下一跳列表 TARGET_NET="192.168.32.0/24" DEV="eth1" declare -A NEXT_HOPS=( ["192.168.1.179"]="1" ["192.168.1.178"]="2" ["192.168.1.177"]="3" ) # 检测下一跳连通性 for hop in "${!NEXT_HOPS[@]}"; do if ping -c 3 -W 2 "$hop" > /dev/null 2>&1; then # 连通正常,恢复原metric ip route change "$TARGET_NET" via "$hop" dev "$DEV" metric "${NEXT_HOPS[$hop]}" else # 连通失败,调高metric或者删除路由 ip route change "$TARGET_NET" via "$hop" dev "$DEV" metric 100 # 或者直接删除:ip route del "$TARGET_NET" via "$hop" dev "$DEV" fi done
你可以根据实际情况调整ping的次数(-c)、超时时间(-W),还有失败后的操作(改metric还是删路由)。因为你不关心已建立连接的优雅切换,这个方案完全满足需求——新流量会自动走优先级最高的可用下一跳,老连接断了就断了,不用额外处理。
方案二:借助动态路由守护进程(更可靠,但需要额外软件)
如果你能在VPN Box 1/2/3上装OSPF/RIP/BGP守护进程(比如FRR、Quagga),其实也能解决这个问题,而且比脚本更可靠:
- 在你的Linux路由器(192.168.1.1)和三个VPN盒子上都部署同一种动态路由协议(比如OSPF);
- 让每个VPN盒子把
192.168.32.0/24这个网段通告给Linux路由器; - 当某个VPN盒子的链路断了,它会停止通告这条路由,Linux路由器的路由表会自动移除对应条目,流量自然切换到其他可用的下一跳。
不过这个方案的门槛比脚本高:需要在VPN盒子上安装配置路由守护进程,还要确保VPN盒子和Linux路由器之间的路由协议通信正常。如果你的VPN盒子是轻量设备(比如小型嵌入式系统),可能会有资源限制,但如果能装的话,这种方式的故障检测和切换会更精准,不像ping脚本可能误判(比如只是ping丢包但链路实际可用)。
对你问题的直接回应
- 关于“是不是脚本ping是唯一/最简单的方案”:在你没法用动态路由协议的前提下,是的,脚本方案是最直接、成本最低的,完全依赖标准Linux工具,不需要额外配置复杂的服务;
- 关于连接跟踪和优雅切换:既然你不关心这个,脚本方案完全没问题,不需要额外做处理。
备注:内容来源于stack exchange,提问作者espenfjo
相关产品推荐
相关产品推荐

