Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 109, ЯНВАРЬ 2008 г.

Свет в конце криптотуннеля

Ульяна Смелая

Хакер, номер #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-сервера с использованием 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, сразу идем на перезагрузку

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.

Содержание
ttfb: 6.8900585174561 ms