连接两个三层接口以实现故障转移

连接两个三层接口以实现故障转移

我有一台 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。每个表都映射到一个互联网提供商,每个表都有:

  1. 直接连接的 LAN:

    ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table bsnl
    
  2. 默认路由/网关:

    ip route add default via 192.168.1.1 table bsnl
    
  3. 我假设有一条规则将传入的流量映射到路由表(如果我错了请纠正我 - 阅读):

    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%)。相反,在第一个设置中,使用两个默认路由,任何时候都只使用一个连接。

免责声明:我从未做过第二次设置,所以有些事情可能是错误的或没有详细解释......

希望能帮助到你

相关内容