情况:
- 2 个互联网链路 - A 和 B - 均连接到 Linux 路由器。
- 2 个路由表,第一个默认通过 A,第二个默认通过 B。
- iptables 和 ip 规则为特定流量选择“最佳”表。
一切正常,但是 - 它是静态配置。
如果其中一个互联网链接出现故障,该怎么办?在这种情况下,一切都应该通过第二个正确的链接进行。并且 - 当发生故障的链路恢复时 - 一切都应该回到流量通过两个链路的情况。
是否有任何“标准”工具可以完成此类操作?写一些东西(脚本)做什么这样的事情不是问题 - 但是 - 也许有更多的标准工具?
(失败链接的定义 - 重要 IP 之一无法从特定链接访问,但可以从第二个链接访问)。
答案1
我的多 WAN Draytek 路由器可以使用 ping 或 arp 来监控以太网和 VPN 链路上的保持活动状态。 (显然对于 xDSL 有更好的选择。)可以配置 Ssh 和 OpenVPN 来生成内部 keepalive。我不知道还有其他标准方法。
像这样的东西(未经测试):
ROUTE1=up LINK1=up COUNT1=3
ROUTE2=up LINK2=up COUNT2=3
SHOUT=once
while sleep 5
do
if ping {destination_via1}
then
LINK1_UP=up COUNT1=3
else
[[ 0 -lt $COUNT1 ]] && COUNT1=$((COUNT1 - 1))
[[ 0 -ge $COUNT1 ]] && LINK1=down
fi
if ping {destination_via2}
then
LINK2_UP=up COUNT2=3
else
[[ 0 -lt $COUNT2 ]] && COUNT2=$((COUNT2 - 1))
[[ 0 -ge $COUNT2 ]] && LINK2=down
fi
if [[ down = $LINK1 -a up = $ROUTE1 ]]
then
# add code here to remove route via LINK1 #
ROUTE1=down
elif [[ up = $LINK1 -a down = $ROUTE1 ]]
# add code here to add route via LINK1 #
ROUTE1=up
SHOUT=once
fi
if [[ down = $LINK2 -a up = $ROUTE2 ]]
then
# add code here to remove route via LINK2 #
ROUTE2=down
elif [[ up = $LINK2 -a down = $ROUTE2 ]]
# add code here to add route via LINK2 #
ROUTE2=up
SHOUT=once
fi
if [[ once = $SHOUT -a down = $ROUTE1 -a down = $ROUTE2 ]]
then
# add code here to shout that both routes are down #
SHOUT=no
fi
done