VPN-сервер в стиле how-to (pptpd+mysql+radius) на CentOS6 | ||
Сети > VPN Здесь я постараюсь описать процесс установки и настройки VPN-сервера на CentOS6 с пользователями в MySQL и авторизацией через радиус для шифрованного соединения по ms-chap-v2 и mppe.
Преамбула Откуда берутся данные статьи? Все просто. Когда мы ищем соискателей работы, например, на должность системного администратора, то после отбора кандидатов на предварительном собеседовании, состовляются тестовые задания, реализуются своими силами, а потом предлагаем их решить соискателям. Для исполнения заданий, соискателю предоставляется виртуальная машина, доступ в интернет, и определенное время. Время расчитывается просто — наша реализация *2. При этом, Вы можете считать, что все необходимые решения (how-to) можно найти на просторах интернета, однако, мы учитываем это, и поэтому не берем готовых решения, а состовляем и решаем предварительно их сами, на свежих дистрибютивах. Кстати, бывают случаи, когда мы натыкаемся на определенные проблемы при реализации (маленькие незадокументированные шалости разработчиков), и в случае, если кандидат идет правильным курсом, но попадает в затык именно на этой проблеме, подсказываем найденное нами, её решение. Дано Виртуальная машина на KVM с белым IP и свежеустановленной CentOS6 x86_64 minimal. Задача 1. Установить и настроить в связке pptpd, freeradius2, radiusclient-ng и mysql. 2. Создать 2-х клиентов для подключения к настроенному VPN-серверу, с выходом в нет четез NAT. Один клиент с динамическим получением адреса, второй с постоянным IP. 3. Перенести pool адресов для раздачи динамическим клиентам из pptpd в radius. Решение Первым делом необходимо установить все необходимые пакеты. radiusclient-ng и pptpd нет в стандартных репозиториях, поэтому для radiusclient-ng мы подключим EPEL-репозиторий, а pptpd-пакет скачаем напрямую. # rpm -Uhv fedora-epel.mirror.lstn.net/6/x86_64/epel-release-6-5.noarch.rpm # yum install freeradius freeradius-mysql radiusclient-ng radiusclient-ng-utils freeradius-utils mysql mysql-devel mysql-server #rpm -Uhv poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.el6.x86_64.rpm далее настроим mysql и зададим пароль: mysql_secure_installation Собственно перейдем к настройке pptpd. Приводим файлы настройки к следующему виду: # cat /etc/pptpd.conf option /etc/ppp/options.pptpd logwtmp localip 192.168.80.1 remoteip 192.168.80.5-35 # cat /etc/ppp/options.pptpd name pptpd refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 proxyarp lock nobsdcomp novj novjccomp nologfd plugin radius.so plugin radattr.so с pptpd закончено, переходим к настройке radiusclient-ng: Первая проблема, с которой мы столкнулись, это нежелание pptpd работать с radiusclient-ng из-за путей куда он установлен, поэтому создаем софт-линк следующим образом # ln -s /etc/radiusclient-ng /etc/radiusclient и закоментируем в файле /etc/radiusclient-ng/radiusclient.conf строчку #bindaddr * иначе ругается на неизвестный параметр. редактируем /etc/radiusclient-ng/servers, добавляем локальный radius-сервер, к которому будет обращаться клиент localhost YouRsUpErpAAs Вторая проблема, с которой нам пришлось столкнуться, это отсутствие в пакете radiusclient-ng атрибутов от mircosoft, после гугления, необходимые артибуты были найдены. копируем имеющиеся файлы с атрибутами из /usr/share/radiusclient-ng/ в /etc/radiusclient-ng/ # cp /usr/share/radiusclient-ng/diction* /etc/radiusclient-ng/ в /etc/radiusclient-ng/ создаем файл dictionary.microsoft со следующим содержимым: VENDOR Microsoft 311 Microsoft ATTRIBUTE MS-CHAP-Response 1 string Microsoft ATTRIBUTE MS-CHAP-Error 2 string Microsoft ATTRIBUTE MS-CHAP-CPW-1 3 string Microsoft ATTRIBUTE MS-CHAP-CPW-2 4 string Microsoft ATTRIBUTE MS-CHAP-LM-Enc-PW 5 string Microsoft ATTRIBUTE MS-CHAP-NT-Enc-PW 6 string Microsoft ATTRIBUTE MS-MPPE-Encryption-Policy 7 string Microsoft ATTRIBUTE MS-MPPE-Encryption-Type 8 string Microsoft ATTRIBUTE MS-MPPE-Encryption-Types 8 string Microsoft ATTRIBUTE MS-RAS-Vendor 9 integer Microsoft ATTRIBUTE MS-CHAP-Domain 10 string Microsoft ATTRIBUTE MS-CHAP-Challenge 11 string Microsoft ATTRIBUTE MS-CHAP-MPPE-Keys 12 string Microsoft ATTRIBUTE MS-BAP-Usage 13 integer Microsoft ATTRIBUTE MS-Link-Utilization-Threshold 14 integer Microsoft ATTRIBUTE MS-Link-Drop-Time-Limit 15 integer Microsoft ATTRIBUTE MS-MPPE-Send-Key 16 string Microsoft ATTRIBUTE MS-MPPE-Recv-Key 17 string Microsoft ATTRIBUTE MS-RAS-Version 18 string Microsoft ATTRIBUTE MS-Old-ARAP-Password 19 string Microsoft ATTRIBUTE MS-New-ARAP-Password 20 string Microsoft ATTRIBUTE MS-ARAP-PW-Change-Reason 21 integer Microsoft ATTRIBUTE MS-Filter 22 string Microsoft ATTRIBUTE MS-Acct-Auth-Type 23 integer Microsoft ATTRIBUTE MS-Acct-EAP-Type 24 integer Microsoft ATTRIBUTE MS-CHAP2-Response 25 string Microsoft ATTRIBUTE MS-CHAP2-Success 26 string Microsoft ATTRIBUTE MS-CHAP2-CPW 27 string Microsoft ATTRIBUTE MS-Primary-DNS-Server 28 ipaddr Microsoft ATTRIBUTE MS-Secondary-DNS-Server 29 ipaddr Microsoft ATTRIBUTE MS-Primary-NBNS-Server 30 ipaddr Microsoft ATTRIBUTE MS-Secondary-NBNS-Server 31 ipaddr Microsoft VALUE MS-BAP-Usage Not-Allowed 0 VALUE MS-BAP-Usage Allowed 1 VALUE MS-BAP-Usage Required 2 VALUE MS-ARAP-PW-Change-Reason Just-Change-Password 1 VALUE MS-ARAP-PW-Change-Reason Expired-Password 2 VALUE MS-ARAP-PW-Change-Reason Admin-Requires-Password-Change 3 VALUE MS-ARAP-PW-Change-Reason Password-Too-Short 4 VALUE MS-Acct-Auth-Type PAP 1 VALUE MS-Acct-Auth-Type CHAP 2 VALUE MS-Acct-Auth-Type MS-CHAP-1 3 VALUE MS-Acct-Auth-Type MS-CHAP-2 4 VALUE MS-Acct-Auth-Type EAP 5 VALUE MS-Acct-EAP-Type MD5 4 VALUE MS-Acct-EAP-Type OTP 5 VALUE MS-Acct-EAP-Type Generic-Token-Card 6 VALUE MS-Acct-EAP-Type TLS 13 редактируем файл /etc/radiusclient-ng/radiusclient.conf на предмет dictionary /etc/radiusclient-ng/dictionary редактируем файл /etc/radiusclient-ng/dictionary, добавляя в конец INCLUDE /etc/radiusclient-ng/dictionary.microsoft INCLUDE /etc/radiusclient-ng/dictionary.merit с клиентом тоже закончили, переходим к настройке mysql: пакет freeradius-mysql содержит необходимые файлы для импорта их в mysql, находятся они в /etc/raddb/sql/mysql/ подредактируем файл admin.sql, что бы задать пароль отличный от стандартного vim admin.sql :%s/radpass/radpass235/g :wq подключаемся к mysql, создаем DB, импортируем таблицы и создаем пользователей mysql -p mysql> create database radius; mysql> \. admin.sql mysql> use radius; mysql> \. schema.sql далее создаем пользователей и их настройки mysql> INSERT INTO radusergroup (username,groupname) values ('user1','static-ip-vpn'); mysql> INSERT INTO radusergroup (username,groupname) values ('user2','dinamic-ip-vpn'); должно получится следующее mysql> select * from radusergroup; +----------+----------------+----------+ | username | groupname | priority | +----------+----------------+----------+ | user1 | static-ip-vpn | 1 | | user2 | dinamic-ip-vpn | 1 | +----------+----------------+----------+ mysql> INSERT INTO radcheck (username,attribute,op,value) values ('user1','User-Password','==','pass1'); mysql> INSERT INTO radcheck (username,attribute,op,value) values ('user2','User-Password','==','pass2'); mysql> select * from radcheck; +----+----------+---------------+----+-------+ | id | username | attribute | op | value | +----+----------+---------------+----+-------+ | 1 | user1 | User-Password | == | pass1 | | 2 | user2 | User-Password | == | pass2 | +----+----------+---------------+----+-------+ заполняем таблицу radgroupreply mysql> INSERT INTO radgroupreply (groupname, attribute, op, value) values ('dinamic-ip-vpn','Service-Type',':=','Framed-User'); и так далее, чтоб получить следующее mysql> select * from radgroupreply; +----+----------------+--------------------+----+---------------------+ | id | groupname | attribute | op | value | +----+----------------+--------------------+----+---------------------+ | 1 | dinamic-ip-vpn | Service-Type | := | Framed-User | | 2 | dinamic-ip-vpn | Framed-Protocol | := | PPP | | 3 | dinamic-ip-vpn | Framed-Compression | := | Van-Jacobsen-TCP-IP | | 4 | static-ip-vpn | Framed-Compression | := | Van-Jacobsen-TCP-IP | | 5 | static-ip-vpn | Framed-Protocol | := | PPP | | 6 | static-ip-vpn | Service-Type | := | Framed-User | +----+----------------+--------------------+----+---------------------+ заполняем таблицу radreply чтобы задать постоянный ip для первого клиента mysql> INSERT INTO radreply (username, attribute, op, value) values ('user1','Framed-IP-Netmask',':=','255.255.255.255'); mysql> INSERT INTO radreply (username, attribute, op, value) values ('user1','Framed-IP-Address',':=','192.168.80.90'); mysql> select * from radreply; +----+----------+-------------------+----+-----------------+ | id | username | attribute | op | value | +----+----------+-------------------+----+-----------------+ | 1 | user1 | Framed-IP-Netmask | := | 255.255.255.255 | | 2 | user1 | Framed-IP-Address | := | 192.168.80.90 | +----+----------+-------------------+----+-----------------+ В итоге, мы занесли в базу данный 2-х клиентов, user1 с паролем pass1 и статическим ip — 192.168.80.90, и user2 с паролем pass2 и получением динамического ip из пула указанного в настройках pptpd. Здесь намеренно пользователи разнесены по группам, с учетом дальшейшего увеличения клиентов, можно было просто создать все атрибуты для обоих клиентов в таблице radreply, но при большом количестве клиентов, удобнее использовать группы, где указываются одинаковые для клиентов группы атрибуты. Так же, в группах можно указывать разные пулы адресов и еще многое другое, но об этом сейчас не будем, ведь нам необходимо решить задачу в поставленные сроки. Переходим к настрокам radius. Здесь я приведу примеры файлов, в которых производились изменения: /etc/raddb/clients.conf client 127.0.0.1 { secret = YouRsUpErpAAs shortname = localhost nastype = other } Третья проблема, на момент отладки, когда еще radius не был подключен к mysql, столкнулись с тем, что если в файле /etc/raddb/users клиенты оказывались прописанными не в начале файла, ничего не работало. /etc/raddb/users DEFAULT Simultaneous-Use := 1 Fall-Through = 1 Это необходимо прописать, чтоб не было нескольких подключений с одним и тем же логином одновременно /etc/raddb/radiusd.conf в секции modules уберем комментарии с $INCLUDE sql.conf /etc/raddb/sql.conf прописываем данные для подключения к mysql password = "radpass235" /etc/raddb/sites-enabled/default в секциях authorize, session, post-auth и accounting включаем sql в секции authorize включаем mschap /etc/raddb/modules/mschap mschap { use_mppe = yes require_encryption = yes require_strong = yes } Пожалуй, задача практически решена, остались некоторые штрихи: Настроить iptables и разрешить форвард, чтоб выпустить клиентов в мир iptables -I INPUT -p gre -j ACCEPT iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 1723 -j ACCEPT iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -I FORWARD -s 192.168.80.0/24 -o eth0 -j ACCEPT iptables -I FORWARD -d 192.168.80.0/24 -i eth0 -j ACCEPT iptables -t nat -I POSTROUTING -s 192.168.80.0/24 -o eth0 -j MASQUERADE /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p Уже на данной стадии, если мы запустим установленные сервисы, мы сможем подключится к нашей машине по vpn, осталось только перенести пул адресов выдаваемых динамическим клиентам из pptpd в radius. Для этого есть несколько вариантов, вплоть до помещения пула в mysql. Мы используем простой вариант. /etc/raddb/modules/ippool в секции ippool main_pool, делаем правки для своего пула адресов range-start = 192.168.80.35 range-stop = 192.168.80.65 в файле /etc/raddb/sites-enabled/default добавляем в соответствующие секции accounting { main_pool } post-auth { main_pool } далее, создаем файлы, где пул будет храниться touch /etc/raddb/db.ipindex /etc/raddb/db.ippool chmod 664 /etc/raddb/db.ipindex /etc/raddb/db.ippool chown root:radiusd /etc/raddb/db.ipindex /etc/raddb/db.ippool и добавляем в /etc/raddb/users DEFAULT Pool-Name := main_pool Fall-Through = Yes перезапускаем radius, и пробуем подключится к машине по vpn, все должно работать. Подробную статистику подключений мы можем увидеть в таблице radius.radacct выделенные адреса из пула, можно посмотреть командой: rlm_ippool_tool -av /etc/raddbdb/db.ippool /etc/raddbdb/db.ipindex Послесловие Я намеренно подчеркивал проблемы, с которыми нам пришлось столкнутся. Нами было потрачено чуть более часа на развертование данной системы. Для кандидатов было выделенно 2,5 часа. Ни один из 4-х соискателей не выполнил данное задание в полном объеме. Лишь один из них практически дошел до конца пути. С ним, возможно, мы продолжим сотрудничество. Я конечно понимаю, что не все работодатели используют такой метод тестов соискателей работы. Однако, я считаю, это один из лучших способов, действительно проверить знания и возможности кандидатов. Ведь если кандидат решил (или почти решил) подобную задачу, значит, через какое то время, вхождения в коллектив и погружение в структуру сети, на него вполне можно положиться. Источник: http://habrahabr.ru/blogs/linux/128599 |
||
Комментарии | ||