iptables:将端口redirect到绑定到特定IP的服务器

在具有多个IP的Linux机器上,我遇到了一个问题:将特权端口redirect到服务器正在侦听的非特权端口,该端口绑定到特定IP。

将此规则添加到iptables中,将传入的通信量从端口80redirect到8080:

iptables --table nat --append PREROUTING --protocol tcp --dport 80 \ --jump REDIRECT --to-ports 8080 

然后启动一个netcat监听所有的IP,端口8080:

 nc -l 0.0.0.0 8080 

然后从另一台机器发送一个数据包到端口80:

 echo foo | nc 10.0.0.39:80 echo foo | nc 10.0.0.39:8080 

这两个数据包都被接收到。 现在是奇怪的事情。 当你让netcat监听特定的IP时,它不会看到redirect的数据包。

 nc -l 10.0.0.39 8080 

现在没有收到发送到端口80的数据包。 只有端口8080上的数据包。区别在于服务器如何绑定侦听端口 – 0.0.0.0可以工作,但是特定的IP不能。

问题不在于netcat,因为nginx(我在做基于IP的虚拟主机)有同样的问题。

我试图通过指定目标地址是10.0.0.39来扩展iptables规则,但是这仍然不起作用。

redirect,或透明地伪装远离你的客户端应用程序? 如果你想透明,这样的事情可能会起作用

 iptables -A PREROUTING -t nat -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.39:8080 iptables -A OUTPUT -t nat -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.39:8080