Имеем сервер с 3 сетевыми картами (одна смотрит в локалку, две в интеренет: основной и резервный каналы)
eth0 (192.168.0.150) - локалка
eth1 (a.a.a.a) - основной канал
eth2 (b.b.b.b) - резервный канал
сделанны следующие правила iproute2:
ip route add default via шлюз_основного table 1
ip rule add from a.a.a.a table 1
ip route add default via шлю_резервный table 2
ip rule add from b.b.b.b table astel
ip ro add default a.a.a.a
всё, ответы у нас уходят в теже интерфейсы, откуда и пришёл запрос.
едем дальше. в локальной сети есть сервер 192.168.1.175
на него сделан маппинг с внешних адресов:
$IPTABLES -t nat -A PREROUTING -p tcp -i eth1 -d a.a.a.a --dport 20240 -j DNAT --to-destination 192.168.1.175:2775
$IPTABLES -t nat -A PREROUTING -p tcp -i eth2 -d b.b.b.b --dport 20240 -j DNAT --to-destination 192.168.1.175:2775
НО!!! доступ к этому серваку возможен только с адресов локальной сети, поэтому прежде чем пустить пакет, мы его натим:
$IPTABLES -t nat -I POSTROUTING -o eth0 -d 192.168.1.0/24 -j SNAT --to-source 192.168.0.150
и, соответственно, когда пакет будет идти в интернет, его ещё раз надо отнатить:
$IPTABLES -t nat -I POSTROUTING -o eth1 -s 192.168.0.0/16 -j SNAT --to-source a.a.a.a
$IPTABLES -t nat -I POSTROUTING -o eth2 -s 192.168.0.0/16 -j SNAT --to-source b.b.b.b
А теперь, собственно, проблема...
когда клиенты стучаться на а.а.а.а:20240 - всё ок, так как на этом интерфейсе у меня дефолт гейтвей
а вот когда они стучаться на eth2 b.b.b.b:20240, ответ им уходит через a.a.a.a (eth1)
Замеченно, что такой полярный лисиц происходит именно тогда, когда используется 2-ой натинг. Если, скажем, сделать маппинг на другой адресб при этом внешний адрес не превращать в локальный, то всё ок.
Вот такие грабли. Это баг или фича?
