具有多个内部和外部接口的 NAT 盒

具有多个内部和外部接口的 NAT 盒

类似的问题已经有 但我的设置有点不同,这些问题的解决方案不起作用。 A 有一台运行 iptables 的 CentOS 6 服务器,有 5 个接口:

  • eth0:管理136.2.188.0/24
  • eth1:Cluster1 内部 10.1.0.0/16
  • eth2:Cluster1 外部 136.2.217.96/27
  • eth3:Cluster2 内部 10.6.0.0/20
  • eth4:Cluster2 外部 136.2.178.32/28

我想做的是让来自 eth1 的流量流出 eth2 并成为 NATd,来自 eth3 的流量流出 eth4 并成为 NATd,所有其他流量(例如到盒子本身的 SSH)都使用 eth0。

为此,我配置了路由表,如下所示:

ip route add default via 136.2.178.33 src 136.2.178.37 table 1
ip route add default via 136.2.217.97 src 136.2.217.124 table 2

ip rule add fwmark 1 pref 1 table 1
ip rule add fwmark 2 pref 2 table 2

源 IP 是 NAT 盒的 IP。管理接口将使用的常规默认路由通常位于表 0 中。

然后,我配置 iptables 使用 mangle 表标记数据包,以便它们使用特定的路由表(如果我理解正确的话)并将 NAT 特定源流量发送到特定接口:

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.6.0.0/20 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.1.0.0/16 -j MARK --set-mark 2
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
iptables -A POSTROUTING -t nat -s 10.6.0.0/20 -o eth4 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 10.1.0.0/16 -o eth2 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j LOG --log-level debug
iptables -A FORWARD -m state --state NEW -s 10.6.0.0/20 -o eth4 -j ACCEPT
iptables -A FORWARD -m state --state NEW -s 10.1.0.0/16 -o eth2 -j ACCEPT
iptables -A FORWARD -j DROP

当我测试这个(来自客户端计算机的 google.com 的简单 wget)时,我可以看到流量进入内部接口(测试中的 eth3),然后使用 NAT 盒的外部 IP 作为外部接口(eth4)。源IP。所以,NAT 本身就可以工作。然而,当系统收到响应数据包时,它应该进入 eth4,但随后什么也没有发生,它永远不会取消 NAT,也永远不会出现在 eth3 上以返回到客户端计算机。

内部接口:

11:52:08.570462 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:09.572867 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:11.576943 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0
11:52:15.580846 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 41584 ecr 0,nop,wscale 7], length 0
11:52:23.596897 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 49600 ecr 0,nop,wscale 7], length 0

外部接口:

11:52:08.570524 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:08.609213 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608368 ecr 34573,nop,wscale 7], length 0
11:52:08.909188 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608668 ecr 34573,nop,wscale 7], length 0
11:52:09.572882 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:09.611414 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835609370 ecr 34573,nop,wscale 7], length 0
11:52:11.576967 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0

那么,为什么流量出去了,但 iptables 没有将返回流量发送回客户端呢?看起来路由是正确的,因为数据包离开并到达正确的接口,那么 iptables 对返回流量做了什么?

答案1

好吧,我明白了。我要做的是将内部子网路由添加到每个路由表,然后设置规则来控制传入/传出的接口流量。然后在 iptables 中不需要用 mangle 表标记数据包,只需要典型的转发和 nat 规则。

ip route add 136.2.178.32/28 dev eth4 table 1
ip route add 10.6.0.0/20 dev eth3 table 1
ip route add default via 136.2.178.33 src 136.2.178.37 table 1
ip rule add iif eth4 table 1
ip rule add from 10.6.0.0/20 table 1

ip route add 136.2.217.96/28 dev eth2 table 2
ip route add 10.1.0.0/16 dev eth1 table 2
ip route add default via 136.2.217.113 src 136.2.217.124 table 2
ip rule add iif eth2 table 2
ip rule add from 10.1.0.0/16 table 2

iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j     ACCEPT
iptables -A FORWARD -i eth1 -o eth2 -m state --state NEW -j LOG --log-level debug
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth4 -o eth3 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth3 -o eth4 -m state --state NEW -j LOG --log-level debug
iptables -A FORWARD -i eth3 -o eth4 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth4 -j MASQUERADE

相关内容