我在防火墙上使用 iptables 配置 NAT 时遇到困难。
我的防火墙设置如下:
- 它是一个第 2 层透明防火墙,位于我的网关和 ISP 的网关之间
- 我将两个接口桥接为 br0。这两个接口在我的ISP端是eno0,在我的本地网络端是eno1
- 除了 NAT 规则之外,我基本上没有设置任何 iptables 规则
这是我的规则:
root@firewall:~# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
root@firewall:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.50.1.0/24 -j SNAT --to-source xxx.195.142.205
root@firewall:~# iptables -t mangle -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
简而言之,问题在于地址转换适用于传出流量,但不适用于回复。这是一个测试示例:
- 我在 LAN 上连接了一台 IP 为 10.50.1.7 的笔记本电脑,并用它来 ping 8.8.8.8
- 在防火墙上,使用
tcpdump -i eno1
,我看到从 10.50.1.7 到 8.8.8.8 的 ICMP 请求,但没有回复 - 在防火墙上,使用
tcpdump -i eno0
,我看到从 xxx.195.142.205 到 8.8.8.8 的 ICMP 请求,以及从 8.8.8.8 到 xxx.195.142.205 的 ICMP 回复 - 显然,在笔记本电脑上,我没有收到 ICMP 回复
因此回复不会转换回本地 IP。我缺少什么?
感谢您的帮助!
(注意:当删除 NAT 规则并在笔记本电脑上使用公共 IP xxx.195.142.205 时,我可以完全访问互联网)
答案1
正如 @dirkt 所建议的,看起来 conntrack 不能很好地与桥配合使用。因此,不需要的 iptables 规则似乎可以在网桥上工作,但不能在 NAT 上工作。
当我将防火墙配置为第 3 层防火墙后,问题就解决了。
如果其他人感兴趣:我在网上广泛搜索了是否可以使用带 NAT 的透明第 2 层防火墙,但从未得到直接答案。
ebtables 网站确实表明这是可能的:
bridge-nf 代码使 iptables 看到桥接的 IP 数据包并启用透明 IP NAT。
我从来没有发现哪个 ebtables 命令可以让它工作。