28 окт. 2014 г.

Передача статических маршрутов в pptp-туннеле

Думал я, что сабж при использовании pptp vpn невозможен. Оказалось, ошибался. Да, сам ppp-протокол не умеет передавать при соединении маршруты. Однако, при установлении соединения клиентом в туннель посылаются запросы DHCPINFORM, с помощью которых ему можно вернуть практически любой dhcp-option, включая информацию о маршрутах!
Для этого, во-первых, нам потребуется dhcp-сервер. В моем случае имеется уже работающая инфраструктура доступа к ресурсам локальной сети через pptp, поэтому pptpd и dnsmasq уже подняты и выполняют свои функции. В конфигурационный файл dnsmasq.conf добавился следующий блок:
##pptp-vpn
listen-address=192.168.30.1
dhcp-range=pptp,192.168.30.100,192.168.30.120,255.255.255.0,1h
dhcp-option=tag:pptp,vendor:MSFT,2,1i
dhcp-option=tag:pptp,6,192.168.30.1
dhcp-option=tag:pptp,249,192.168.11.0/24,192.168.30.1,192.168.13.0/24,192.168.30.1
где:
listen-address - локальный адрес серверного конца vpn-туннеля (localip в /etc/pptpd.conf)
dhcp-range=pptp,... - объявление нового диапазона с отдельным тегом, дабы не затрагивать настройки других dhcp-зон.
dhcp-option=tag:pptp,vendor:MSFT,2,1i - спецопция для MS dhcp-клиента, говорящая ему делать dhcp-lease при выключении
dhcp-option=tag:pptp,6,192.168.30.1 - указание DNS-сервера
dhcp-option=tag:pptp,249,... - спецопция для MS dhcp-клиента, передающая статические маршруты (если среди клиентов есть Linux\MacOS, следует добавить dhcp-option=121 с аналогичным содержанием)
Далее проверяем корректность внесенных изменений с помощью dnsmasq --test и если все хорошо, перезапускаем демона для применения настроек. DHCP готов к работе.
Чтобы до него долетели DHCPINFORM пакеты от клиентов, в /etc/ppp/pptpd-options добавляется (или раскомментируется) опция proxyarp. Никаких дополнительных настроек не требуется. После перезапуска pptpd можно проверять работоспособность.
В результате при поднятии vpn-туннеля в таблице маршрутизации клиента должны появиться дополнительные маршруты, а ifconfig покажет для соответствующего интерфейса отдельный dns-сервер. Примерно так:
IPv4 таблица маршрута
=========================================================
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
   <.....skip......>
  192.168.30.0     255.255.255.0     192.168.30.1  192.168.30.111     21
  192.168.30.111 255.255.255.255  On-link           192.168.30.111    276
  192.168.11.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.11.255 255.255.255.255  On-link           192.168.30.111    276
  192.168.13.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.13.255 255.255.255.255  On-link           192.168.30.111    276
<.....skip......>
=========================================================
Постоянные маршруты:
  Отсутствует