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

FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-08 16:48:47
Jeque
Схема такая:

Изображение

Шлюз, раздающий интернет для локальной сети через двух провайдеров. Всё настроено на базе FreeBSD+pf.
Теперь понадобилось сделать VPN-шлюз, для доступа в локальную сеть извне. VPN-шлюз решено было расположить на отдельной машине в DMZ. На VPN-шлюзе настроен mpd5 (pptp).
Проблема в следующем. VPN доступ работает только через первого (основного) провайдера. Путём анализа сетевого трафика выяснилось, что протокол gre маршрутизируется назад к vpn-клиенту только через основной шлюз. Направить его на второго провайдера что-то не получается.
Вот часть pf.conf:

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

...
rdr on $ext_if_1 proto tcp from any to $ext_if_1 port pptp tag EXT_PPTP_1 -> $vpnsrv port pptp
rdr on $ext_if_2 proto tcp from any to $ext_if_2 port pptp tag EXT_PPTP_2 -> $vpnsrv port pptp
rdr on $ext_if_1 proto gre from any to $ext_if_1 tag EXT_GRE_1 -> $vpnsrv
rdr on $ext_if_2 proto gre from any to $ext_if_2 tag EXT_GRE_2 -> $vpnsrv
...
pass in quick from ($ext_if_1:network) tagged EXT_PPTP_1 keep state
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_PPTP_1 keep state
pass in quick from ($ext_if_1:network) tagged EXT_GRE_1 keep state
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_GRE_1 keep state

pass in quick from ($ext_if_2:network) tagged EXT_PPTP_2 keep state
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_PPTP_2 keep state
pass in quick from ($ext_if_2:network) tagged EXT_GRE_2 keep state
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_GRE_2 keep state
...
pass on $dmz_if proto gre from any to any
gre-трафик приходит на vpn-шлюз через второго провайдера, а возвращается в интернет через первого. Если подключаться через первого провайдера, то всё работает.
Подскажите, в чём ошибка.

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 13:08:27
Jeque
Поэксперементировал с правилами.

Вот такая конструкция с SSH прекрасно работает:

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

rdr on $ext_if_1 inet proto tcp to ($ext_if_1) port 22222 tag EXT_IF_1 -> $vpnsrv port ssh
rdr on $ext_if_2 inet proto tcp to ($ext_if_2) port 22222 tag EXT_IF_2 -> $vpnsrv port ssh

pass in quick from ($ext_if_1:network) tagged EXT_IF_1
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_IF_1
pass in quick from ($ext_if_2:network) tagged EXT_IF_2
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_IF_2
А вот это с pptp никак:

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

rdr on $ext_if_1 inet proto tcp to ($ext_if_1) port pptp tag EXT_PPTP_1 -> $vpnsrv port pptp
rdr on $ext_if_2 inet proto tcp to ($ext_if_2) port pptp tag EXT_PPTP_2 -> $vpnsrv port pptp

rdr on $ext_if_1 inet proto gre to ($ext_if_1) tag EXT_GRE_1 -> $vpnsrv
rdr on $ext_if_2 inet proto gre to ($ext_if_2) tag EXT_GRE_2 -> $vpnsrv

pass in quick from ($ext_if_1:network) tagged EXT_PPTP_1
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_PPTP_1
pass in quick from ($ext_if_2:network) tagged EXT_PPTP_2
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_PPTP_2

pass in quick from ($ext_if_1:network) tagged EXT_GRE_1
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_GRE_1
pass in quick from ($ext_if_2:network) tagged EXT_GRE_2
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_GRE_2
Сам pptp без проблем роутится и на первого и на второго провайдера, а вот gre упорно возвращается маршрутом по умолчанию (т.е. через 1-го провайдера).
Причём, если посмотреть на то, что показывает pftop, то видно, что правило "pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_GRE_2" вроде как отрабатывает:

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

pfTop: Up Rule 1-37/126, View: rules, Cache: 10000                                                                                  14:04:22

RULE  ACTION   DIR LOG Q IF     PR        K     PKTS    BYTES   STATES   MAX INFO
   0  Pass     In      Q                  K        0        0        0       from (ext0) to any  flags S/SA tagged EXT_PPTP_1
   1  Pass     In      Q                  K        0        0        0       reply-to ... inet all  flags S/SA tagged EXT_PPTP_1
   2  Pass     In      Q                  K        0        0        0       from (ext1) to any  flags S/SA tagged EXT_PPTP_2
   3  Pass     In      Q                  K      120    10320        5       reply-to ... inet all  flags S/SA tagged EXT_PPTP_2
   4  Pass     In      Q                  K        0        0        0       from (ext0) to any  flags S/SA tagged EXT_GRE_1
   5  Pass     In      Q                  K        0        0        0       reply-to ... inet all  flags S/SA tagged EXT_GRE_1
   6  Pass     In      Q                  K        0        0        0       from (ext1) to any  flags S/SA tagged EXT_GRE_2
   7  Pass     In      Q                  K       30     1710        2       reply-to ... inet all  flags S/SA tagged EXT_GRE_2
В чём у меня ошибка? Или, может быть, gre вообще так роутить не получится, и я зря мучаюсь?

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 20:57:53
Jeque
Похоже, что проблема нерешаема. Вот цитата из мана:

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

reply-to
           The reply-to option is similar to route-to, but routes packets that
           pass in the opposite direction (replies) to the specified inter-
           face.  Opposite direction is only defined in the context of a state
           entry, and reply-to is useful only in rules that create state.  It
           can be used on systems with multiple external connections to route
           all outgoing packets of a connection through the interface the
           incoming connection arrived through (symmetric routing enforce-
           ment).
Насколько я понимаю, из этого текста следует, что reply-to работает только с пакетами, на которые выставлены стейты, а стейты работают только с протоколами tcp, udp и icmp. Для gre - облом.

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 22:23:36
mak_v_
gre работает поверх tcp-ip
quick приберите в нужных местах, потому как не будут проверяться "ниже"

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 22:43:06
Jeque
Где у меня лишний quick? По выводу pftop видно, что правило pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_GRE_2 срабатывает, но в нём не работает именно reply-to, т.к. gre-пакеты уходят на шлюз по умолчанию.

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 22:50:12
mak_v_
где именно у Вас - не иею ни малейшего желания разобраться. Где-то на старой работе было подобное. Ишите в правилах фаервола

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 23:48:48
Jeque
Тогда почему правила с теми же самыми "квиками" прекрасно работают для SSH?
Но вы лучше скажите, вы уверены, что reply-to должно работать для протокола GRE или это только ваше предположение?

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-09 23:52:49
mak_v_
читайте мои ответы внимательно. На старой работе был впн-сервер в дмз. Но точно не помню по поводу reply-to\route-to

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-10 14:08:51
Jeque
mak_v_ писал(а):читайте мои ответы внимательно. На старой работе был впн-сервер в дмз.
Вы, видимо, тоже невнимательно читаете. VPN-сервер в DMZ у меня прекрасно работает, но только через основного провайдера.

Re: FreeBSD + pf + два провайдера + VPN pptp в DMZ

Добавлено: 2013-03-10 23:39:05
mak_v_
С таким тоном я пасс..