Поднимаем PPTP-сервер на базе FreeBSD/mpd и OpenBSD/poptop
Ульяна Смелая
В настоящее время технологии виртуальных частных сетей переживают настоящий бум – стандарты вытесняют друг друга, компании, выпускающие устройства сетевой безопасности (Cisco, Dlink, Trendnet, etc), не щадя живота и денег продвигают в массы различные VPN-концентраторы, а печатные издания и онлайновые ресурсы наперебой рассказывают о преимуществах использования VPN. Мы, в свою очередь, никак не можем остаться в стороне от этой, без сомнения, позитивной тенденции, поэтому предлагаем твоему вниманию пошаговое руководство по настройке PPTP-сервера на базе FreeBSD/mpd и OpenBSD/poptop.
Содержание:
- Точка, точка, запятая
- Установка сервера MPD в FreeBSD
- Настройка PPTP-сервера с использованием Poptop
- Заключение
Туннельный протокол типа точка-точка (PPTP, The Point to Point Tunneling Protocol), разработанный в недрах Microsoft, позволяет компьютеру устанавливать защищенное соединение с сервером за счет создания специального туннеля в общедоступной сети. PPTP не только предоставляет удаленным пользователям безопасный доступ к корпоративной сети при наличии выхода в Интернет, но и обеспечивает широкие возможности разделения доступа и защиты информации внутри локальной сети.
Функционирование РРТР заключается в инкапсулировании пакетов виртуальной сети в пакеты РРР, которые, как по цепочке, упаковываются в пакеты GRE (Generic Routing Incapsulation), передаваемые по IP от клиента к РРР-серверу и обратно. Совместно с каналом инкапсулированных данных, существует управляющий сеанс на базе протокола TCP. Пакеты управляющего сеанса позволяют запросить статус и сопровождать сигнальную информацию между клиентом и сервером. РРТР не оговаривает конкретных алгоритмов аутентификации и протоколов, вместо этого он обеспечивает основу для их обсуждения.
Для выполнения процедуры проверки подлинности удаленных рабочих станций применяется протокол MS-CHAP (Microsoft Challenge Handshake Authentication Protocol), за шифрование данных отвечает протокол MPPE (Microsoft Point-to-Point Encryption). Кстати, последний не сжимает данные, для этих целей обычно используется MPPC (Microsoft Point-to-Point Compression).
Ни для кого не секрет, протокол PPTP далек от совершенства, его спецификация не была ратифицирована IETF, и он менее безопасен чем другие VPN-протоколы, например, IPSec. Несмотря на это, данная реализация VPN получила наибольшее распространение. Во многом благодаря тому, что PPTP-клиент встроен во все Windows-системы, начиная с Win95 OSR2.
Подняв PPTP-сервер, системный администратор сможет разграничить доступ в Сеть, решить проблему подмены IP- и MAC-адресов и, не прилагая титанических усилий, организовать учет трафика штатными средствами. Стоит отметить, что именно PPTP использует большинство провайдеров так называемой «последней мили» для предоставления своим клиентам выхода в Интернет.
Предлагаю остальные материалы теоретического свойства оставить на откуп бородатым дядькам, проводящим курсы в учебных центрах, и перейти непосредственно к рассмотрению конкретных примеров построения VPN-серверов, совместимых с Windows-клиентами. А за основу для подобных конструкций мы возьмем самые популярные на сегодняшний день операционные системы из линейки xBSD – FreeBSD и OpenBSD.
Установка сервера MPD в FreeBSD
Сервер MPD (Multi-link PPP Daemon) работает только в FreeBSD. В августе 2007 года вышла новая версия сервера 4.3, которую и рекомендуют использовать разработчики (хотя уже доступна бета версия 5.0). Поддерживается PAP, CHAP, MS-CHAP и EAP аутентификация, сжатие и шифрование PPP-соединений, имеется поддержка L2TP, NetFlow и NAT, веб-интерфейс и еще много чего полезного. Установка из коллекции портов стандартна для FreeBSD:
# cd /usr/port/net/mpd # make install clean
Добавляем запуск MPD при загрузке системы:
# echo `mpd_enable="YES"' >> /etc/rc.conf
Работа MPD настраивается с помощью нескольких файлов. Переходим в каталог /usr/local/etc/mpd и убираем префикс sample.
# cd /usr/local/etc/mpd # mv mpd.conf.sample mpd.conf # mv mpd.links.sample mpd.links # mv mpd.secret.sample mpd.secret
Четвертый файл mpd.script предназначен для настройки модема, мы его трогать не будем. В mpd.conf задается одна или более конфигураций, каждая из которых представляет собой последовательность команд mpd. Все строки должны начинаться с начала строки или знака табуляции. Использование пробелов может привести к неправильному считыванию параметров. Открываем файл и приступаем к настройке:
# vi mpd.conf
default:
; Подключаем разделы файла; сколько туннелей, столько и разделов
load client0
load client1
client0:
; Создаем и настраиваем интерфейс
new -i ng0 client0 client0
; Первый адрес сервера, второй клиента
set ipcp ranges 192.168.2.1/32 10.0.0.0/24
set ipcp dns 192.168.2.3
set ipcp nbns 192.168.2.4 ; WINS
; Загружаем раздел client_standart
load client_standart
client1:
new -i ng01 client1 client1
set ipcp ranges 192.168.2.1/32 10.0.1.30/32
load client_standart
client_standard:
; Отключаем режим "по требованию"
set iface disable on-demand
set iface enable proxy-arp
; Устанавливаем тип pptp, описание смотри в mpd.links
set link type pptp
; Позаботимся об MTU
set link mtu 1420
set link mru 1420
set iface enable tcpmssfix
; Шифрование и сжатие
set bundle enable compression
set bundle enable crypt-reqd
set bundle disable multilink
set ccp yes mppc
; set ccp yes mpp-e40
set ccp yes mpp-e128
set ccp yes mpp-stateless
set ccp yes mppe-policy
; Контроль протокола и адреса
set link yes acfcomp protocomp
; Аутентификация
set link no pap chap
; CHAP является синонимом md5-chap ms-chapv1 ms-chapv2, протокол можно указать
; в явном виде
set link enable chap
set link keep-alive 10 60
; Включение Van Jacobson TCP-компрессии
set ipcp yes vjcomp
; Отключаем windowing
set pptp disable windowing
В файл mpd.links заносим:
# vi mpd.links
client0:
set link type pptp
client1:
set link type pptp
pptp:
set link type pptp
; IP-адрес сервера, на котором должен работать FreeBSD
set pptp self 11.22.33.44
; Разрешаем входящие, отключаем исходящие соединения по PPTP
set pptp enable incoming
set pptp disable originate
В файл mpd.secret заносится пара логин/пароль, дополнительным аргументом может быть IP-адрес, с которого зайдет клиент с таким именем:
# vi mpd.secret sergej "password" fedja "foobar" 192.168.1.1 vasja "p@sSw0rd" 192.168.1.0/24
Альтернативным вариантом является использование в нужном разделе файла mpd.conf параметров:
set auth authname "VpnLogin" set auth password "VpnPassword"
Если планируется использовать системную базу пользователей, то в файле mpd.conf можно указать параметр «set auth enable system», а в /etc/login.conf прописать строку «:passwd_format=nth:». Для отслеживания работы MPD с помощью syslog, занесем в файл /etc/syslog.conf следующие строки (не забывая его затем перезапустить):
# vi /etc/syslog.conf !mpd *.* /var/log/mpd.log
Чтобы обратные пакеты доходили до сети VPN, необходимо указать маршрут:
# route add 192.168.2.1/32 10.0.1.30/32 # route add 192.168.2.1/32 10.0.0.0/24
И теперь стартуем MPD:
# mpd -b
Такой командой будут запущены все туннели, указанные в секции default. Если нужно запустить конкретный туннель, указываем его последним параметром:
# mpd –b client0
Если подключение прошло без проблем, можно добавить FreeRADIUS, настройки которого аналогичны описанным в статье «Виртуальная сеть для Windows клиента» из X_07_2007. А чтобы MPD узнал о его использовании, в файл mpd.conf заносим следующие строки:
# vi mpd.conf set auth enable radius-auth set auth enable radius-acct set radius enable message-authentic set radius config /etc/local/etc/mpd4/radius.conf set radius retries 3 set radius timeout 3 set radius server localhost password123 1812 1813
И в файл radius.conf прописываем:
# vi radius.conf acct 127.0.0.1 password123 auth 127.0.0.1 password123
Настройка PPTP-сервера с использованием Poptop
Poptop является наиболее удачным, простым и быстрым решением для организации VPN-сервера на базе Linux/xBSD. К возможностям Poptop стоит отнести: Microsoft-совместимая аутентификация и шифрование (MS-CHAPv2, MPPE 40-128 bit RC4), поддержка нескольких клиентских соединений, прозрачная интеграция в сетевое пространство Microsoft (LDAP, Samba) с использованием плагина RADIUS, поддержка популярных PPTP-клиентов. В плане производительности, по сравнению с MPD, Poptop имеет один серьезный недостаток: он работает в пространстве пользователя, в то время как MPD трудится через модуль ядра NetGraph.
Предположим, у нас есть сервер под управлением OpenBSD 4.2 с внутренним IP-адресом 192.168.2.1, аутентифицированным клиентам необходимо выдавать IP-адреса из диапазона 192.168.2.32/27 (192.168.2.32-192.168.2.63, маска подсети 255.255.255.224, 30 доступных адресов).
Для функционирования системы в качестве шлюза, позволяющего клиентам локальной сети обращаться к внешнему миру, первым делом необходимо включить перенаправление IPv4-пакетов с одного сетевого интерфейса на другой:
# sysctl -w net.inet.ip.forwarding=1
Штатное ядро OpenBSD поддерживает протокол GRE, наша задача – разрешить его использование:
# sysctl -w net.inet.gre.allow=1
Чтобы изменения вступали в силу после перезагрузки, добавляем соответствующие записи в /etc/sysctl.conf:
# vi /etc/sysctl.conf net.inet.ip.forwarding=1 net.inet.gre.allow=1 ; Еще один полезный параметр для шлюза: при панике ядра не сваливаемся в отладчик DDB, ; сразу идем на перезагрузку ddb.panic=0
Устанавливаем poptop из портов:
# cd /usr/ports/net/poptop # make install clean
Или с помощью прекомпилированного пакета:
# pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/poptop-1.1.4.b4p1.tgz
При компиляции из исходных текстов конфигурационному скрипту configure следует передать 2 параметра: ′--with-bsdppp′ и ′--with-pppd-ip-alloc′. Назначение первой опции очевидно из названия, вторая позволяет снять ограничения на количество одновременных сессий и добавляет поддержку механизма распределения IP-адресов.
Все, инсталляция произведена, переходим к настройке.
# vi /etc/ppp/ppp.conf ; Умолчальные установки default: set log Phase Chat LCP IPCP CCP tun command ; Отключаем использование протокола IPv6 disable ipv6cp ; Ключевая секция pptp: ; Используем MS-CHAP v2 enable MSChapV2 ; Используем алгоритм шифрования данных MPPE set mppe 128 stateless ; Стандартные методы компрессии не работают с MPPE, отключаем их disable deflate pred1 deny deflate pred1 ; Отключаем таймер ожидания set timeout 0 ; Задаем адрес VPN шлюза, диапазон клиентских адресов и широковещательный адрес set ifaddr 192.168.2.1 192.168.2.32-192.168.2.63 255.255.255.255 ; Разрешаем получение адреса DNS сервера и передаем его клиенту accept dns set dns 192.168.1.1 ; При необходимости включаем ARP proxy enable proxy
Создание или изменение учетных записей пользователей производится за счет редактирования файла /etc/ppp/ppp.secret. В поле Hostname вместо имени хоста или IP-адреса можно указать знак звездочки ‘*’, что означает возможность установить соединение с любого компьютера. Последние два поля (Метка и Обратный вызов) являются необязательными.
# vi /etc/ppp/ppp.secret #Authname Authkey Hostname Label Callback user1 X4dWg9327 192.168.2.50 pupkin user2 123qWe456 *
Обрати внимание, вся информация хранится в открытом виде. Если не ограничить права доступа к этому файлу, паролями для доступа в Интернет сможет воспользоваться любой зарегистрированный в системе пользователь:
# chown root:wheel /etc/ppp/ppp.{conf,secret}
# chmod 600 /etc/ppp/ppp.{conf,secret}
Когда сделаны все вышеописанные настройки, poptop можно считать готовым к работе. Для запуска pptpd достаточно ввести в командной строке:
# /usr/local/sbin/pptpd
В /etc/rc.local добавляем автозапуск демона:
# vi /etc/rc.local if [ -x /usr/local/sbin/pptpd ]; then echo -n 'pptpd'; /usr/local/sbin/pptpd fi
Настройка фильтра пакетов pf(4) на корректную работу с PPTP не тривиальна и заключается в разрешении входящих соединений по 1723/tcp и прохождения GRE трафика:
# vi /etc/pf.conf
; Задаем используемые сетевые интерфейсы
ext_if = "fxp0"
int_if = "fxp1"
pptp_if = "tun"
; Определяем список, в который занесены IP-адреса подключающихся клиентов
table <pptp_users> { 192.168.2.32/27 }
; Не фильтруем пакеты на интерфейсах обратной петли
set skip on lo
; Выполняем трансляцию сетевых адресов только для пользователей, использующих PPTP
nat on $ext_if inet from <pptp_users> -> ($ext_if:0)
; Запрещаем все входящие соединения
block quick inet6 all
block in
block return-rst in proto tcp
; Разрешаем исходящие соединения
pass out keep state
; Разрешаем управляющее соединение
pass in on $int_if inet proto tcp from ($int_if:network)
to ($int_if) port pptp keep state
; Разрешаем использование трафика, инкапсулированного в GRE
pass in on $int_if inet proto gre from ($int_if:network)
to ($int_if) keep state
; Разрешаем трафик на туннельном интерфейсе
pass in on $pptp_if inet from <pptp_users> to ! (self)
keep state
Проверяем конфиг на наличие ошибок:
# pfctl -n -f /etc/pf.conf
И перезагружаем набор рулесетов файервола:
# pfctl -f /etc/pf.conf
Все настройки произведены, сервер поднят и караулит подключения клиентов. Если все сделано правильно, то они не заставят себя долго ждать ;-). Причины неудачи смотри, как всегда, в логах. Удачи.
Статья опубликована в январском номере журнала «Xakep» за 2008 год.





