pf + 2 инета + один нинет пропал и звиздец

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение suspender » 2011-04-04 15:41:03

В связи с появлением второго инета перелез с ipfw на pf
Есть примерно такой pf.conf

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

ifSp1="ae0"
gwSp1="..."

ifSp2="re0"
gwSp2="..."

ifLan="em0"
ifVpn="tun0"

netLan="10.0.1.0/24"
netVpn="10.0.7.0/24"

table <nat_1> {...}
table <nat_2> {...}


set block-policy drop
set skip on lo0
set skip on $ifVpn

nat on $ifSp1 from <nat_1> to any -> ($ifSp1)
nat on $ifSp2 from <nat_2> to any -> ($ifSp2)

block all

#services

#icmp
pass in on $ifSp2 reply-to ($ifSp2 $gwSp2) inet proto icmp from any to $ifSp2 keep state
pass in on $ifSp1 reply-to ($ifSp1 $gwSp1) inet proto icmp from any to $ifSp1 keep state

#sshd
pass in quick on $ifSp2 reply-to ($ifSp2 $gwSp2) inet proto tcp from any to $ifSp2 port 16122 keep state
pass in quick on $ifSp1 reply-to ($ifSp1 $gwSp1) inet proto tcp from any to $ifSp1 port 16122 keep state

#openvpn
pass in quick on $ifSp2 reply-to ($ifSp2 $gwSp2) inet proto {tcp,udp} from any to $ifSp2 port 1194 keep state
pass in quick on $ifSp1 reply-to ($ifSp1 $gwSp1) inet proto {tcp,udp} from any to $ifSp1 port 1194 keep state

#nginx
pass in quick on $ifSp2 reply-to ($ifSp2 $gwSp2) inet proto tcp from any to $ifSp2 port {80,8081,8011,443} keep state
pass in quick on $ifSp1 reply-to ($ifSp1 $gwSp1) inet proto tcp from any to $ifSp1 port {80,8081,8011,443} keep state

#dns
pass out quick on $ifSp2 from ($ifSp2) to 8.8.8.8 keep state
pass out quick on $ifSp1 from ($ifSp1) to 8.8.8.8 keep state


#vpn <-> lan
pass out quick on $ifLan from $netVpn to $netLan keep state
pass in quick on $ifLan from $netLan to $netVpn keep state

# ssh and nginx from lan
pass in quick on $ifLan inet proto tcp from $netLan to ($ifLan) port {80,8011,8081,443} keep state
pass in quick on $ifLan inet proto tcp from any to ($ifLan) port 16122 keep state 

pass out quick on $ifLan from ($ifLan) to $netLan keep state

# redirecting LAN clients to different route tables
pass in on $ifLan route-to ($ifSp1 $gwSp1) inet from <nat_1> to any keep state
pass in on $ifLan route-to ($ifSp2 $gwSp2) inet from <nat_2> to any keep state

pass out on $ifSp1 from $ifSp1 to any keep state
pass out on $ifSp2 from $ifSp2 to any keep state

#local guys
pass in quick on $ifLan from $netLan to ($ifLan)
Всё вроде бы хорошо. разные клиенты тусуются в разные наты. Извне доступны сервисы типа nginx, openvpn, sshd по обоим внешним ip. На пинги отвечает тоже по обоим внешним ip.
НО :
пропал инет от того прова, который defaultrouter (ну тупо электричество с другой стороны упало, и статус у сетевухи стал no-carrier) - сразу отваливаются оба(!) инета. Если выдернуть другой кабель (тот который fib 1) - то первый инет продолжает работать.

Знающие люди, объясните плз почему так происходит и как с этим бороцца ?
(Пока что, кроме как мониторинга доступности дефолтного канала каким нить скриптом, и при падении менять дефолтроут и таблицу правил - ничего в голову не приходит. Но это прямо какие то костыли велосипедные.)

ps. Мне тут уже предлагали смотреть в сторону лялиха и iproute2 ... но пока не хочется так кардинально поступать. В своё время от этого (лялиха) как раз и ушел.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Гость
проходил мимо

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение Гость » 2011-04-04 16:06:14

а что если ко всем констуркциям применить правило () ?
что бы не по именам интерфейсов работал pf, а по айпишникам
и в констуркциях on тоже

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение suspender » 2011-04-04 16:16:32

То есть тупо все $ifXYZ обернуть в скобки ? Ну я попробую конечно переделать и смоделировать ситуацию после рабочего дня ... А как нибудь теоретически это может быть обоснованно ?

Гость
проходил мимо

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение Гость » 2011-04-04 16:21:18

теортетически это скорее всего баги PF
практически это нужно тестировать или пересматривать код PF
смотреть какие то дебаги по pflog, анализировать что там происходит итд

в теории если вместо интерфейсов везде будут айпи, тоесть использовать ()
то должно сработать
потому что в вашем случае возмодно проверка айпи из интерфеса может происходить только когда он UP,
а у вас они как раз уходят в статус DOWN

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение suspender » 2011-04-04 19:03:57

Мб, но если убивать не default-router инет - то другой инет нормально работает.

Гость
проходил мимо

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение Гость » 2011-04-04 20:13:01

а если забилдить ядро с несколькими таблицами маршрутизации?
и сделать два роутинга в дефаулте?

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: pf + 2 инета + один нинет пропал и звиздец

Непрочитанное сообщение suspender » 2011-04-05 9:55:09

Да оно и так с

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

options         ROUTETABLES=2
и для setfib 1 прописан дефолт роутинг тоже.

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

setfib1_enable="YES"
setfib1_defaultroute="z.x.c.v"
Я же сначала на ipfw + kernel nat всё сделать пытался. Разбрасывать LAN клиентов по разным натам - получилось, а вот заставить отвечать на тех ифах, на которых извне пакет пришел - ни фига. (Заморачиваться с подниманием всех сервисов в двойном экземпляре, биндя каждый к разным ифам и разным fib - заломало, т.к. через rc.conf это имхо не решить.).

В общем буду пробовать пока что всё в скобки завернуть :)