假设一台机器有 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