Сегодня перед системными администраторами все острее встает проблема обеспечения мобильных и удаленных пользователей полноценным и защищенным доступом к корпоративной сети. Благодаря встроенной поддержке в операционных системах Windows начиная с версии Windows 95 OSR2, одним из самых популярных решений является построение защищенных туннелей на основе протокола PPTP (Point-to-Point Tunneling Protocol — туннельный протокол «точка-точка»). Настройкой такого сервера сегодня и займемся.
Протокол PPTP (Point-to-Point Tunneling Protocol) разработан компанией Microsoft совместно с компаниями Ascend Communications, 3Com/Primary Access, ECI-Telematics и US Robotics. Проект был представлен в группу IETF (Internet Engineering Task Force), спецификация протокола была опубликована как «информационный» в июле 1999 года в RFC 2637 (http://www.ietf.org/rfc/rfc2637.txt). Хотя протокол и получил статус Интернет стандарта, но так и не был ратифицирован IETF. Протокол PPTP позволяет создавать защищенные каналы для обмена данными по различным сетевым протоколам — IP, IPX или NetBEUI. Данные этих протоколов инкапсулируются с помощью протокола PPTP в пакеты протокола IP, с помощью которого переносятся в зашифрованном виде через любую сеть TCP/IP. PPTP работает, устанавливая обычную PPP сессию с противоположной стороной с помощью протокола GRE (Generic Routing Encapsulation – общая инкапсуляция маршрутов) — протокол туннелирования сетевых пакетов разработанный фирмой CISCO, описанный в RFC 1701 (http://tools.ietf.org/html/rfc1701). Для шифрования трафика используется протокол для шифрования PPP пакетов MPPE (Microsoft Point-to-Point Encryption) использующий потоковый шифр RSA RC4 ключи, которого меняются в течение сессии. Первой реализовала PPTP в своих продуктах Cisco, которая и лицензировала эту технологию корпорации Microsoft. Но именно благодаря последней PPTP удалось добиться популярности. Из-за опасений по поводу патентных претензий протокола MPPE до недавнего времени в дистрибутивах Linux отсутствовала полноценная поддержка PPTP. Однако, начиная с версии 2.6.13, появилась полная поддержка PPTP.
Но не все так гладко. Не смотря на популярность, специалисты не очень любят PPTP. По причине слабых алгоритмов парольной аутентификации и получении сессионных ключей на основе пользовательского пароля. Об этом можно почитать на сайте Брюса Шнаера (Bruce Schneier) http://www.schneier.com, который занимается анализом реализации PPTP с 1998 года. Перевод одного из документов “Криптоанализ туннельного протокола типа точка-точка (PPTP) от Microsoft” находится по адресу http://www.ssl.stu.neva.ru/psw/crypto/pptp.html. Если бы не встроенная поддержка Windows о PPTP вероятно уже давно бы забыли. Хотя в среде Windows XP и более поздних версиях Windows существует возможность заменить пароли пользовательскими сертификатами, для чего с PPTP применяется протокол Extensible Authentication Protocol-Transport Layer Security (EAP-TLS).
Одним из популярных реализаций PPTP является сервер PoPToP (http://www.poptop.org). Изначально написан для Linux, но без проблем работает в Solaris 2.6, OpenBSD, FreeBSD и других. Это первый проект предоставивший возможность строить PPTP серверы в Linux. Проект стартовал под руководством Matthew Ramsay и контролировался Moreton Bay Ventures (http://www.moretonbay.com). В марте 1999 года PoPToP был опубликован под лицензией GNU. Совместим со всеми версиями Windows и Linux PPTP клиентом (pptpclient.sf.net). Поддерживает аутентификацию MSCHAPv2 и шифрование MPPE 40 с 128 битным RC4. При использовании RADIUS легко интегрируется в сети Windows. После включения поддержки PPTP в ядро установка PoPToP очень упростилась, и заключается в распаковке полученного архива и стандартных:
$ ./configure –prefix=/usr
$ make
$ su make install
Если нужна поддержка TCP wrappers, следует добавить ключ -with-libwrap (man tcpd(5)). Также стоит поискать пакеты в репозитарии. В дистрибутивах использующих apt как, например в Ubuntu вводим что-то вроде этого:
$ sudo apt-cache search pptp
И устанавливаем:
$ sudo apt-get install pptpd
Установка закончена можно настраивать.
По умолчанию сервер PoPToP использует конфигурационный файл /etc/pptpd.conf. Если установка производилась из исходных текстов готовый шаблон можно взять в подкаталоге samples в /etc. Можно конечно все параметры задавать в командной строке, но это не удобно. Редактируем:
# По умолчанию клиентские соединения будут ожидаться на всех интерфейсах
# можно указать конкретный адрес для PPTP соединений
# listen 217.165.34.2
# Путь к исполняемому файлу, если он находится не в /usr/sbin/pppd
# ppp /usr/sbin/pppd
# Путь к файлу с параметрами PPP (по умолчанию /etc/ppp/options)
option /etc/ppp/pptpd-options
# Включает отладочный вывод в syslog
# debug
# Задержка перед открытием соединения (по умолчанию 10 сек.)
# Предназначен для защиты от DOS атак.
# stimeout 10
# если снимем комментарий, запретим передачу клиенту его IP-адреса, что делается по умолчанию
# noipparam
# использование wtmp(5) для записи о подключениях клиентов
logwtmp
# включение перенаправления broadcast пакетов, требует конфигурирования с параметром –enable-bcrelay
# bcrelay eth0
# ограничения скорости клиентов (бит/сек)
# speed 115200
# Внутренний и клиентские IP-адреса. При описании не должно быть пробелов,
# можно указывать диапазон адресов или отдельный адрес, параметры разделяются запятой,
# между ними не должно быть пробела
localip 192.168.2.1
remoteip 192.168.2.100-150,192.168.2.200-245
В файле default.h максимальное количество соединений (клиентов) определено так:
#define CONNECTIONS_DEFAULT 100
Увеличить это значение можно использовав параметр “connections”. Простейшее правило для iptables выглядит так:
$ sudo –append INPUT –protocol 47 –jump ACCEPT
$ sudo iptables –append INPUT –protocol tcp –match tcp –destination-port 1723 –jump ACCEPT
Теперь файл /etc/ppp/pptpd-options:
# имя (должно соответствовать второму полю в /etc/ppp/chap-secrets)
name pptpd
# удаление домена из имени пользователя.
chapms-strip-domain
# авторизация
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
# Если pppd является основным сервером для Windows клиентов
# возможно задание одного или двух адресов DNS и WINS серверов клиентам.
# ms-dns 10.0.0.1
# ms-dns 10.0.0.2
# ms-wins 10.0.0.3
# ms-wins 10.0.0.4
# добавляем IP и Ethernet адреса клиента в таблицу ARP [Address Resolution Protocol]
# таким образом, как бы находится в локальной сети и может подключаться к ее ресурсам.
proxyarp
#не изменять маршрут по умолчанию
nodefaultroute
# Журнал
# debug
nologfd
# Вывод всех значений.
# dump
lock
nobsdcomp
novj
novjccomp
При таких установках аутентификация пользователя возможна только с помощью средств CHAPv2, поэтому открываем файл /etc/ppp/chap-secrets и добавляем пользователей которые смогут подключаться по VPN. В простейшем случае в файл заносится логин и пароль:
sergej pptpd password *
На этом настройки закончены, перезапускаем демон:
$ sudo /etc/init.d/pptpd restart
И пробуем подключиться к серверу.
Для небольших компаний такой настройки PoPToP вероятно будет достаточно. Если VPN пользователей будет много, следует использовать более удобные методы их авторизации. Поэтому когда все заработает нормально можно приступать к настройке RADIUS (Remote Access Dial-Up User Service). Это протокол, разработанный компанией Lucent RA и описанный в RFC 2138 и 2139. Коротко его задача хранение логиков и паролей пользователей и аутентификация. Сервер RADIUS определяет, может ли пользователь подключаться к запрашиваемому им сервису. При необходимости при необходимости производится учет времени, трафика и других параметров сессии пользователя. Кроме всего прочего его применение позволит использовать TLS-EAP. Итак, сначала установим сервер. Наиболее популярным открытым решением является FreeRADIUS, его и будем использовать.
$ sudo apt-get install freeraduis
В файл /etc/ppp/pptpd-options добавляем строку описывающую плагин:
plugin radius.so
О настройках RADIUS можно рассказывать долго, поэтому остановлюсь лишь на самых необходимых. Все конфигурационные файлы находятся в каталоге /etc/freeradius. Так как клиент у нас один и находимся на том же узле, что и сервер файл clients.conf исправляем следующим образом:
client 127.0.0.1 {
secret = super_PassWOrd
shortna me = localhost
nastype = other
}
Файл users содержит конфигурационную информацию о пользователях и другие данные необходимые для аутентификации. Для проверки работы заведем тестового пользователя:
test Auth-Type:=MS-CHAP, User-Password == «test»
Unix пользователей имеющиеся в /etc/passwd подключаются тоже просто:
DEFAULT Auth-Type = System
Fall-Through = 1
Главный файл сервера radiusd.conf (многое убрано, но основное оставлено):
# сначала в файле идут переменные, просто проверяем правильность путей
# имя пользователя и группа от которых запускается FreeRADIUS
user = freerad
group = freerad
# максимальное количество запросов хранимых сервером.
max_requests = 512
# слушаем на localhost
bind_address = 127.0.0.1
# использовать указанный конкретный port, если 0 его значение берется из /etc/services
port = 0
# неразрешать ip адреса в dns имена.
hostname_lookups = no
# Записывать в лог попытки авторизации.
log_auth = yes
# Записывать в логи некорректные и корректные пароли при авторизации.
log_auth_badpass = yes
log_auth_goodpass = no
# Включить/выключить коллизию пользователей.
usercollide = no
# конвертировать логин и/или пароль до или после авторизации.
lower_user = no
lower_pass = no
# удалить пробелы в логине и пароле
nospace_user = no
nospace_pass = no
# настройки безопасности от возможных DoS аттак.
security {
# Максимальное допустимое количество аттрибутов в RADIUS пакете.
max_attributes = 200
# Задержка (в секундах) перед отправкой Access-Reject пакета.
reject_delay = 1
# Не отвечать на запросы Status-Server
status_server = no
}
# Файл настройки клиентов
$INCLUDE ${confdir}/clients.conf
# Настройка потоков
thread pool {
# начальное и максимальное количество потоков
start_servers = 5
max_servers = 32
# регулируем свободные потоки
min_spare_servers = 3
max_spare_servers = 10
# Количество принимаемых процессом запросов
max_requests_per_server = 0
}
# настройка динамических модулей.
modules {
# модуль PAP авторизации, encryption_scheme, указывает в каком виде хранятся пароли.
# crypt – Unix.
pap {
encryption_scheme = crypt
}
# модуль CHAP авторизации.
chap {
authtype = CHAP
}
# модуль Microsoft CHAP и CHAP v2
mschap {
authtype = MS-CHAP
use_mppe = yes
}
# Запись пакетов аутентификации
detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}
# Запись пакетов авторизации.
detail auth_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
detailperm = 0600
}
# Запись reply пакетов.
detail reply_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d
detailperm = 0600
}
# Создать уникальный сессионный ключ на основе указанных атрибутов
acct_unique {
key = «User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id»
}
# Авторизация
authorize {
preprocess
chap
mschap
# записываем пакеты авторизации.
auth_log
files
}
# модули доступные, для аутентификации
authenticate {
Auth-Type PAP { pap }
Auth-Type CHAP { chap }
Auth-Type MS-CHAP { mschap }
}
# предучетный модуль
preacct {
preprocess
}
# модуль учета
accounting {
acct_unique
detail
}
# Ведение логов reply-пакетов
post-auth {
reply_log
}
Сохраняем, пробуем запустить FreeRADIUS в отладочном режиме:
$ sudo freeradius -X
И подключаемся, используя тестовую запись. Если все прошло успешно, схему можно наращивать дальше, подключая LDAP, Active Directory, базу данных, подключить EAP и прочие приложения позволяющие сделать работу с учетными записями проще, а соединения безопаснее. Мы же идем дальше.
На это основные настройки закончены. Представленную схему можно развивать практически до любой степени сложности, построив в итоге гибкую в управлении и защищенную систему, обеспечивающую безопасное подключение удаленных пользователей. Успехов.
Если используется ядро самостоятельно собранное или вывод lsmod не показывает наличие строк “ppp*”, следует пересобрать ядро. Вводим “make menuconfig” и включаем. Для всех ядер:
Networking Support –>
Networking options –>
<M> IP: GRE tunnels over IP
И для 2.6.15+:
Device Drivers —>
Network device support —>
<M> PPP (point-to-point protocol) support
<M> PPP support for async serial ports
<M> PPP support for sync tty ports
<M> PPP Deflate compression
<M> PPP BSD-Compress compression
<M> PPP MPPE compression (encryption) (EXPERIMENTAL)
Cryptographic options —>
[*] Cryptographic API
[*] HMAC support
<M> MD5 digest algorithm
<M> SHA1 digest algorithm #this one is required
<M> SHA256 digest algorithm
<M> SHA384 and SHA512 digest algorithms
<M> DES and Triple DES EDE cipher algorithms
<M> ARC4 cipher algorithm #this one is required
Для более ранних версий параметры будут отличаться, но не намного. Также для таких ядер следует сначала наложить патч, взяв нужную версию с сайта mppe-mppc.alphacron.de. Например, для версии ядра 2.6.11 команда будет выглядеть так:
$ cd /usr/src
$ wget -c http://mppe-mppc.alphacron.de/linux-2.6.11-mppe-mppc-1.3.patch.gz
$ gunzip linux-2.6.11-mppe-mppc-1.3.patch.gz
$ cd linux
$ patch -p1 < ../linux-2.6.11-mppe-mppc-1.3.patch
После конфигурирования компилируем ядро как обычно.
Настройка VPN PPTP соединения практически ничем не отличается от подключения к провайдеру. Вызываем “Сетевые подключения”, выбираем “Создание нового подключения” и следуем указаниям мастера. Во втором окне отмечаем пункт “Подключить к сети на рабочем месте” и в следующем “Подключение к виртуальной частной сети”, затем вводим название подключения и указываем, необходимо ли набирать номер для предварительного подключения. Если соединение осуществляется напрямую, то выбираем “Не набирать номер для предварительного подключения” и вводим IP-адрес или имя сервера, к которому необходимо подключиться.
После нажатия кнопки Готово можно пробовать подключиться к серверу, введя логин и пароль. В зависимости от версии и настроек сервера, а также версии клиентской операционной системы, возможно, потребуется уточнить некоторые параметры подключения (протокол, обязательность шифрования, сжатие и другие) для чего необходимо выбрать “Свойства” созданного соединения.
Обещанный видеоурок по настройке pptp в Ubuntu