仅用于两个端口的 IPTables 和 SNAT

Sco*_*MVP 2 nat iptables

我想设置一些 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
Run Code Online (Sandbox Code Playgroud)

我有这个共享规则:

-A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用。添加该规则后,我仍然可以从工作站使用 RDP。

概括地说,我的目标是允许某些工作站只能通过 http/https 访问 Internet。应阻止所有其他出站流量。应该允许所有流量。我希望网络中的所有其他工作站都使用现有的 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
Run Code Online (Sandbox Code Playgroud)

他们还没有完全工作,但他们正在接近。更多在我对@Zoredache 的回复中。

Zor*_*che 6

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
Run Code Online (Sandbox Code Playgroud)

如果您要在最终规则之前添加另一条规则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
Run Code Online (Sandbox Code Playgroud)