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

Комментариев 0
Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут