我想设置一些 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。应阻止所有其他出站流量。应该允许所有流量。我希望网络中的所有其他工作站都使用现有的 NAT 策略来允许对所有出站流量进行 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
那么你只需要按顺序查看这些规则。如果第一条规则不匹配,它将传递它将匹配的 MASQ 规则。如果您要在最终规则之前添加另一条规则
MASQUERADE
,则 NAT 不会发生。由于来自 10.10.1.10 的数据包将不会发往 tcp/80 或 tcp/443 将匹配 ACCEPT 规则,这意味着它们不会被 SNAT/MASQ 规则转换。