IPTables和SNAT只有两个端口

我想设置一些NAT策略,以便某些机器只能出站访问http / https。 他们不应该能够进行端口扫描或从他们的机器的其他任何东西。

目前我的NAT规则是:

-A PREROUTING -d 1.2.3.4 -j DNAT --to-destination 10.10.1.10 -A POSTROUTING -s 10.10.1.10 -j SNAT --to-source 1.2.3.4 

我有这个共同的规则:

 -A POSTROUTING -o eth0 -j MASQUERADE 

1.2.3.4是公共IP,10.10.1.10是内部IP。

这允许直接通过所有入站和出站访问NAT。

我尝试了以下的POSTROUTING规则而不是上面的规则:

 -A POSTROUTING -s 10.10.1.10 -p tcp --dport 80 -j SNAT --to-source 1.2.3.4:80 

但是,这似乎并不奏效。 添加规则后,我仍然可以从工作站使用RDP。

回顾一下,我的目标是让某些工作站只能通过http / https访问Internet。 所有其他出站stream量应该被阻止。 所有的交通应该被允许。 我希望networking中的所有其他工作站都使用现有的NAT策略,以允许所有出站stream量进行NAT。

更新根据@ Zoredache的回复,我现在有以下的出场规则。

 -A POSTROUTING -s 10.10.1.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.2.3.4:80 -A POSTROUTING -s 10.10.1.10/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 1.2.3.4:443 -A POSTROUTING -s 10.10.1.10/32 -p tcp -m tcp --dport 53 -j SNAT --to-source 1.2.3.4:53 -A POSTROUTING -s 10.10.1.10/32 -p tcp -m udp --dport 53 -j SNAT --to-source 1.2.3.4:53 -A POSTROUTING -s 10.10.1.10/32 -j ACCEPT -A POSTROUTING -o eth0 -j MASQUERADE 

他们还没有工作,但他们正在接近。 更多在我的回复下面的@ Zoredache。

iptables的关键是第一场胜利。

假设客户机是10.10.1.10那么你只需10.10.1.10顺序看这些规则。 如果第一个规则不匹配,它将传递匹配的MASQ规则。

 -A POSTROUTING -s 10.10.1.10 -p tcp --dport 80 -j SNAT --to-source 1.2.3.4:80 -A POSTROUTING -o eth0 -j MASQUERADE 

如果您在最终的MASQUERADE规则之前添加另一条规则,导致NAT不发生。 由于来自10.10.1.10的数据包不会被注定为tcp / 80或tcp / 443,它们将与接受规则匹配,这意味着它们不会被SNAT / MASQ规则翻译。

 -A POSTROUTING -s 10.10.1.10 -p tcp --dport 80 -j SNAT --to-source 1.2.3.4:80 -A POSTROUTING -s 10.10.1.10 -p tcp --dport 443-j SNAT --to-source 1.2.3.4:443 -A POSTROUTING -s 10.10.1.10 -j ACCEPT -A POSTROUTING -o eth0 -j MASQUERADE