Маршрутизация в VPN сетях

Так как VPN может использоваться для объединения не только компьютер клиент + компьютер сервер, а для объединения сетей необходимо обеспечить автоматическую настройку маршрутизации. В прошлой заметке у меня это делается вручную после подключения, а это совсем не удобно при автоматическом подключении, поэтому пришлось разбираться как работает эта система

Итак для создания специфических маршрутов при подключение к VPN серверу необходимо создать файл /etc/ppp/ip-up.d/pptp_vpn со следующим текстом (ниже описано как правильно называть файл с маршрутами)

cat /etc/ppp/ip-up.d/pptp_vpn 
#!/bin/sh
# мой маршрут пересылающий пакеты из локальной сети в сеть 192.168.80.0/24
route add -net 192.168.80.0/24 gw 192.168.100.2

Это файл должен быть исполняемым, для удаления маршрута необходимо использовать файл: /etc/ppp/ip-down.d/pptp_vpn со следующими командами ( и pptpd - для VPN сервера)

cat /etc/ppp/ip-down.d/pptp_vpn 
#!/bin/sh
route del -net 192.168.80.0/24 gw 192.168.100.2

Тут видно, что мои скрипты настройки маршрутизации чрезвычайно примитивны и не учитывают множество ситуаций, но меня они устраивают. Но если потребуется большее, например на сервере необходимо выдавать маршруты в зависимости от имени подключаемого пользователи или имени интерфейса или добавлять правила фаервола, то придётся применять условия и обрабатывать переменные окружения которые формирует pptpd.

Чтобы узнать какие формируются переменные при создании нового соединения нужно добавить в созданные файлы вот такую команду:

env > /tmp/env.vpn

На моём VPN сервере я получаю вот такие переменные

cat /tmp/env.vpn 
PPP_TTY=/dev/pts/0
IFNAME=ppp1
PPPLOGNAME=root
IPLOCAL=192.168.100.1
PPP_REMOTE=192.168.100.2 # IP на другом конце тонеля
PPP_IFACE=ppp1 # название интерфейса
PPP_TTYNAME=0
ORIG_UID=0
SPEED=115200 # индикатор скорости подключения, можно игнорировать
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
IPREMOTE=192.168.100.2
PPP_LOCAL=192.168.100.1
PPP_IPPARAM=92.255.239.93 # IP хоста откуда произошло подключение
PPPD_PID=331 # PID текущего процесса
PWD=/
PPP_SPEED=115200
PEERNAME=mywork # имя под которым подключился клиент
DEVICE=/dev/pts/0

Думаю этих переменных достаточно чтобы организовать довольно сложные конфигурации

Следует обратить внимание на то как называть файлы скриптов дополнительных маршрутов.

При создании или удалении ppp, pptp интерфейсов запускаются файлы: /etc/ppp/ip-up  /etc/ppp/ip-down соответственно. Эти файлы являются скриптами которые определяют дальнейшее поведение соединения. Например, если создать файл /var/log/ppp-ipupdown.log то в нём будет отображаться некоторые переменные поясняющие дальнейшее действие скрипт, затем эти переменные используются для вызова утилиты run-parts. Вот пример поясняющий работу этой утилиты

ffsdmad@ffsdmad-home:~$ run-parts --list --regex 'vpn' /etc/ppp/ip-up.d
/etc/ppp/ip-up.d/99_pptpd_vpn
ffsdmad@ffsdmad-home:~$ run-parts --list --regex '[0-9]+vpn' /etc/ppp/ip-up.d
ffsdmad@ffsdmad-home:~$

Тоесть эта утилита запускает скрипты соответствующие регулярному выражени из указанной директории

В моём случае , да вообще по умолчанию, запускаются все скрипты из директории ip-up.d и ip-down.d, так как не задано регулярное выражение для отбора нужного скрипта:

run-parts /etc/ppp/ip-up.d --arg=ppp1 --arg= --arg=38400 --arg=192.168.100.2 --arg=192.168.100.1 --arg=vpn

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

похожие страницы

  1. Объединение DNS зон в VPN сетях
  2. Как качать с torrents.ru без учёта рейтинга
  3. Объединение двух сетей через VPN

#1:

