![如何使用 Linux 内核在两个独立的 NAT 设备之间实现流量负载平衡?](https://linux22.com/image/688506/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Linux%20%E5%86%85%E6%A0%B8%E5%9C%A8%E4%B8%A4%E4%B8%AA%E7%8B%AC%E7%AB%8B%E7%9A%84%20NAT%20%E8%AE%BE%E5%A4%87%E4%B9%8B%E9%97%B4%E5%AE%9E%E7%8E%B0%E6%B5%81%E9%87%8F%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1%EF%BC%9F.png)
我有一个网络,上面有多个 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(即使完全发出),并且连接实际上将被黑洞化。如果有帮助的话,我可以在两个路由器上设置互斥的端口转发集,但如果可能的话,我宁愿让它们保持不变(或至少在某些情况下重叠)。
对于新的传出连接,我想使用主路由表按范围分配流量,但对于某些流量,我可能希望在两个路由器之间随机平衡新的连接。
我怀疑我所问的问题是否可以使用iptables
和ip
,或者可能单独使用其中任何一种工具都可以实现。但是,我找到的 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:05
和00:00:5E:00:53:07
将是两个 NAT 设备的链接地址。