iptables(DNAT)使用“-dport”标志时获取“multiple -d标志不允许错误”

我有一台主机充当其他主机的网关。 eth0(192.168.1.3)通过路由器连接到互联网,eth1(172.16.2.50)通过交换机连接到内部networking。 鉴于此,该主机还运行绑定到eth1的服务并为内部networking提供服务。 我想把这个服务扩展到外部世界,并试图操纵iptables,以便通过eth0发送到这个主机的任何请求被发送到192.168.1.3:80发送到172.16.2.50,并且互联网用户也可以使用该服务。

这里是我设置主机作为网关的iptable规则(这些工作正常):

sudo iptables -t nat -A POSTROUTING -s 172.16.2.0/16 -o eth0 -j MASQUERADE sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE sudo iptables -A FORWARD -s 172.16.2.0/16 -o eth0 -j ACCEPT sudo iptables -A FORWARD -d 172.16.2.0/16 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT 

这些是我想添加到iptables的规则,以达到我的目的:

 sudo iptables -A INPUT -d 192.168.1.3 -p tcp -dport 80 -i eth0 -j ACCEPT sudo iptables -t nat -A PREROUTING -d 192.168.1.3 -p tcp -dport 80 -j DNAT --to-destination 172.16.2.50:80 sudo iptables -t nat -A PREROUTING -s 172.16.2.50 -p tcp -sport 80 -j SNAT --to-source 192.168.1.3:80 sudo iptables -A FORWARD -d 192.168.1.3 -p tcp -dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT 

当我这样做,我得到的错误,如:“多个D标志不允许”…有人可以告诉我如何解决这个错误…并做我想添加的条目将符合我的目的?

谢谢!

正如@Vladimir所说的,你需要使用双破折号来编写--sport--dport 。 使用单一破折号为-dport混淆iptables关于使用另一个-d选项。

对于规则的正确性,添加此规则来实现您的目标就足够了:

 iptables -t nat -A PREROUTING -d 192.168.1.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.2.50 

这应该工作,假设你正在接收来自互联网(从你的路由器)的IP 192.168.1.3(私有NAT到路由器完成)的stream量。

另外,您可以只写一次RELATED / ESTABLISHED规则,并以下面的forms:

 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 

只允许所有相关/build立的连接。 这不应该是一个安全漏洞,因为您只允许使用其他FORWARD规则的相关stream量。

–sport–dport参数都需要2个破折号在他们面前,我想这是导致你得到的错误。