а где ты вычитал про наименования в /etc/ppp/ip-down.d/ ?
у меня скрипт носит имя 99route и отрабатывает на все соединения pptp ...

ответить  2010-02-02 15:39:56 

#2:  Басманов:

re: а где ты вычитал
http://pptpclient.sourceforge.net/routing.phtml#lan-to-lan

честно говоря пока тоже не понял по какому принципу pptp выбирает, что ему запускать

ответить  2010-02-03 07:54:56 

#3:

вот здесь можно посмотреть как pptp выбирает нужный в данный момент интерфейс: http://pptpclient.sourceforge.net/routing.phtml#all-to-tunnel

ответить  2010-02-04 10:28:43 

#4:  Басманов:

re: вот здесь можно посмотреть
ничего там путного по выбору файла маршрутизации нет
пришлось разобраться со стеком утилит настройки соединения, за то сейчас вроде всё прояснилось

ответить  2010-02-04 11:43:13 

#5:

аналогично настраиваится и сервер
/etc/ppp/pptpd-options:
ipparam pptp_vpn

/etc/ppp/ip-up.d/pptp_vpn:
if [[ $6 == pptp_vpn ]]; then
route add -net 192.168.0.0/24 gw 192.168.100.1
fi

извини, комментарий за 20:13:22 случайно отправил

ответить  2010-02-04 20:27:48 

#6:  Басманов:

у меня в /etc/ppp/peers/vpn (клиент)
ipparam vpn

а на сервере
name PPTPD

ответить  2010-02-07 04:39:57 

#7:

Посыпаю голову пеплом.
Настройка сервера, указанная двумя комментариями выше, не будет работать, т.к. в параметр $6 записывается ip-адрес клиента.

ответить  2010-02-08 11:55:25 

#8:  Басманов:

rE: Посыпаю голову пеплом.
а какой смысл посыпать, если эти параметры всё равно не обрабатываются и равнозначны, что $1 что $6

ответить  2010-02-08 11:58:33 

#9:

решил провести эксперимент, настроил сервер pptpd, и вот что получилось:

набор переменных окружения вот такой
LOCALNAME=pptpd (задается с помощью name в файле /etc/ppp/options.pptpd)
PPPD_PID=13529
PPPLOGNAME=мегаюзер
PEERNAME=клиент
SPEED=115200
IPREMOTE=Ip клиента, выданный сервером
IFNAME=ppp1
PWD=/etc/ppp/ip-up.d
SHLVL=1
DEVICE=/dev/pts/5
ORIG_UID=0
IPLOCAL=Ip сервера

$6 == IP клиента(с которого производилось подключение), а $1 == $IFNAME.
Хотя для настройки сервера это не так важно. Тут лучше всего использовать параметр $4($IPLOCAL) или $LOCALNAME.

ответить  2010-02-09 00:08:10 

#10:

route add -del 192.168.80.0/24 gw 192.168.100.2

надо исправить на

route del -net 192.168.80.0/24 gw 192.168.100.2

ответить  2010-02-16 13:39:03 

#11:  Басманов:

спасибо

ответить  2010-02-16 13:41:17 

#12:

ребят, то что осталось от мозга за последние 2е суток после прочтения закипело, пожалуйста кто-нибудь напишите в каком файле на сервере и что надо написать, я запутался совсем.
я уже неделю бьюсь с настройкой впн сервера, запостил кучу форумов (ниодного вразумительного ответа не получил), на этот блог вылез обсалютно случайно и вижу что проблема с маршрутизацией решена, только я уже ничего не понимаю ((
мои клиенты при подключении не видят сеть т.к. маска сети, выдаваемой им сервером 255.255.255.255, но стоет мне вырубить фаэрвол как все всех видят.
за-то обнаружил интересный прикол когда фаэрвол погас сразу создались 3 интерфейса ( для 3х соединенных пользователей) тут я оканчательно встал в ступор, как и почему фаэрвол мешал созданию сетевых интерфейсов для пользователей ??!

ответить  2010-11-03 21:31:42 

#13:  Басманов:

#12: ребят, то что осталось от мозга за последние 2е суток после прочтения закипело

ложись спать -- утро вечера мудренее, а завтра я смогу тебе помочь

ответить  2010-11-03 21:37:11