Страница 1 из 1

pf + 2 внешних канала

Добавлено: 2009-07-02 14:57:00
maxd
Дано:
freebsd 7.0 + pf в ядре
2 канала в инет лимитный (isp) и безлимитый (adsl).
adsl поднимается как ppp -ddial adsl
pf.conf:

Код: Выделить всё

# первый провайдер
isp_if="rl0"
isp_gw="10.10.10.1"

# второй провайдер
adsl_if="tun0"
adsl_gw="78.x.x.1" # он же дефлотовый маршрут

# локалка
lan_if="rl1"
lan_ip="192.168.1"

# внутренние ресурсы провайдера isp
table <isp_nets> { 88.x.x.x/16, 81.x.x.x/16 }

# юзеры, которые будут ходить через isp
table <isp_users> { $lan_ip.2, $lan_ip.3, $lan_ip.4, $lan_ip.5 }

# юзеры, которые будут ходить через adsl
table <adsl_users> { $lan_ip.100, $lan_ip.101 }

set block-policy drop
set skip on lo0
scrub in

nat on $adsl_if from $lan_if:network to <isp_nets> -> ($isp_if)
nat on $adsl_if from <isp_users> to !$lan_if:network -> ($isp_if)
nat on $adsl_if from $lan_if:network to !$lan_if:network -> ($adsl_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $lan_if proto tcp from $lan_if:network to !$lan_if:network port 21 -> 127.0.0.1 port 8021

block log all

anchor "ftp-proxy/*"

pass out quick on $adsl_if route-to ($isp_if $isp_gw) from $isp_if to any
pass out on $adsl_if
pass out on $isp_if

pass in on $lan_if proto tcp from $lan_if:network to $lan_if port 22
pass in on $lan_if from { <adsl_users>,<isp_users> } to !$lan_if:network
При такой конфигурации все работает, но инет через провайдера isp жутко тормозит, даже внутренние ресурсы. Пришлось положить adsl и ходить пока только через isp при такой конфигурации:

Код: Выделить всё

# провайдер
isp_if="rl0"
isp_gw="10.10.10.1"

# локалка
lan_if="rl1"
lan_ip="192.168.1"

# юзеры, которым разрешен инет
table <isp_users> { $lan_ip.2, $lan_ip.3, $lan_ip.4, $lan_ip.5, $lan_ip.100, $lan_ip.101 }

set block-policy drop
set skip on lo0
scrub in

nat on $isp_if from $lan_if:network to !$lan_if:network -> ($isp_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $lan_if proto tcp from $lan_if:network to !$lan_if:network port 21 -> 127.0.0.1 port 8021

block log all

anchor "ftp-proxy/*"

pass out on $isp_if
pass in on $lan_if proto tcp from $lan_if:network to $lan_if port 22
pass in on $lan_if from <users> to !$lan_if:network
Так инет работает без тормозов.
Как сделать, чтоб вместе они работали как надо?

Re: pf + 2 внешних канала

Добавлено: 2009-07-02 15:11:06
schizoid
попробуй добавить

Код: Выделить всё

#-----------------------------------------Scrub-------------------------------------------------------------------
scrub in all fragment reassemble
scrub    on { $ext_if_d $ext_if_s } all reassemble tcp
scrub out all random-id max-mss 1440

Re: pf + 2 внешних канала

Добавлено: 2009-07-02 15:24:16
maxd
не помогло

Re: pf + 2 внешних канала

Добавлено: 2009-07-02 15:58:27
AzureZ
А это не опечатка случаем?
nat on $adsl_if from $lan_if:network to <isp_nets> -> ($isp_if)
nat on $adsl_if from <isp_users> to !$lan_if:network -> ($isp_if)

Re: pf + 2 внешних канала

Добавлено: 2009-07-02 17:15:27
maxd
AzureZ писал(а):А это не опечатка случаем?
nat on $adsl_if from $lan_if:network to <isp_nets> -> ($isp_if)
nat on $adsl_if from <isp_users> to !$lan_if:network -> ($isp_if)
Нет, здесь все верно. Дефолтовый маршрут - adsl и в таблице дополнительно ничего не прописано, поэтому тут мы натим на интерфейсе $adsl_if и подставляем адрес $isp_if и далее правилом отправляем эти пакеты нужным маршрутом:

Код: Выделить всё

pass out quick on $adsl_if route-to ($isp_if $isp_gw) from $isp_if to any

Re: pf + 2 внешних канала

Добавлено: 2009-07-02 18:37:00
AzureZ
А понял. Т.е маршрут вы меняете после ната. А почему не до ната? (Сори за офотоп)

Re: pf + 2 внешних канала

Добавлено: 2009-07-03 9:47:20
maxd
оффтоп - не оффтоп, но я переписал правила и стал перенаправлять до трансляции, т.е. при входе на локальный интерфейс и инет побежал веселее.

Код: Выделить всё

# до этого все без изменений
nat on $adsl_if from $lan_if:network to !$lan_if:network -> ($adsl_if)
nat on $isp_if from $lan_if:network to !$lan_if:network -> ($isp_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $lan_if proto tcp from $lan_if:network to !$lan_if:network port 21 -> 127.0.0.1 port 8021

block log all

anchor "ftp-proxy/*"

pass out on $adsl_if
pass out on $isp_if

pass in on $lan_if proto tcp from $lan_if:network to $lan_if port 22

pass in on $lan_if from <isp_users> to !$lan_if:network tag TO_ISP
pass in on $lan_if from { <isp_users>,<adsl_users> } to <isp_nets> tag TO_ISP
pass in on $lan_if from <adsl_users> to !$lan_if:network

pass in on $lan_if route-to ($isp_if $isp_gw) tagged TO_ISP
Можно и не метить, а сразу route-to, но тут приведен упрощенный набор, поэтому оно пригодится. Мне кажется написание правил немного усложнилось, но зато работает как надо. В общем - моя проблема решена, спасибо за наводку :smile:

Re: pf + 2 внешних канала

Добавлено: 2009-07-03 9:56:07
AzureZ
Можно сети провайдера и статически прописать.

Re: pf + 2 внешних канала

Добавлено: 2009-07-03 11:16:26
maxd
Можно, но при потере связи с этим провом, нужно будет снова править таблицу маршрутизации и подгрузить новые правила pf, а так только правила. Мне показалось проще это сделать в одном месте.
Кстати, есть 2 фтп сервера внутри сети прова, к которым нужно прописывать статичный маршрут, ибо фтп-прокси лезет через дефолтовый маршрут, даже с опцией -a <адрес на карте, смотрящей в сторону этого провайдера>. Правило

Код: Выделить всё

pass out quick on $adsl_if route-to ($isp_if $isp_gw) from $isp_if to any
еще как-то пыталось пинками вытолкнуть его пакеты по идущие по 21 порту, но, как показывает tcpdump, следующие пакеты по 20 порту идут уже по другому каналу. С этим я уже смрился.

Re: pf + 2 внешних канала

Добавлено: 2009-07-03 18:45:46
iZEN
maxd писал(а):Можно, но при потере связи с этим провом, нужно будет снова править таблицу маршрутизации и подгрузить новые правила pf, а так только правила. Мне показалось проще это сделать в одном месте.
Кстати, есть 2 фтп сервера внутри сети прова, к которым нужно прописывать статичный маршрут, ибо фтп-прокси лезет через дефолтовый маршрут, даже с опцией -a <адрес на карте, смотрящей в сторону этого провайдера>. Правило

Код: Выделить всё

pass out quick on $adsl_if route-to ($isp_if $isp_gw) from $isp_if to any
еще как-то пыталось пинками вытолкнуть его пакеты по идущие по 21 порту, но, как показывает tcpdump, следующие пакеты по 20 порту идут уже по другому каналу. С этим я уже смрился.
не надо указывать defaultrouter в /etc/rc.conf. Путь PF сам занимается маршрутизацией трафика.