Настраиваем PPTP и RADIUS сервер на базе Linux и FreeBSD
Сергей «grinder» Яремчук (grinder@ua.fm, )
Сегодня перед системными администраторами все острее встает проблема обеспечения мобильных и удаленных пользователей полноценным и защищенным доступом к корпоративной сети. Благодаря встроенной поддержке туннельного протокола «точка-точка» в операционных системах Windows, одним из самых популярных решений является построение защищенных туннелей на основе PPTP. Настройкой такого сервера мы сегодня и займемся.
Содержание:
- Протокол PPTP
- Установка сервера PoPToP в Linux
- Конфигурационные файлы PoPToP
- Прикручиваем RADIUS
- Установка сервера MPD в FreeBSD
- Врезка: Включение поддержки PPTP в ядре Linux
- Врезка: Настройка клиентского соединения в Windows
- Боковые выносы
Протокол PPTP (Point-to-Point Tunneling Protocol) позволяет создавать защищенные каналы для обмена данными по различным сетевым протоколам — IP, IPX или NetBEUI. Данные этих протоколов инкапсулируются с помощью протокола PPTP в пакеты протокола IP, с помощью которого переносятся в зашифрованном виде через любую сеть TCP/IP. PPTP работает, устанавливая обычную PPP-сессию с противоположной стороной с помощью протокола туннелирования сетевых пакетов GRE (Generic Routing Encapsulation — общая инкапсуляция маршрутов). Для шифрования трафика используется протокол MPPE (Microsoft Point-to-Point Encryption), использующий потоковый шифр RSA, RC4-ключи которого меняются в течение сессии.
Cisco первой реализовала PPTP в своих продуктах, она и лицензировала эту технологию корпорации Microsoft. Из-за опасений по поводу патентных претензий протокола MPPE, до недавнего времени в дистрибутивах Linux отсутствовала полноценная поддержка PPTP. Однако, начиная с версии 2.6.13, появилась полная поддержка PPTP.
Но не все так гладко. Не смотря на популярность, специалисты недолюбливают PPTP по причине слабых алгоритмов парольной аутентификации и возможности получения сессионных ключей на основе пользовательского пароля. Об этом можно почитать на сайте Брюса Шнаера (Bruce Schneier) , этот специалист занимается анализом реализации PPTP с 1998 года.
Если бы не встроенная поддержка в Windows, о PPTP, вероятно, уже давно бы все забыли. Хотя, с другой стороны, в Windows XP и более поздних версиях Windows присутствует возможность заменить пароли пользовательскими сертификатами, для этого с PPTP применяется протокол Extensible Authentication Protocol-Transport Layer Security (EAP-TLS).
Установка сервера PoPToP в Linux
Одной из популярных реализаций PPTP является сервер . Изначально написан для Linux, но без проблем работает в Solaris 2.6, OpenBSD, FreeBSD и других. Это первый проект, предоставивший возможность строить PPTP-серверы в Linux. Проект стартовал под руководством Matthew Ramsay и контролировался . В марте 1999 года PoPToP был опубликован под лицензией GNU. Совместим со всеми версиями Windows и *nix’овым . Поддерживает аутентификацию MSCHAPv2 и шифрование MPPE 40 с 128 битным RC4. При использовании RADIUS легко интегрируется в сети Windows.
После включения поддержки PPTP в ядро установка PoPToP очень упростилась. Она заключается в распаковке полученного архива и стандартных:
$ ./configure -–prefix=/usr $ make $ sudo 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 архива с исходными текстами. Можно, конечно, все параметры задавать в командной строке, но это не удобно. Редактируем:
$ sudo vi /etc/pptpd.conf # По умолчанию клиентские соединения будут ожидаться на всех интерфейсах; # можно указать конкретный адрес для PPTP-соединений # listen 217.165.34.2 # Путь к исполняемому файлу pppd # ppp /usr/sbin/pppd # Путь к файлу с параметрами PPP 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 # Клиентские IP-адреса. При описании не должно быть пробелов, # можно указывать диапазон адресов или отдельный адрес remoteip 192.168.2.100-150,192.168.2.200-245
Простейшее правило для iptables выглядит так:
$ sudo iptables --append INPUT --protocol 47 --jump ACCEPT $ sudo iptables --append INPUT --protocol tcp --match tcp \ --destination-port 1723 --jump ACCEPT
Теперь файл pptpd-options:
$ sudo vi /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-wins 10.0.0.2 # Добавляем IP- и MAC-адреса клиента в таблицу ARP, таким образом, клиент # как бы находится в локальной сети и может подключаться к ее ресурсам proxyarp # Не изменять маршрут по умолчанию nodefaultroute # Выполняем блокировку соединения и отключаем компрессию lock nobsdcomp novj novjccomp
При таких установках аутентификация пользователя возможна только с помощью средств CHAPv2, поэтому открываем файл /etc/ppp/chap-secrets и добавляем пользователей, которые смогут подключаться по VPN. В простейшем случае в файл заносится логин и пароль:
sergej pptpd password *
На этом настройки закончены, перезапускаем демон:
$ sudo /etc/init.d/pptpd restart
И пробуем подключиться к серверу.
Для небольших компаний такой настройки PoPToP, вероятно, будет достаточно. Если VPN-пользователей будет много, следует использовать более удобные методы их авторизации. Поэтому, когда PPTP-конфигурация будет протестирована должным образом, можно приступать к настройке RADIUS (Remote Access Dial-Up User Service). Если говорить коротко, то его задача сводится к аутентификации, а также хранению логинов и паролей пользователей. Сервер 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
shortname = localhost
nastype = other
}
Файл users содержит конфигурационную информацию о пользователях и другие данные, необходимые для аутентификации. Для проверки работы заведем тестового пользователя:
test Auth-Type:=MS-CHAP, User-Password == "test"
Пользователи, зарегистрированные в /etc/passwd, подключаются тоже просто:
DEFAULT Auth-Type = System Fall-Through = 1
Теперь редактируем главный файл сервера radiusd.conf (для экономии журнального пространства конфиг дается в сильно сжатом виде, полную версию radiusd.conf ты найдешь на прилагаемом к журналу диске):
$ sudo vi radiusd.conf
# Имя пользователя и группа, используемые для запуска FreeRADIUS
user = freerad
group = freerad
# Максимальное количество запросов, хранимых сервером
max_requests = 512
# Слушаем на localhost
bind_address = 127.0.0.1
# Использовать указанный конкретный port, если 0, его значение берется
# из /etc/services
port = 0
# Не разрешать преобразование адресов
hostname_lookups = no
# Записывать в лог попытки авторизации
log_auth = yes
# Записывать в лог некорректные и корректные пароли при авторизации
log_auth_badpass = yes
log_auth_goodpass = no
# Включить/выключить коллизию пользователей
usercollide = no
# Настройки безопасности для противодействия возможным DoS-атакам
security {
# Максимальное допустимое количество атрибутов в RADIUS-пакете
max_attributes = 200
# Задержка (в секундах) перед отправкой пакета Access-Reject
reject_delay = 1
# Не отвечать на запросы Status-Server
status_server = no
}
Сохраняем, пробуем запустить FreeRADIUS в отладочном режиме:
$ sudo freeradius -X
И подключаемся, используя тестовую запись. Если все прошло успешно, схему можно наращивать дальше, подключая LDAP, Active Directory, базу данных, кроме того, можно интегрировать EAP и прочие приложения, позволяющие сделать работу с учетными записями проще, а соединения — безопаснее. Мы же идем дальше.
Установка сервера MPD в FreeBSD
Сервер (Multi-link PPP Daemon) работает только в FreeBSD. В феврале 2007 года вышла новая версия сервера 4.1, которую и рекомендуют использовать разработчики. Поддерживается 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 # Включение 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" grinder "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 следующие строки (не забывая его затем перезапустить):
!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, настройки которого аналогичны, а чтобы MPD узнал о его использовании, в файл 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 прописываем:
acct 127.0.0.1 password123 auth 127.0.0.1 password123
На этом основные настройки закончены. Представленные схемы можно развивать практически до любой степени сложности, построив в итоге гибкую в управлении и защищенную систему, обеспечивающую безопасное подключение удаленных пользователей.
Врезка: Включение поддержки PPTP в ядре Linux
Если вывод 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) Cryptographic options ---> [*] Cryptographic API [*] HMAC support <M> MD5 digest algorithm <M> SHA1 digest algorithm <M> SHA256 digest algorithm <M> SHA384 and SHA512 digest algorithms <M> DES and Triple DES EDE cipher algorithms <M> ARC4 cipher algorithm
Для более ранних версий параметры будут отличаться, но не намного. Также для таких ядер следует сначала наложить патч, взяв нужную версию с сайта . Например, для версии ядра 2.6.11 команда будет выглядеть так:
$ cd /usr/src $ ftp $ gunzip linux-2.6.11-mppe-mppc-1.3.patch.gz $ cd linux $ patch -p1 < ../linux-2.6.11-mppe-mppc-1.3.patch
После конфигурирования компилируем ядро, как обычно.
Врезка: Настройка клиентского соединения в Windows
Настройка PPTP-соединения практически ничем не отличается от подключения к провайдеру. Вызываем «Сетевые подключения», выбираем «Создание нового подключения» и следуем указаниям мастера. Во втором окне отмечаем пункт «Подключить к сети на рабочем месте» и в следующем «Подключение к виртуальной частной сети», затем вводим название подключения и указываем, необходимо ли набирать номер для предварительного подключения. Если соединение осуществляется напрямую, то выбираем «Не набирать номер для предварительного подключения» и вводим IP-адрес или имя сервера, к которому необходимо подключиться. После нажатия кнопки «Готово» можно пробовать подключиться к серверу, введя логин и пароль. В зависимости от версии и настроек сервера, а также версии клиентской операционной системы, возможно, потребуется уточнить некоторые параметры подключения (протокол, обязательность шифрования, сжатие и другие), для чего необходимо выбрать «Свойства» созданного соединения.
INFO
-
О том, как подключить *nix-клиента к PPTP-серверу, мы планируем рассказать в одном из ближайших выпусков Unixoid’а.
Статья опубликована в июльском номере журнала «Xakep» за 2007 год.





