我正在尝试理解 physdev iptables 模块,但在使用 nat 表时遇到了问题,尤其是 POSTROUTING 链。因此,我的目标是使用 physdev 模块对桥接接口上的传出流量进行 SNAT。
这是我的迷你网络设置:PC1 - (enp6s0f0)BRIDGE(enp6s0f1) - PC2。PC1是 192.168.100.1/24,PC2 是 192.168.100.2/24。
我的桥梁设置是:
ifconfig enp6s0f0 down
ifconfig enp6s0f1 down
brctl addbr br0
brctl addif enp6s0f0 br0
brctl addif enp6s0f1 br0
ifconfig enp6s0f0 0.0.0.0 up
ifconfig enp6s0f1 0.0.0.0 up
ifconfig br0 169.254.100.1/32 up
该桥接设置工作正常,PC1 和 PC2 可以相互通信,但不能按预期与桥接器通信。
现在,例如,我想要以这样的方式设置 PC 和 BRIDGE 之间的通信,即 PC1 将 BRIDGE 视为 192.168.100.100,而 PC2 将 BRIDGE 视为 192.168.100.200。
所以我添加了路线:
route add -net 192.168.100.0/24 dev br0
现在,如果我从 BRIDGE ping 任何一台 PC,我就可以像预期的那样看到来自网桥的源 IP 为 169.254.100.1 的传出流量。
现在一切都与 iptables 有关。我的规则:
iptables -t nat -A POSTROUTING -s 169.254.100.1 -m physdev --physdev-out enp6s0f0 -j SNAT --to-source 192.168.100.100
iptables -t nat -A POSTROUTING -s 169.254.100.1 -m physdev --physdev-out enp6s0f1 -j SNAT --to-source 192.168.100.200
在此之后,我希望从网桥传出的所有流量都根据 physdev-out 进行 SNAT 到 192.168.100.100 或 192.168.100.200,但这并没有发生。为什么?我不知道。发生的事情是规则被忽略了。iptables -t nat -vnL 显示0 个数据包与规则匹配,tcpdump -i enp6s0f0 -p arp -n 显示所有 arp 请求都具有旧的 169.254.100.1 源 ip 地址。
还需要注意的是,我已经加载了br-netfilter模块,并且将bridge-nf-call-iptables设置为 1。
我使用的操作系统是 Ubuntu 20.04,但我也尝试了其他操作系统。我也在互联网上查找了信息,我知道还有其他几种方法可以实现我想要的行为,但我想弄清楚为什么这种特定方法不起作用。
我还查看了https://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html,读完之后,我觉得一切都应该可以正常工作。请帮帮我