一种常见的配置如下所示,其中有两个运营商将本地网络(甚至一台机器)连接到大型互联网。
________ +------------+ / | | | +-------------+ Provider 1 +------- __ | | | / ___/ \_ +------+-------+ +------------+ | _/ \__ | if1 | / / \ | | | | Local network -----+ Linux router | | Internet \_ __/ | | | \__ __/ | if2 | \ \___/ +------+-------+ +------------+ | | | | \ +-------------+ Provider 2 +------- | | | +------------+ \________ |
第一个问题是如何将通过特定运营商(例如运营商 1)传入的数据包的回复路由回同一运营商。
首先,让我们设置一些符号名称。让 $IF1 作为第一个接口的名称(上图中的 if1),$IF2 作为第二个接口的名称。然后,让 $IP1 作为与 $IF1 关联的 IP 地址,$IP2 作为与 $IF2 关联的 IP 地址。接下来,让 $P1 作为运营商 1 网关的 IP 地址,$P2 作为运营商 2 网关的 IP 地址。最后,让 $P1_NET 作为 $P1 所在的 IP 网络,$P2_NET 作为 $P2 所在的 IP 网络。
需要创建两个额外的路由表,例如 T1 和 T2。这些表添加到 /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 地址选择从哪个运营商路由出去。
第二个问题是如何平衡通过两个运营商发出的流量。如果您已经如上所述设置了分离访问,这实际上并不难。
现在,您不再选择两个运营商之一作为默认路由,而是将默认路由设置为多路径路由。在默认内核中,这将平衡两个运营商之间的路由。步骤如下(再次基于分离访问部分中的示例)
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \ nexthop via $P2 dev $IF2 weight 1 |
请注意,负载均衡不会是完美的,因为它是基于路由的,并且路由会被缓存。这意味着到常用站点的路由将始终通过同一运营商。
此外,如果您真的想这样做,您可能还需要查看 Julian Anastasov 的补丁,网址为 http://www.linuxvirtualserver.org/~julian/#routes ,Julian 的路由补丁页面。它们将使工作变得更轻松。