Итак, по порядку.В свое время была задача подключить один сервер ко всем трем провайдерам для раздачи сервиса независимо от шлюза по умолчанию. Задача была успешно решена такой конструкцией:
ext_if='интерфейс 1-го провайдера, провайдер по умолчанию'
ext_if2='интерфейс 2-го провайдера'
ext_gw='gw 1-го провайдера'
ext_gw2='gw 2-го провайдера'
ext_ip='IP внешний 1-го провайдера'
ext_ip2='IP внешний 2-го провайдера'
...
block in all
...
pass in from any to $ext_ip port {service}
pass in from any to $ext_ip2 port {service}
...
pass out quick on $ext_if route-to($ext_if2 $ext_gw2) from ($ext_if2) to any keep state
pass out quick on $ext_if route-to($ext_if $ext_gw) from ($ext_if) to any keep state
Все прекрасно работает, но тут встала задача отдавать наружу сервисы не с самого сервера, а с сервера на другом канале. Схема такая - есть сервер GW, подключенный к локалке LAN и нескольким провайдерам (для примера хватит двух Pub1 и Pub2)и к локалке подключен еще один специальный канал на котором доступен некий сервис SERVISE.
Чтобы этот сервис был виден из Интернета через Pub1 или Pub2 подойдет только редирект с натом во внутреннюю сеть, например так:
rdr proto tcp from any to $ext_ip2 port 7769 -> (SERVICE) port 7769
nat from any to (SERVICE) port 7769 -> 192.168.224.211 static-port
rdr proto tcp from any to $ext_ip port 7769 -> (SERVICE) port 7769
nat from any to (SERVICE) port 7769 -> 192.168.224.211 static-port
В чем загвоздка - если сервис НАТить в другой канал, то снаружи работает только через провайдера по умолчанию. Посмотрев траффик tcpdump обнаружил, что пакеты у провайдера НЕ по умолчанию формируются неправильно, если по русски:
когда я стучусь на $ext_if (внешний интерфейс прова по умолчанию) то пакет НАТиться в локалку и попадает на нужный сервис, сервис отвечает, пакет летит обратно на внутренний GW, НАТ преобразует его обратно и он появляется на нужном $ext_if и уходит в Интренет - все работает
когда же я стучусь на $ext_if2 (внешний интерфейс альтернативного прова) то пакет НАТиться, сервис отвечает, пакет летит обратно на внутренний GW, НАТ преобразует его обратно НО он появляется не на $ext_if2 (как надо) а на $ext_if (интерфейсе шлюза по умолчанию), никуда не уходит Интренет - ничего не работает :(
Где копать???