仅针对两个端口的 IPTables 和 SNAT

仅针对两个端口的 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 访问互联网。所有其他出站流量都应被阻止。所有流量都应被允许。我希望网络中的所有其他工作站都使用现有的 NAT 策略来允许所有出站流量进行 NAT。

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

-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 的回复。

答案1

iptables 的关键是先匹配获胜。

假设客户端机器是,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,因此它们将与 ACCEPT 规则匹配,这意味着它们不会被 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

相关内容