Маршрутизация в 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 


оставить комментарий