Виртуальная сеть для Windows-клиентаСергей «grinder» Яремчук Хакер, номер #103, стр. 130 (grinder@ua.fm) Настраиваем серверы PPTP и RADIUS на базе Linux и FreeBSD Сегодня перед системными администраторами все острее встает проблема обеспечения мобильных и удаленных пользователей полноценным и защищенным доступом к корпоративной сети. Благодаря встроенной поддержке туннельного протокола «точка-точка» в операционных системах Windows, одним из самых популярных решений является построение защищенных туннелей на основе PPTP. Настройкой такого сервера мы сегодня и займемся. Протокол PPTP Протокол 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): www.schneier.com. Этот специалист занимается анализом реализации PPTP с 1998 года. Если бы не встроенная поддержка в Windows, о PPTP, вероятно, уже давно бы все забыли. Хотя, с другой стороны, в Windows XP и более поздних версиях Windows присутствует возможность заменить пароли пользовательскими сертификатами, для этого с PPTP применяется протокол Extensible Authentication Protocol-Transport Layer Security (EAP-TLS). Установка сервера PoPToP в Linux Одной из популярных реализаций PPTP является сервер PoPToP (www.poptop.org). Изначально он написан для Linux, но без проблем работает в Solaris 2.6, OpenBSD, FreeBSD и других. Это первый проект, предоставивший возможность строить PPTP-серверы в Linux. Он стартовал под руководством Matthew Ramsay и контролировался Moreton Bay Ventures (www.moretonbay.com). В марте 1999 года PoPToP был опубликован под лицензией GNU. Он совместим со всеми версиями Windows и никсовым PPTP-клиентом (pptpclient.sf.net). Поддерживает аутентификацию 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 По умолчанию сервер 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 И пробуем подключиться к серверу. Прикручиваем RADIUS Для небольших компаний такой настройки 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 ты найдешь на прилагаемом к журналу диске): # 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 Сервер MPD (Multi-link PPP Daemon, sf.net/projects/mpd) работает только в 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 На этом основные настройки закончены. Представленные схемы можно развивать практически до любой степени сложности, построив в итоге гибкую в управлении и защищенную систему, обеспечивающую безопасное подключение удаленных пользователей. INFO О том, как подключить *nix-клиента к PPTP-серверу, мы планируем рассказать в одном из ближайших выпусков Unixoid'а. Включение поддержки 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 Для более ранних версий параметры будут отличаться, но не сильно. Также для таких ядер следует сначала наложить патч, взяв нужную версию с сайта 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 После конфигурирования компилируем ядро как обычно. Настройка клиентского соединения в Windows Настройка PPTP-соединения практически ничем не отличается от подключения к провайдеру. Вызываем «Сетевые подключения», выбираем «Создание нового подключения» и следуем указаниям мастера. Во втором окне отмечаем пункт «Подключить к сети на рабочем месте» и в следующем – «Подключение к виртуальной частной сети», затем вводим название подключения и указываем, необходимо ли набирать номер для предварительного подключения. Если соединение осуществляется напрямую, то выбираем «Не набирать номер для предварительного подключения» и вводим IP-адрес или имя сервера, к которому необходимо подключиться. После нажатия кнопки «Готово» можно пробовать подключиться к серверу, введя логин и пароль. В зависимости от версии и настроек сервера, а также версии клиентской операционной системы, возможно, потребуется уточнить некоторые параметры подключения (протокол, обязательность шифрования, сжатие и другие), для чего необходимо выбрать «Свойства» созданного соединения. |