有几种方法可以做到这一点。其中一种最简单直接的方法是 'TEQL' - "真正" (或 "简单") 链路均衡器。 就像大多数与队列有关的事情一样,负载均衡是双向的。链路的两端可能都需要参与才能发挥全部效果。
想象一下这种情况
+-------+ eth1 +-------+ | |==========| | 'network 1' ----| A | | B |---- 'network 2' | |==========| | +-------+ eth2 +-------+ |
A 和 B 是路由器,目前我们假设两者都运行 Linux。 如果流量从网络 1 流向网络 2,路由器 A 需要将数据包分配到连接到 B 的两条链路上。路由器 B 需要配置为接受此操作。 当数据包从网络 2 流向网络 1 时,情况也是如此,路由器 B 需要通过 eth1 和 eth2 发送数据包。
分配部分由 'TEQL' 设备完成,就像这样 (它再简单不过了)
# tc qdisc add dev eth1 root teql0 # tc qdisc add dev eth2 root teql0 # ip link set dev teql0 up |
别忘了 'ip link set up' 命令!
这需要在两台主机上都完成。 设备 teql0 基本上是一个在 eth1 和 eth2 上进行轮询分配器,用于发送数据包。 没有数据通过 teql 设备进入,它只会出现在 '原始' eth1 和 eth2 上。
但是现在我们只有设备,我们还需要正确的路由。 一种方法是将 /31 网络分配给两条链路,并将 /31 分配给 teql0 设备。
FIXME: 这是否需要类似 'nobroadcast' 的东西? /31 太小,无法容纳网络地址和广播地址 - 如果这不能按计划工作,请尝试 /30,并相应地调整 ip 地址。 您甚至可以尝试让 eth1 和 eth2 不使用 IP 地址!
在路由器 A 上
# ip addr add dev eth1 10.0.0.0/31 # ip addr add dev eth2 10.0.0.2/31 # ip addr add dev teql0 10.0.0.4/31 |
在路由器 B 上
# ip addr add dev eth1 10.0.0.1/31 # ip addr add dev eth2 10.0.0.3/31 # ip addr add dev teql0 10.0.0.5/31 |
现在路由器 A 应该能够通过 2 条真实链路和 1 个均衡设备 ping 10.0.0.1、10.0.0.3 和 10.0.0.5。 路由器 B 应该能够通过链路 ping 10.0.0.0、10.0.0.2 和 10.0.0.4。
如果这有效,路由器 A 应该将 10.0.0.5 作为其到达网络 2 的路由,路由器 B 应该将 10.0.0.4 作为其到达网络 1 的路由。 对于网络 1 是您家中的网络,而网络 2 是互联网的特殊情况,路由器 A 应该将 10.0.0.5 作为其默认网关。