URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 73657
[ Назад ]

Исходное сообщение
"FreeBSD+pf+три два провайдера+НАТ во внутрь"

Отправлено KlounAda , 23-Апр-07 09:56 
Итак, по порядку.

В свое время была задача подключить один сервер ко всем трем провайдерам для раздачи сервиса независимо от шлюза по умолчанию. Задача была успешно решена такой конструкцией:

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 (интерфейсе шлюза по умолчанию), никуда не уходит  Интренет - ничего не работает :(

Где копать???


Содержание

Сообщения в этом обсуждении
"FreeBSD+pf+три два провайдера+НАТ во внутрь"
Отправлено niksonnnn , 23-Апр-07 10:11 
>Итак, по порядку.
>
>В свое время была задача подключить один сервер ко всем трем провайдерам
>для раздачи сервиса независимо от шлюза по умолчанию. Задача была успешно
>решена такой конструкцией:
>
>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 (интерфейсе шлюза по умолчанию), никуда не уходит  Интренет
>- ничего не работает :(
>
>Где копать???

binat в сторону интерфейса назначения?


"FreeBSD+pf+три два провайдера+НАТ во внутрь"
Отправлено KlounAda , 24-Апр-07 01:46 
>binat в сторону интерфейса назначения?
Пробовал,все равно обратные пакеты формируются на интерфейсе, который указан шлюзом по умолчанию :( Обидно.. ведь если сервис поднят на самом сервере - все работает,а только делаешь НАТ то вот такая фигня получается.