Linux:从局域网到网桥的 NAT 导致网桥组件之间的 nat 错误。如何修复?

Linux:从局域网到网桥的 NAT 导致网桥组件之间的 nat 错误。如何修复?

假设一台机器有 3 个 NIC。两个网桥处于活动状态;从 eth1 到 eth0 上的一个 vlan,从 eth3 到 eth0 上的另一个 vlan。

接口:

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto eth0.4
allow-hotplug eth0.4
iface eth0.4 inet manual
     vlan-raw-device eth0

auto eth0.100
allow-hotplug eth0.100
iface eth0.100 inet manual
     vlan-raw-device eth0

auto eth1
allow-hotplug eth1
iface eth1 inet manual

auto eth3
allow-hotplug eth3
iface eth3 inet manual

auto bri4
iface bri4 inet static
     bridge_ports eth0.4 eth1
     address 192.168.4.1
     network 192.168.4.0
     netmask 255.255.255.0

auto bri100
iface bri100 inet static
     bridge_ports eth0.100 eth3
     address 192.168.100.4
     network 192.168.100.0
     netmask 255.255.255.0
     gateway 192.168.100.3
     dns-nameservers 192.168.100.3

所有这些都 100% 有效。我现在希望将来自 bri4 上网络的所有流量通过 NAT 传输到 bri100。(因为网关就在那里)。

我通过以下方式做到这一点:

iptables -t nat -A POSTROUTING -o bri100 -j MASQUERADE

这对于 bri4 流量也 100% 有效,但 NAT 开始发生在从 eth3 到 eth0.100 的桥接流量上(即两个 bri100 组件)。这当然是完全不想要的,并且会给我的 VoIP 服务器造成混乱。显然 iptables 正在解释 -o bri100 以还包括 bri100 成员内的桥接流量。

我如何才能仅从 bri4 伪装到 bri100,而不在 bri100 的组件之间伪装? POSTROUTING 中没有可用的 -i 选项。

答案1

POSTROUTING可以使用-s来匹配您内部或外部使用的 IP 地址范围,以决定是否执行SNAT/ MASQUERADE。如果您的 LAN 中混合了具有公共 IP 地址的主机和仅具有私有地址的主机,这将非常有用。

但在您的特定情况下,这没有多大意义,因为看起来两个范围都是私有的。如果流量离开您的网络,则两个范围都需要 NAT。如果它没有离开您的网络,则不需要 NAT。

答案2

默认情况下,Linux 通过 iptables(或 ip6tables 传输 ipv6 流量)传输网桥流量。这有有效的用例,但很多时候它更像是 PITA,而不是帮助。

您可以通过 sysctls 禁用此功能

sysctl -w net.bridge.bridge-nf-call-iptables=0 sysctl -w net.bridge.bridge-nf-call-ip6tables=0

相关内容