4.2. 针对多条上行链路/运营商的路由

一种常见的配置如下所示,其中有两个运营商将本地网络(甚至一台机器)连接到大型互联网。
                                                                 ________
                                          +------------+        /
                                          |            |       |
                            +-------------+ Provider 1 +-------
        __                  |             |            |     /
    ___/  \_         +------+-------+     +------------+    |
  _/        \__      |     if1      |                      /
 /             \     |              |                      |
| Local network -----+ Linux router |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |     if2      |                      \
      \___/          +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Provider 2 +-------
                                          |            |       |
                                          +------------+        \________
针对这种设置,通常会出现两个问题。

4.2.1. 分离访问

第一个问题是如何将通过特定运营商(例如运营商 1)传入的数据包的回复路由回同一运营商。

首先,让我们设置一些符号名称。让 $IF1 作为第一个接口的名称(上图中的 if1),$IF2 作为第二个接口的名称。然后,让 $IP1 作为与 $IF1 关联的 IP 地址,$IP2 作为与 $IF2 关联的 IP 地址。接下来,让 $P1 作为运营商 1 网关的 IP 地址,$P2 作为运营商 2 网关的 IP 地址。最后,让 $P1_NET 作为 $P1 所在的 IP 网络,$P2_NET 作为 $P2 所在的 IP 网络。

需要创建两个额外的路由表,例如 T1T2。这些表添加到 /etc/iproute2/rt_tables 中。然后,在这些表中设置路由,如下所示

	  ip route add $P1_NET dev $IF1 src $IP1 table T1
	  ip route add default via $P1 table T1
	  ip route add $P2_NET dev $IF2 src $IP2 table T2
	  ip route add default via $P2 table T2
	
没什么特别的,只需构建到网关的路由,并通过该网关构建默认路由,就像在单个上游运营商的情况下所做的那样,但将路由放在每个运营商的单独表中。请注意,网络路由就足够了,因为它告诉您如何找到该网络中的任何主机,包括上面指定的网关。

接下来,设置主路由表。最好通过连接到直接邻居的接口将事物路由到该邻居。请注意 `src` 参数,它们确保选择了正确的传出 IP 地址。
	    ip route add $P1_NET dev $IF1 src $IP1
	    ip route add $P2_NET dev $IF2 src $IP2
	  
然后,您的默认路由偏好设置
	    ip route add default via $P1
	  
接下来,设置路由规则。这些规则实际上选择使用哪个路由表进行路由。您需要确保如果您已经有相应的源地址,则通过给定的接口路由出去
	    ip rule add from $IP1 table T1
	    ip rule add from $IP2 table T2
	  
这组命令确保来自特定接口的所有传入流量的回复都从该接口发出。

现在,这只是非常基本的设置。它适用于路由器本身上运行的所有进程,以及本地网络(如果进行了地址伪装)。如果不是这种情况,那么您要么拥有来自两个运营商的 IP 地址空间,要么需要伪装到两个运营商之一。在这两种情况下,您都需要添加规则,根据本地网络中机器的 IP 地址选择从哪个运营商路由出去。

4.2.2. 负载均衡

第二个问题是如何平衡通过两个运营商发出的流量。如果您已经如上所述设置了分离访问,这实际上并不难。

现在,您不再选择两个运营商之一作为默认路由,而是将默认路由设置为多路径路由。在默认内核中,这将平衡两个运营商之间的路由。步骤如下(再次基于分离访问部分中的示例)
	    ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
	    nexthop via $P2 dev $IF2 weight 1
	  
这将平衡两个运营商之间的路由。weight 参数可以进行调整,以偏向于一个运营商而不是另一个。

请注意,负载均衡不会是完美的,因为它是基于路由的,并且路由会被缓存。这意味着到常用站点的路由将始终通过同一运营商。

此外,如果您真的想这样做,您可能还需要查看 Julian Anastasov 的补丁,网址为 http://www.linuxvirtualserver.org/~julian/#routes ,Julian 的路由补丁页面。它们将使工作变得更轻松。