iptables不能NAT多个IP地址

我有一个服务器与两个networking适配器:eth0和eth1。 此服务器运行两个不同的HTTPS Web服务器:一个是监听eth0(172.29.49.112:8443)另一个监听eth1(172.29.49.113:4443)

我有iptablesNAT规则,可以成功redirect这两个应用程序的标准https端口(443),但是iptables规则一次只能用于其中一个规则(它在激活时似乎是随机的)。

这里是在启动时从rc.local加载的规则(是的,我知道不build议从rc.local运行我的防火墙规则):

#!/bin/sh -e # setup port forwarding for gerrit and jenkins instances su root -c "/sbin/iptables -t nat -A PREROUTING -i eth1 -d 172.29.49.113 -p tcp --dport 443 -j REDIRECT --to-port 4443" su root -c "/sbin/iptables -t nat -A PREROUTING -i eth0 -d 172.29.49.112 -p tcp --dport 443 -j REDIRECT --to-port 8443" # start gerrit (jenkins should auto-start as a service) su gerrit2 -c "/home/gerrit2/gerrit/bin/gerrit.sh start" exit 0 

这里是“iptables -t nat -L -n -v”的输出:

 Chain PREROUTING (policy ACCEPT 14458 packets, 1446K bytes) pkts bytes target prot opt in out source destination 6 360 REDIRECT tcp -- eth0 * 0.0.0.0/0 172.29.49.112 tcp dpt:443 redir ports 8443 0 0 REDIRECT tcp -- eth1 * 0.0.0.0/0 172.29.49.113 tcp dpt:443 redir ports 4443 Chain INPUT (policy ACCEPT 7436 packets, 874K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 94 packets, 7050 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 94 packets, 7050 bytes) pkts bytes target prot opt in out source destination 

正如你所看到的,没有其他的规则被加载。

当我只运行两条规则中的一条时,一切正常(对于该规则),但是即使我用“iptables -t nat -F”清除了规则,我也无法启用其他规则(除非我重新启动 – 看起来好像正确清理事情)。

我为什么要这样做? 我希望我的用户能够访问jenkins.servername.localnetgerrit.servername.localnet,而不是jenkins.servername.localnet:4443等(很显然,jenkins.servername.localnetparsing为gerrit的172.29.49.113和.112)。

有一次,我认为可能是jenkins / gerritnetworking服务器倾听所有引起问题的IP。 但是他们都只能听一个IP(jenkins – 172.29.49.113,gerrit – 172.29.49.112)。

这可能不是必需的,但只要有帮助 – 这里是ifconfig的输出:

 eth0 Link encap:Ethernet HWaddr 00:0c:29:99:52:e8 inet addr:172.29.49.112 Bcast:172.29.63.255 Mask:255.255.240.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:78588 errors:0 dropped:0 overruns:0 frame:0 TX packets:27399 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:16180230 (15.4 MiB) TX bytes:6329245 (6.0 MiB) eth1 Link encap:Ethernet HWaddr 00:0c:29:99:52:f2 inet addr:172.29.49.113 Bcast:172.29.63.255 Mask:255.255.240.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:45058 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3496805 (3.3 MiB) TX bytes:378 (378.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1090 errors:0 dropped:0 overruns:0 frame:0 TX packets:1090 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:268078 (261.7 KiB) TX bytes:268078 (261.7 KiB) 

几乎令人沮丧,因为它几乎工作。

我正在运行Debian Wheezy,Gerrit 2.10和Jenkins 1.604。

我已经看过的东西:CAP_NET_BIND_SERVICE不是一个简单的解决scheme,因为gerrit是通过脚本初始化的。 authbind是一个工具,可能会做我想做的,但我宁愿避免又一层。

Tero Kilkanen在这方面指出了我的正确方向,尽pipe我花了一段时间来研究语法。 看起来iptables很困惑新的redirect数据应该去哪个IP。

DNAT指定目标端口目标IP,所以现在它工作正常。 我使用的最终命令如下:

 su root -c "/sbin/iptables -t nat -A PREROUTING -p tcp -m tcp -d 172.29.49.113 --dport 443 -j DNAT --to 172.29.49.113:4443" su root -c "/sbin/iptables -t nat -A PREROUTING -p tcp -m tcp -d 172.29.49.112 --dport 443 -j DNAT --to 172.29.49.112:8443" 

注意到wurtel和user1036745:使用通配符设置inputnic没有什么区别。 (特别是因为默认情况下,iptables为inputnic设置了一个通配符条目,所以不需要指定“eth +”)但是谢谢您花时间回复。