我有一台 Linux 机器,配备两个 USB 调制解调器,每个调制解调器都有自己的 SIM 卡和公共 IP 地址。
其中一个调制解调器可能会在某个时候失去连接,我希望连接尽可能具有弹性。我知道维持现有连接可能是不可能的,但至少一旦接口 1 失去连接,我希望接口 2 可以立即用于新连接。
在 Linux 中使用两个接口实现最短停机时间的最佳方法是什么?
____________
+------------+ / \
| | | |
+-------------+ Provider 1 +------- \
| | | / \
+------+--------+ +------------+ | |
| if1 | / \
| | | |
+ Linux machine | | Internet |
| | | |
| if2 | \ /
+------+--------+ +------------+ | |
| | | \ /
+-------------+ Provider 2 +------- /
| | | |
+------------+ \____________/
答案1
我建议始终保持两个接口处于打开状态,并调整路由表,以便:
- 您的主要界面将始终是首选
- 您的辅助服务器有一个 IP 并且已准备就绪(热备用),但流量尚未通过(因此您不会发生太多变化)
- 拥有第二个具有更高度量的默认网关
您可以使用以下方式完成上述操作
ip route add default dev xyz metric 100
根据您的 Linux 发行版,您可以通过编辑 post-up 或 if-up 脚本使其永久生效。
另一种方法是,特别是如果您不需要按使用量付费,那么可以对两个接口进行负载平衡。我从来没有设置过类似的东西……但使用磅。不,我的错误,这是为了 LAN/集群负载平衡,但是这有一个iptables
基于的实现。
更新:根据评论:
路由表如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.207.246.1 0.0.0.0 UG 0 0 0 br0
10.0.3.0 0.0.0.0 255.255.255.0 U 0 0 0 lxcbr0
10.207.246.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 br0
默认路线是带有目的地的路线0.0.0.0
。您可以看到我的路线是:
0.0.0.0 10.207.246.1 0.0.0.0 UG 0 0 0 br0
表示metric
优先级,最低数字是首选。例如,如果有两个接口,我可以有以下设置,在这种情况下,我更喜欢将流量发送到我的br0
(桥接)接口:
0.0.0.0 10.207.246.1 0.0.0.0 UG 0 0 0 br0
0.0.0.0 10.205.243.1 0.0.0.0 UG 100 0 0 eth1
如果br0
因任何原因发生故障,则第二条默认路由将是唯一的路由,因此eth1
将被使用。一旦br0
恢复,首选路由将再次更改并指向该接口。
现在,据我所知,第二种方法使用两个不同的路由表!使用链接博客中的示例,您可以看到一个名为的表bsnl
和一个名为的表tata
。每个表都映射到一个互联网提供商,每个表都有:
直接连接的 LAN:
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table bsnl
默认路由/网关:
ip route add default via 192.168.1.1 table bsnl
我假设有一条规则将传入的流量映射到路由表(如果我错了请纠正我 - 阅读这):
ip rule add from 192.168.1.10 table bsnl
上述配置定义了 WAN/ISP 方面的内容(每个互联网连接一组)。最后,全局范围默认路由将决定nexthop
来自 LAN 并必须路由到 WAN 的流量。(我认为全局范围适用于所有不属于的接口ip rule
):
ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 1 \
nexthop via 192.168.0.1 dev eth2 weight 4
最重要的区别是最后一种技术同时使用两个接口/连接根据给定的优先级执行负载平衡。在上面的例子中,eth1
优先使用 1/5 的时间(20%),eth2
优先使用 4/5 的时间(80%)。相反,在第一个设置中,使用两个默认路由,任何时候都只使用一个连接。
免责声明:我从未做过第二次设置,所以有些事情可能是错误的或没有详细解释......
希望能帮助到你