pf & 2 external gw - в очередной раз

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)

Всё работало, можно было зайти на любой ext_if, работали пробросы rdr-to внутрь локалки, не было проблем. Накручивал скрипты переключения каналов (заменой в последней строчке 1 на 2), всё было айс. Пока не перешли на очередное ядро и очередной синтаксис pf

Что сейчас - с этими конфигами пингуем 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)

и.. да, выход наружу идёт то по одному каналу, то по второму согласно round-robin, но.... пытаемся снаружи зайти на ext_gw2 и... всё то же самое

Аватар пользователя solus

Может быть пакеты падают на

Может быть пакеты падают на default gw ?
netstat -rn

Аватар пользователя hostage

именно, падают на default gw,

именно, падают на default gw, хотя должны перехватываться pf - policy based routing или как там оно называется?

stainless steel mice

Аватар пользователя BABUT

несколько лет назад

несколько лет назад разруливал два интерфейса тэгами. т.е. приходит на один фейс- назначается тэг один, а если приходит на другой- назначается другой тэг. а когда уходит, то на основе этих тэгов пихается в соответствующий фейс. с тэгами удобно, поскольку появляется универсальный способ что-то засунуть в нужный фейс, например пакеты в локаль провайдера пихать не через дефолтный гейт, а всегда через нужный фейс, просто перед этим их соответствующе пометив

Аватар пользователя Mitsik

reply-to

может быть вот так будет работать

pass in on $ext_if1 reply-to ($ext_if1 $ext_gw1)
pass in on $ext_if2 reply-to ($ext_if2 $ext_gw2)

Аватар пользователя CiWo

ошибка в настройках

1) не правильно настроены маршруты
2) разрешающих правил для подключения на нужный интерфейс в pf.conf нет