Есть два моста, br0 и br1. br0 смотрит локалку, br1 - в адресное пространство, выданное провом.
Есть такие вот правила iptables:
-A PREROUTING -d $(gate_addr)/32 -p tcp -m multiport --dports $(ports) -j DNAT --to-destination 192.168.1.3
-A PREROUTING -d $(gate_addr)/32 -p tcp --dport $(port) -j DNAT --to-destination 192.168.1.2
-A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source $(gate_addr)
-A POSTROUTING ! -s 192.168.1.0/24 -p tcp -m multiport --dports $(ports) -j SNAT --to-source 192.168.1.1
-A POSTROUTING ! -s 192.168.1.0/24 -p tcp -m tcp --dport 4897 -j SNAT --to-source 192.168.1.1
COMMIT
192.168.1.1 - адрес интерфейса br0
$(gate_addr) - реальный внешний адрес гейта
Вопрос в следующем:
Эти правила прекрасно работают и все задачи решены. Но, стоит только поставить в правило построута значение -o br0, вместо того, что выделено жирным, то становится невозможно подключиться на проброшенные порты. Настраивал по удаленке.
По логике вещей, я сначу исходящие из интерфейса br0 пакеты в реальный адрес гейта. До добавления моста с реальными ip все работало именно так.
Где моя ошибка? Мне просто интересно почему не работает при указании интерфейса. Дело принципа, так сказать.