Свет в конце криптотуннеляУльяна Смелая Хакер, номер #109, стр. 160 Поднимаем PPTP-сервер на базе FreeBSD/mpd и OpenBSD/poptopВ настоящее время технологии виртуальных частных сетей переживают настоящий бум - стандарты вытесняют друг друга, компании, выпускающие устройства сетевой безопасности (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-сервера с использованием PoptopPoptop (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, сразу идем на перезагрузку 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 следует передать два параметра: '--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. |