我有一个networking,上面有几个Linux工作站/服务器,还有两个互联网连接,每个连接前面都有一个消费级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连接通过一个或另一个路由器进入,返回stream量需要通过该路由器出去。 否则,返回的SYN数据包将被错误地NAT(如果甚至被遗漏),并且连接将被有效地破坏。 如果可以的话,我可以在两台路由器上设置互斥的端口转发设置,但是如果可能的话,我宁愿保留它们(或者至less在某些情况下是重叠的)。
对于新的传出连接,我希望使用主路由表按范围分配stream量,但是对于某些stream量,我可能想随机平衡两个路由器之间的新连接。
我怀疑我所问的是可以使用iptables和ip ,或者单独使用这些工具。 然而,我发现的HOWTO和其他答案似乎都是针对单个路由器(运行Linux)或主机,具有多个接口,而不是连接到相同接口的多个路由器之间的策略。
编辑 :我发现另一个问题 ,也没有答案,这是问同样的情况(注意192.168.0.0/23作为本地networking),但侧重于传出stream量的策略; 我在这里的问题是关于传入stream量的策略。 (这两个NAT设备都有一个“端口范围到主机的端口转发”function。)
是的,可以一起使用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设备的链接地址。