将 NAT 与 iptables 和网桥结合使用

将 NAT 与 iptables 和网桥结合使用

我在防火墙上使用 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 命令可以让它工作。

相关内容