Для начала: данная статья не претендует на роль полноценного руководства или панацеи на все случаи жизни, посему все вопросы и пожелания по исправлению и дополнению статьи шлем на <shulik at ua.fm>.
Итак — приступим. В работе нам понадобится: FreeBSD 6.3-RELEASE (или выше). Почему именно так? Потому что замечены некоторые нестабильности в работе mpd-5.x на младших версиях, которые иногда приводят к kernel panic. Со слов автора mpd - в 6.3 и выше в NetGraph появилась корректная обработка событий, которые имеют место быть при динамическом создании и уничтожении интерфейсов. Также понадобится mpd-5.x, freeradius, netams, mysql, поддержка в ядре или в виде модулей IPFW, IPDIVERT, PF, NETGRAPH. Рекомендуется включить поддержку этих компонентов в ядро. Поэтому открываем конфигурационный файл вашего ядра и добавляем, если не хватает, туда следующее:
options NETGRAPH # собственно поддержка netgraph options NETGRAPH_PPP # поддержка PPP в netgraph options NETGRAPH_PPTPGRE # поддержка gre-туннелирования options IPFIREWALL # включаем поддержку ipfw options IPFIREWALL_DEFAULT_TO_ACCEPT # политика по умолчанию - ACCEPT options IPDIVERT # включаем divert-сокеты (понадобится для статистики) |
Что касается pf — то я оставил его в виде модуля. Если хотите включить в ядро — /sys/conf/NOTES вам поможет.
Теперь установим такие пакеты, как freeradius, mpd, mysql и netams. Коротко:
cd /usr/ports/net-mgmt/netams make clean make make install make clean |
При сборке freeradius обязательно указываем поддержку mysql.
cd /usr/ports/databases/mysql50-server make clean make make install make clean cd /usr/ports/net/freeradius make clean make make install make clean cd /usr/ports/net/mpd5 make clean make make install make clean |
Теперь необходимо отконфигурировать установленный софт. MySQL конфигурируем по вкусу — задавая пароли рута и прослушку портов или ее отсутствие. Затем нужно настроить freeradius. Для начала идем в /usr/local/etc/raddb/ и переименовываем все файлики из ‘*.samples’ в ‘*’. Открываем radiusd.conf. В нем правим следующие настройки:
log_stripped_names=yes # Логируем атрибут User-Name если он найден в запросе log_auth=yes # Логируем запросы аутентификации log_auth_badpass=yes # Если пароль неверен - пишем его в Лог log_auth_goodpass=no # верные пароли незачем писать в лог |
$INCLUDE ${confdir}/sql.conf |
files |
sql |
sql |
driver="rlm_sql_mysql" server="localhost" login="login_to_mysql" password="pass_to_mysql" |
secret=MyOwnSecret |
Кроме того нужно создать в mysql базу radius’a. Дамп со структурой базы можно найти в архиве с исходным кодом freeradius. Сам архив лежит тут (если радиус установлен из портов): /usr/ports/distfiles. Если дамп был залит успешно, то должна быть создана БД с именем radius и включающая таблицы radcheck, radreply, radgroupcheck, radgroupreply, radacct, usergroup. Заведем тестового пользователя:
INSERT INTO `radcheck` VALUES (1, 'user_test', 'Password', '==', 'qwerty'); INSERT INTO `radreply` VALUES (1, 'user_test', 'Framed-IP-Address', ':=', '192.168.1.3'); INSERT INTO `radreply` VALUES (2, 'user_test', 'Framed-IP-Netmask', ':=', '255.255.255.255'); INSERT INTO `radreply` VALUES (3, 'user_test', 'Framed-Protocol', ':=', 'PPP'); |
По сути ААА готова к использованию. Добавляем в /etc/rc.conf строки:
radiusd_enable="YES" mysql_enable="YES" |
Проверим радиус на работоспособность:
radtest user_test qwerty 127.0.0.1 0 MyOwnSecret |
В результате должны получить что-то вида:
Sending Access-Request of id 189 to 127.0.0.1:1812 User-Name = "user_test" User-Password = "qwerty" NAS-IP-Address = localhost NAS-Port = 0 rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=189, length=38 Framed-IP-Address = 192.168.1.3 Framed-IP-Netmask = 255.255.255.255 Framed-Protocol = PPP |
Это говорит о том, что радиус работает верно. Если нет - смотрим, что упало в /var/log/radiusd.log
Пришло время настроить mpd. Смело идем в /usr/local/etc/mpd5/ и убираем из имен конфигов samples. Открываем mpd.conf и пишем туда:
startup: # Заводим пользователя для администрирования mpd set user shulik shuliks_password admin # открываем telnet-порт на локалхосте на порту 5005 set console self 127.0.0.1 5005 set console open # конфигурируем веб-сервер для управления set web self 10.0.0.1 5006 set web open set netflow peer <адрес netflow-коллектора> 20001 set netflow self <локальный адрес, с которого слать netflow пакеты> 20000 default: load pptp_server pptp_server: set ippool add pool1 192.168.1.1 192.168.1.254 # задаем пул адресов create bundle template B # создаем шаблон бандла и конфигурируем его set iface disable proxy-arp # отключаем проксирование arp-запросов set iface idle 0 # отключаем разрыв по простою set iface enable tcpmssfix # включаем корректировку tcp mss set ipcp yes vjcomp # включаем компрессию Van Jacobson set ipcp ranges 192.168.1.1/32 ippool pool1 # закрепляем за бандлом диапазон адресов set ipcp dns 192.168.1.1 # отдаваемый клиенту DNS-сервер set iface enable netflow-in # включаем export статистики по трафику set iface enable netflow-out # по netflow в обоих направлениях create link template L pptp # шаблон для линка set link action bundle B # связываем его с шаблоном бандла set link yes acfcomp protocomp # включаем компрессии set link no pap chap-md5 # отключаем pap set link enable chap-md5 # включаем chap-md5 аутентификацию load radius # загружаем настройки радиуса set link keep-alive 60 180 # задаем параметры проверки линка set link mtu 1300 # задаем MTU, желательно не более 1460 set link mru 1300 # задаем MRU, желательно не более 1460 set pptp self 0.0.0.0 # ожидаем соединения на любом ip-адресе set link enable incoming # разрешаем входящие соединения radius: # конфигурируем radius-клиент для NAS set radius config /usr/local/etc/mpd5/radius.conf # сервера описываем во внешнем файле set radius retries 3 # максимум три попытки обращения к радиусу set radius timeout 3 # с timeout'ом 3 секунды set radius me 192.168.1.1 # сообщать радиусу указанный NASIPAddress set auth acct-update 300 # положить Acct-Interim-Interval = 300 секунд set auth enable radius-auth # включить авторизацию через радиус set auth enable radius-acct # включить учет через радиус |
Нужно заметить, что в отличие от прошлых версий mpd, mpd-5.x позволяет не описывать все pptp-линки вручную, а создать шаблон и заставить сервер создавать все автоматически при соединении.
Содержимое файла с описанием серверов радиус достаточно простое (radius.conf) — <тип действия> <адрес сервера> <секретная фраза, описанная в конфигурации сервера для этого хоста>:
acct 127.0.0.1 MyOwnSecret auth 127.0.0.1 MyOwnSecret |
Добавляем в rc.conf строку:
mpd_enable="YES" |
/usr/local/etc/rc.d/mpd5 start |
!mpd *.* /var/log/mpd.log |
touch /var/log/mpd.log /etc/rc.d/syslogd restart |
Далее нужно клиентов из внутренней сети с серыми ip-адресами выпустить в интернет. Для этого у нас есть несколько путей: воспользоваться связками ipfw+natd или ipfw+ng_nat, но мы пойдем по пути использования pf.
В /etc/rc.conf добавляем:
pf_enable="YES" pf_rules="/etc/pf.rules" pf_flags="" pflog_enable="YES" pflog_logfile="/var/log/pflog" pflog_flags="" |
ext_ip="19х.1хх.хх.хх" # внешний ip-адрес сервера int_if="rl1" # интерфейс смотрящий в локальную сеть int_net_vpn="xx.yy.zz.ff" # внутренняя VPN-сеть local_net="..." # внутрення локальная сеть int_ip="..." # внутренний адрес в локальной сети nat on rl0 from $int_net_vpn to any -> $ext_ip # собственно NAT pass quick on lo0 all # разрешаем все на lo0 pass quick from $ext_ip to any # Разрешаем трафик pass quick from any to $ext_ip # на внешнем ip pass quick from $int_net_vpn to any # разрешаем любой трафик pass quick from any to $int_net_vpn # по впн-сети block in quick on $int_if proto { tcp udp } from $local_net to $int_ip port { 25 110 143 3128 3306 } # блокируем платные сервисы из локальной сети pass in quick on $int_if from $local_net to $int_ip block in all # все осальное блокируем по умолчанию |
Все. Теперь трафик должен ходить в интернет. Для сбора статистики, экспортируемой mpd в netflow-потоке можно воспользоваться, например, пакетом flow-tools, который имеется в портах. Описывать его настройку не имеет смысла - она слишком проста. Достоинством данного пакета является то, что он хранит информацию в обычных файлах и при этом не сильно нагружает сервер, на котором работает. А при необходимости поместить эту статистику в БД, или отрисовать в виде графиков - всегда можно написать несложный скрипт на perl или python.
Стоит также упомянуть некоторые вещи, которые выходят за рамки данной статьи, но которыми всегда можно воспользоваться в данной связке. Во-первых, это ограничение входящей и исходящей скорости на туннеле по каждому конкретному клиенту. Для этого необходимо включить в словарь используемого радиус-сервера некоторые дополнительные параметры, обрабатываемые mpd. В данном случае для задания лимитов в таблицы радиус для клиента добавляется параметр mpd-limit. Его структура и примеры использования хорошо описаны в официальной документации mpd. Реальное ограничение скорости производится при помощи netgraph узла ng_car. Во-вторых, возможен сброс клиента с линии при помощи ответа от радиус на accounting запрос. Для этого используется параметр mpd-drop-user. Может применяться, например, при связке радиуса с биллингом, когда каждый accounting-запрос обрабатывается также внешним скриптом, который при исчерпании клиентом некоторых условий всегда может добавить в ответный пакет mpd-drop-user=1.
Источники: