使用 iptables 进行安全 NAT 设置

使用 iptables 进行安全 NAT 设置

我有一台运行 Debian 的设备,需要充当互联网网关。除此之外,我还想提供一个防火墙,不仅可以阻止入站流量,还可以阻止出站流量。我认为 iptables 应该可以完成这项工作。

问题:我已经正确配置了 NAT(我想是吧?),但是一旦我将默认策略设置为 DROP 并添加规则(例如允许来自 LAN 内部的 HTTP 流量),HTTP 就无法通过。所以基本上我的规则似乎不起作用。

下面是我使用的iptables的初始化脚本,设备有两块网卡,分别是eth0(WAN接口),eth1(LAN接口)。

echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush tables
iptables -F
iptables -t nat -F

# Set policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow outbound HTTP from LAN? 
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

有人可以解释一下这个问题吗?

解决了: Mike 建议使用 telnet 和 IP 而不是域名来测试 HTTP 流量,这导致了两个发现:DNS 无法正常工作并且出站过滤也无法正常工作(我可以通过 telnet 连接到端口 8080)。

因此,我首先添加了规则,允许 LAN 客户端使用网关的服务,例如 DNS。(是的,别担心,我会将范围缩小到提供的服务)

iptables -A INPUT -i eth1 -d 172.16.0.1 -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

您可能认为我现在可以执行 DNS 请求。实际上我可以,但请求超时,因为网关无法自行执行 DNS 请求。添加了出站 DNS 规则:

iptables -A OUTPUT -o eth0 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT

最后我将链的默认策略设置FORWARDDROP。然后我们又回到了原点。

当我正要发布更新时,我看到 Ram 的回复建议我允许现有连接的入站流量。我也在OUTPUT上面的链上应用了这个原则。

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

所以现在它似乎正如我所希望的那样运行。完整脚本在这里。 谢谢!

答案1

您需要允许回复您的出站请求。

答案2

我本来打算在收到评论回复后将其添加为答案,但看起来您跟上了我的思路……我注意到您未在内部接口上允许 DNS。祝您的服务好运。

相关内容