OpenBSD 5.4, 2 extermal gw
round-robin не надо, надо основной канал 1, второй как резервный для захода извне (у первого и основного приватный ip). Работало. Раньше. Много лет. И на 4.9 с чуть другим синтаксисом (разобрался в конце концов). И на совсем старом pf работало, с тэгированием пакетов и ещё более древним синтаксисом. Сейчас ни в какую.
default gw - ИСП 1 (это важно для понимания). лишнее с листинга убрано, оставлена самая суть
Код: Выделить всё
# тут понятно - интерфейсы и адреса шлюзов (ip интерфесов 1.1.1.1 и 2.2.2.1)
lan_net = "192.168.10.0/24" # сетка локалки
int_if = "re0" # сетевуха внутрь
ext_if1 = "rl0" # сетевуха ИСП 1
ext_if2 = "rl1" # сетевуха ИСП 2
ext_gw1 = "1.1.1.2" # шлюз интерфейса к ИСП 1
ext_gw2 = "2.2.2.2" # шлюз интерфейса к ИСП 2
# нат с локалки на оба внешних
match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)
# внутренний - можно всё
pass out on $int_if to $lan_net
pass in quick on $int_if from $lan_net to $int_if
pass in quick on $int_if proto icmp
# разрешаем выход
pass out on $ext_if1
pass out on $ext_if2
# вот эти строки должны по идее класть в нужный внешний канал приходящее с любого внешнего канала
pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1)
# это фаерволом выбираем дефолт шлюз - ИСП 1, потом оно натится и всё сладко
pass in on $int_if proto tcp from $lan_net route-to ($ext_if1 $ext_gw1)
Что сейчас - с этими конфигами пингуем 2.2.2.1 и... правильно, пакеты приходят на ext_if2, а уходят с ext_if1. То есть нифига не пинугется.
# ext_if2, пингую адрес 2.2.2.1 с внешней машины, скажем, 5.5.5.5 - пакеты приходят... уходящих нет
tcpdump -i rl1 -n -l | grep 5.5.5.5
tcpdump: listening on rl1, link-type EN10MB
16:23:00.630616 5.5.5.5 > 2.2.2.1: icmp: echo request (DF) [tos 0x28]
# а потому что уходят с не того интерфейса, хотя адрес отправителя правильный (как такое может вообще быть?)
tcpdump -i rl0 -n -l | grep 5.5.5.5
tcpdump: listening on rl0, link-type EN10MB
16:23:18.633938 2.2.2.1 > 5.5.5.5: icmp: echo reply (DF) [tos 0x28]
читаем доки, по слухам они рулез. http://www.openbsd.org/faq/pf/ru/pools.html
ну посмотрим что там с раунд-робин
пишем:
Код: Выделить всё
lan_net = "192.168.10.0/24"
int_if = "re0"
ext_if1 = "rl0"
ext_if2 = "rl1"
ext_gw1 = "1.1.1.2"
ext_gw2 = "2.2.2.2"
# исходящие соединения nat на каждый сетевой интерфейс
match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)
# по умолчанию блокируем все
#block in
#block out
# разрешаем все исходящие пакеты на внутреннем интерфейсе
pass out on $int_if to $lan_net
# разрешаем все входящие пакеты предназначенные самому шлюзу
pass in quick on $int_if from $lan_net to $int_if
# балансируем исходящий трафик из внутренней сети.
pass in on $int_if from $lan_net route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin
# обычное правило "pass out" для внешних интерфейсов
pass out on $ext_if1
pass out on $ext_if2
# пропускаем пакеты с любых IP на $ext_if1 и $ext_gw1 и аналогично на $ext_if2 и $ext_gw2
pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1)
что делать??? возвращаться на 4.9 не предлагать ))