iptables 无法对多个 IP 地址进行 NAT

iptables 无法对多个 IP 地址进行 NAT

我有一台带有两个网络适配器的服务器:eth0 和 eth1。此服务器运行两个不同的 https 网络服务器:一个在 eth0 上监听(172.29.49.112:8443),另一个在 eth1 上监听(172.29.49.113:4443)

我有 iptables 的 NAT 规则,可以成功重定向这两个应用程序的标准 https 端口 (443),但 iptables 规则仅适用于规则(它激活哪一个规则似乎是在重启时随机的)。

以下是启动时从 rc.local 加载的规则(是的,我知道不建议从 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.服务器名称.localnetgerrit.服务器名称.localnet而不是jenkins.服务器名称.本地网络:4443等等(显然 jenkins.servername.localnet 解析为 172.29.49.113,对于 gerrit 则解析为 .112)。

有一次,我以为可能是 jenkins/gerrit 网络服务器监听所有 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 不是一个简单的解决方案,因为 gerrit 是通过脚本初始化的。authbind 是一个可能可以做我想做的事情的工具,但我宁愿避免另一层。

答案1

Tero Kilkanen 为我指明了正确的方向,尽管我花了一段时间才搞清楚语法。看起来 iptables 对于新重定向的数据应该发送到哪个 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 的注意事项:使用通配符设置输入 nic 并没有什么区别。(特别是因为默认情况下 iptables 会为输入 nic 设置通配符条目,所以不需要指定“eth+”)但无论如何还是感谢您抽出时间回复。

相关内容