Страница 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_
С таким тоном я пасс..