В настоящее время технологии виртуальных частных сетей переживают настоящий бум - стандарты вытесняют друг друга, компании, выпускающие устройства сетевой безопасности (Cisco, Dlink, Trendnet, etc), не щадя живота и денег, продвигают в массы различные VPN-концентраторы, а печатные издания и онлайновые ресурсы наперебой рассказывают о преимуществах использования VPN. Мы, в свою очередь, никак не можем остаться в стороне от этой, без сомнения, позитивной тенденции, поэтому предлагаем твоему вниманию пошаговое руководство по настройке PPTP-сервера на базе FreeBSD/mpd и OpenBSD/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, sf.net/projects/mpd) работает только в 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-клиента» из июльского номера ][ за 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 (www.poptop.org) является наиболее удачным, простым и быстрым решением для организации 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, сразу идем на перезагрузку
При компиляции из исходных текстов конфигурационному скрипту configure следует передать два параметра: '--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
Заключение
Все настройки произведены, сервер поднят и караулит подключения клиентов. Если все сделано правильно, то они не заставят себя долго ждать :). Причины облома смотри, как всегда, в логах. Удачи.
INFO
В статье «Виртуальная сеть для Windows-клиента» из июльского номера ][ за 2007 год Сергей Яремчук подробно рассказал, как настроить PPTP-сервер на базе Linux. Казалось бы, тема раскрыта полностью и к ней можно больше не возвращаться, однако поднятие подобного сервера в Free/Net/OpenBSD существенно отличается, именно поэтому и была написана эта статья.
PPTP - это одно из немногих многопротокольных решений - туннели можно создавать по протоколам IP, IPX и NetBEUI.