Рассмотрим машину с 3 сетевыми адаптерами. Активны два моста; с eth1 на vlan на eth0 и с eth3 на другой vlan на eth0.
Интерфейсы:
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 в bri100 через NAT. (Потому что там шлюзы).
Я делаю это:
iptables -t nat -A POSTROUTING -o bri100 -j MASQUERADE
Это также работает на 100% для трафика bri4, НО NAT начинает происходить с трафиком, который передается от eth3 к eth0.100 (т.е. два компонента bri100). Это, конечно, совершенно нежелательно и вызывает хаос на моих серверах VoIP. Очевидно, что iptables интерпретирует -o bri100, чтобы ТАКЖЕ включить мостовой трафик в членах bri100.
Как мне замаскироваться ТОЛЬКО от bri4 до bri100, а не между компонентами bri100? В POSTROUTING нет опции -i.
В POSTROUTING
ты можешь использовать -s
чтобы сопоставить диапазон IP-адресов, которые вы используете внутри или снаружи, чтобы решить, выполнять ли SNAT
/MASQUERADE
. Это полезно, если в вашей локальной сети есть хосты с общедоступными IP-адресами и хосты только с частными адресами.
В вашем конкретном случае это не имеет большого смысла, хотя кажется, что оба диапазона являются частными. Если трафик покидает вашу сеть, тогда NAT необходим для обоих диапазонов. Если он не уходит из вашей сети, значит, NAT не нужен.
По умолчанию Linux передает трафик моста через iptables (или ip6tables для трафика ipv6). Для этого есть допустимые варианты использования, но в большинстве случаев это скорее PITA, чем помощь.
Вы можете отключить эту функцию через sysctls
sysctl -w net.bridge.bridge-nf-call-iptables = 0 sysctl -w net.bridge.bridge-nf-call-ip6tables = 0