我有一台运行 Xivo 的 Debian Wheezy 服务器(我们称之为 A),该服务器有 2 个接口:
eth0
和eth1
。没有默认网关,只有少数服务器可以从 A 静态访问。eth0
具有公共 IP 并直接连接到远程服务器(我们称之为 B),A 的第二个接口eth1
位于本地网络上,另一个互联网连接应该用于其他目的。
在路由表 A 中,可通过接口 访问 B。eth0
我想要设置一个故障转移路由,eth1
如果 上的连接尝试失败,则尝试通过该路由进行连接eth0
。我无法访问路由器,并且不能涉及来自外部 A 的动态路由。
到目前为止,我看到了不同的东西,比如ip rule
,heartbeat HA
和其他技术,但对于这个问题,我想要实现的是确定我想要做的事情是否可行,如果可能的话,用什么样的技术来实现。
编辑1
我决定重新表述我的问题,因为我觉得没人知道。
我如何监控从一台服务器到另一台服务器的链接,并在链接断开时采取行动?它也可能与 arp 解析有关,因为我实际上连接到远程主机,并且我知道它的 MAC 地址。
我很确定在互联网丛林中已经存在可能性,我不想为这项任务重新发明轮子。
编辑2
由于脚本的解决方案最终是我选择的,因此我会接受并奖励它,但我添加了在使用该脚本之前尝试过的所有方法的汇编
答案1
不久前,我遇到了类似的问题,当时我通过不稳定的 HDSL 连接(有时几天都无法工作!)从数据记录器(Ubuntu)访问远程服务器。我在 crontab 中创建了一个在数据记录器上运行的简单 bash 脚本。该脚本的工作方式如下:
- 测试 HDSL 对公共/始终可用的服务器(如 DNS 或类似的东西)进行 ping 的状态
- 如果测试成功,脚本将通过同一网络上的备用 3G 路由器添加一条到远程服务器的路由
- 如果测试成功,则删除之前的路由,使数据记录器通过 HDSL 路由器到达远程服务器
这不是一个完善的解决方案,但是它在我的场景中有效!
答案2
我最终得到了几个解决方案,其中一个是保留的“crontabed”脚本,运行arping
该脚本:
#!/bin/sh
#remote host to test on public interface
REMOTE_TEST_IP="195.168.156.1"
REMOTE_TEST_MAC="00:2D:FF:FF:FF:FF"
#number of arp request send to test connectivity
TEST_COUNT=4
#the rate acceptable of arp request failling, strictly above this rate the route will be change
#NEVER put 100 or it will never set up failover
ACCEPTABLE_FAILURE_RATE=20
#list of network that will be rerouted if test fails
NETWORK_LIST="25.14.0.0/20 198.27.45.40/32 21.1.80.0/20"
PUBLIC_DEVICE="eth0"
PUBLIC_GATEWAY="192.168.1.250"
PRIVATE_DEVICE="eth1"
PRIVATE_GATEWAY="15.168.16.4"
#try to ping the remote host ip and the remote host mac, extract the result line and get the failure rate
FAILURE_RATE=$(arping -i $PUBLIC_DEVICE -c $TEST_COUNT -t $REMOTE_TEST_MAC $REMOTE_TEST_IP | grep % | sed -r s/.* ([0-9]{1,3})% .*/\1/)
#if the faillure is superior to the acceptable failure rate, change the route to remote the remote host
if [ $FAILURE_RATE -gt $ACCEPTABLE_FAILURE_RATE ]
then
for NETWORK in $NETWORK_LIST
do
logger "$0 - WARNING -The network route to $NETWORK_LIST are set to failover route."
route del -net $NETWORK gw $PUBLIC_GATEWAY dev $PUBLIC_DEVICE
route add -net $NETWORK gw $PRIVATE_GATEWAY dev $PRIVATE_DEVICE
done
else
for NETWORK in $NETWORK_LIST
do
#back to default route
route del -net $NETWORK gw $PRIVATE_GATEWAY dev $PRIVATE_DEVICE
route add -net $NETWORK gw $PUBLIC_GATEWAY dev $PUBLIC_DEVICE
done
fi
我还发现了其他答案中提到的不同的解决方案。
我真的不知道还有其他解决方案,John Auld 的博客提到这里始于 2005 年,当时 Linux 仍在使用路由度量,但除非使用动态路由协议,否则情况已不再如此。
答案3
以下文章解释了如何以简单的方式实现故障转移路由。
http://archive09.linux.com/feature/113988
这涉及向同一目的地添加两条路由,一条通过 eth0,一条通过 eth1,以及一个超时设置,当一条路由不可用时,切换活动路由。
请记住,如果使用 nat,出站数据包的源 IP 将会改变。对于无连接协议(例如 HTTP),这不会有什么影响。但是,对于面向连接的协议,路由可能会切换,但如果源 IP 发生变化,连接将失败。
您的评论中提到了 VoIP,您应该会看到通话失败并需要重新启动。
答案4
你的问题很有趣。谷歌搜索给了Mpath 工具
Mpath-tools 是一组用于 Linux 2.6+ 的程序,旨在促进多个异构 ISP 连接之间的负载平衡和故障转移。
Mpathd 是一个守护进程,也是 mpath-tools 的核心,它在后台运行,监控每个连接的状态。它根据网关的状态和管理员设置的一组规则动态更新路由表。
每个连接的状态通过向一个或多个地址发送 ICMP 探测来确定。
我从未尝试过。
这是一个机密项目,它们没有得到很好的索引,“Linux 静态路由故障转移”搜索没有给出任何结果,“Linux 动态路由故障转移”在第 4 页给出了该网站(也许我的搜索技巧不好);甚至“mpath-tools”也只返回几个链接。请注意,这并不意味着它不起作用。