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

FreeBSD, pf

Добавлено: 2009-05-14 9:56:48
pf, два провайдера, пустить трафик по резервному провайдеру.
Имеется два провайдера, первый дефолный и является шлюзом по умолчанию. Второй в общем резервный и загружен на ~10% суть в том, что на шлюзе надо часть исходящего трафика по определенным портам отправить в этот канал.
pf.conf имеет следующий вид:

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

pass in quick reply-to ($ext_if_a $ext_gw_a) tagged EXT_IF_A keep state
pass in quick reply-to ($ext_if_b $ext_gw_b) tagged EXT_IF_B keep state

pass out route-to ( $ext_if_a $ext_gw_a ) inet from ($ext_if_a) keep state
pass out route-to ( $ext_if_b $ext_gw_b ) inet from ($ext_if_b) keep state

pass in all
pass out all
В общем этого должно быть достаточно. пробую

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

telnet -s 195.x.x.200  ya.ru 80
Смотрю через tcpdump, что исходящий трафик прет через основного провайдера. хотя должен через второго. Убил уже весь мозг, может кто-то чего-то подскажет?

Re: FreeBSD, pf

Добавлено: 2009-05-14 10:00:21
zingel
весь конфиг и меняйте ник

Re: FreeBSD, pf

Добавлено: 2009-05-14 10:13:47
Abigor
мля не обратил внимание что не зашел на форум :)

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

#--- /etc/pf.conf

ext_if_a        = "xl0"
ext_gw_a        = "195.46.x.193"

ext_if_b        = "msk1"
ext_gw_b        = "195.206.x.129"

int_if          = "msk0"

set skip on lo0
scrub in

pass in quick reply-to ($ext_if_a $ext_gw_a) tagged EXT_IF_A keep state
pass in quick reply-to ($ext_if_b $ext_gw_b) tagged EXT_IF_B keep state

pass out route-to ( $ext_if_a $ext_gw_a ) inet from ($ext_if_a) keep state
pass out route-to ( $ext_if_b $ext_gw_b ) inet from ($ext_if_b) keep state

pass in all
pass out all
Вот весь конфиг, на данный момент. Так сказать упрощенный шаблон на котором пробую.

Re: FreeBSD, pf

Добавлено: 2009-05-14 19:41:50
iZEN
Насчёт балансировки трафика между двумя каналами есть статья в журнале "Системный администратор" №2(51)'2007, но там в основном про IPFW. Однако автор всё же обмолвился и про PF.
Алгоритм балансировки трафика round-robin между двумя каналами на PF:

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

pass in on ed0 route-to { (rl0 10.0.1.1), (rl1 10.1.1.1) } round-robin from 192.168.0.0/24 to any keep state
здесь: ed0 — внутренний интерфейс, смотрящий на клиентов; rl0 и rl1 — внешние интерфейсы, смотрящие на провайдеров; 10.0.1.1 — адрес шлюза провайдера А; 10.1.1.1 — адрес шлюза провайдера Б; 192.168.0.0/24 — локальная сеть.
Этим правилом входящий трафик на внутреннем интерфейсе (т.е. исходящий для пользователей) будет распределяться между интерфейсами rl0 и rl1 с соответствующими шлюзами по алгоритму round-robin (то есть внешний интерфейс будет меняться циклически — первое соединение будет использовать rl0, второе — rl1, третье — снова rl0 и так далее). Опция keep state сохраняет состояние, благодаря чему все пакеты в рамках одного соединения будут использовать один и тот же шлюз. В итоге нагрузка будет распределяться между двумя каналами — нельзя сказать, что трафик поделится абсолютно поровну, но при рассмотрении за большой период времени можно считать, что балансировка будет приближаться к этому.
Для решения проблемы привязки соединений клиента к определённому IP-адресу, которое требуется для некоторых серверов (а в данном случае каждое новое соединение от одного и того же клиента к определённому серверу будет проходить с большой вероятностью через разные маршруты/интерфейсы), нужно использовать опцию sticky-address в правиле nat или route-to. Чтобы распределять трафик между интерфейсами в определённой пропорции в правиле PF нужно использовать опцию probability.

Re: FreeBSD, pf

Добавлено: 2009-05-15 0:23:25
iZEN
Попробуй:

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

#--- /etc/pf.conf

ext_if_a        = "xl0"
ext_gw_a        = "195.46.x.193"

ext_if_b        = "msk1"
ext_gw_b        = "195.206.x.129"

int_if          = "msk0"

set skip on lo0
scrub in all

block all
pass in on $int_if  route-to { ($ext_if_a $ext_gw_a), ($ext_if_b $ext_gw_b) } round-robin from $int_if:network to any keep state
pass out all

Re: FreeBSD, pf

Добавлено: 2009-05-15 7:12:16
Abigor
iZEN, спасибо, только это мне не поможет, так как балансировку мне делать как раз не надо, мне надо если удаленный порт скажем 80 то пустить его по резервному каналу. а весь остальной трафик пусть идет основного провайдера.

Re: FreeBSD, pf

Добавлено: 2009-05-15 10:22:02
Abigor
Блин, как не смешно, все разрешилось тем что был конфликт ip адресов, такой же ip использовался на втором шлюзе, соответственно провайдер это дело резал

Re: FreeBSD, pf

Добавлено: 2009-05-15 10:39:32
Dorlas

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

pass in quick on $if_lan route-to ($if_adsl $router_adsl) inet proto tcp from $if_lan/24 to !$if_lan/24 port 5190
Пример - вся работа ICQ идет через второй канал :)

Re: FreeBSD, pf

Добавлено: 2009-05-15 11:05:54
Abigor
угу, так и делал, только не работало. Выше отписал почему, сейчас уже все завилось