如何使用 Linux 内核在两个独立的 NAT 设备之间实现流量负载平衡?

如何使用 Linux 内核在两个独立的 NAT 设备之间实现流量负载平衡?

我有一个网络,上面有多个 Linux 工作站/服务器,还有两个 Internet 连接,每个连接前面都有一个消费级 NAT 路由器。因此,为了具体起见,我们假设这些设备是:

192.0.2.0/26  network
192.0.2.1     router A
192.0.2.62    router B
192.0.2.10    host X
192.0.2.11    host Y

下面是一个图表,类似于 LARTC HOWTO 中的图表:

                                                             ________
                                           +------------+        /
                                           |            |       |
         +-----------+-[NAT router A]------+ Provider 1 +-------
        _|                                 |            |     /
    ___/  \_         +--------------+      +------------+    |
  _/        \__      | Linux host   |                      /
 /             \     |              |                      |
| Local network -----+  if1         |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |              |                      \
      \___/          +--------------+     +------------+    |
        |                                 |            |     \
        +---------------[NAT router B]----+ Provider 2 +-------
                                          |            |       |
                                          +------------+        \________

如果新的 TCP 连接通过其中一个路由器进入,则返回流量需要通过该路由器发出。否则,返回的 SYN 数据包将被错误地进行 NAT(即使完全发出),并且连接实际上将被黑洞化。如果有帮助的话,我可以在两个路由器上设置互斥的端口转发集,但如果可能的话,我宁愿让它们保持不变(或至少在某些情况下重叠)。

对于新的传出连接,我想使用主路由表按范围分配流量,但对于某些流量,我可能希望在两个路由器之间随机平衡新的连接。

我怀疑我所问的问题是否可以使用iptablesip,或者可能单独使用其中任何一种工具都可以实现。但是,我找到的 HOWTO 和其他答案似乎都针对具有多个接口的单个​​路由器(运行 Linux)或主机……而不是针对连接到同一接口的多个路由器之间的策略。

编辑:我又找到了一个问题,也没有答案,这是在询问相同的情况(注意192.168.0.0/23是本地网络),但重点是传出流量的策略;我的问题是关于传入流量的策略。(两个 NAT 设备都具有“按端口范围将端口转发到主机”功能。)

答案1

是的,可以同时使用iptables和来实现ip。在我的例子中,所有有问题的 Linux 机器都运行 Debian Stable,因此我为 编写了一个自定义脚本/etc/network/if-up.d

# First set up two routing-tables
ip route add to default table 11 via 192.0.2.1  dev $IFACE
ip route add to default table 33 via 192.0.2.62 dev $IFACE

# ... and rules to use them.
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33

# Copy connmark to fwmark for applicable outgoing packets.
iptables -t mangle -A OUTPUT ! -d 192.0.2.0/26 \
  -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark

# Set connmark for applicable incoming packets.
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
  -m addrtype --src-type UNICAST \
  -m mac --mac-source 00:00:5E:00:53:05 \
  -j CONNMARK --set-mark 11
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
  -m addrtype --src-type UNICAST \
  -m mac --mac-source 00:00:5E:00:53:07 \
  -j CONNMARK --set-mark 33

请注意,它是按该顺序定义的,以便整个过程通过最后两个命令生效。00:00:5E:00:53:0500:00:5E:00:53:07将是两个 NAT 设备的链接地址。

相关内容