使用 iptables 进行安全 NAT 设置

The*_*igB 5 debian firewall nat iptables

我有一台运行 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以对此有所了解吗?

已解决: 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
Run Code Online (Sandbox Code Playgroud)

你会认为我现在可以做 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
Run Code Online (Sandbox Code Playgroud)

最后我将FORWARD链的默认策略设置为DROP. 我们又回到了第一广场。

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

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

所以现在它似乎完全按照我想要的方式工作。完整脚本在这里。谢谢!

Ram*_*Ram 3

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