RUS | ДонНТУ> Портал магистров ДонНТУ
Магистр ДонНТУ Шуликов Александр Валериевич

Шуликов Александр Валериевич

Факультет: Вычислительной техники и информатики

Специальность: Программное обеспечение автоматизированных систем

Тема выпускной работы:

Увеличение производительности транслятора языка Пролог с использованием механизма параллельных вычислений

Руководитель: доцент, к.ф-м.н., Дацун Наталья Николаевна

Материалы по теме выпускной работы: Главная | Реферат | Библиотека | Ссылки | Отчет о поиске | Индивидуальное задание

Настройка VPN-сервера под управлением FreeBSD

      Для начала: данная статья не претендует на роль полноценного руководства или панацеи на все случаи жизни, посему все вопросы и пожелания по исправлению и дополнению статьи шлем на <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
В секции authorize комментируем
files
и удаляем комментарий с
sql
В секции accounting также снимаем комментарий с
sql
чтобы информация о сессиях была записана в radacct.
Далее в sql.conf и правим (подставляя правильные хост, логин и пароль):
driver="rlm_sql_mysql"

server="localhost"
login="login_to_mysql"
password="pass_to_mysql"
Осталось поправить clients.conf, задав для клиента 127.0.0.1 secret (с учетом, что наша связка будет использовать radius-сервер на локальной машине):
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"
и стартуем скриптами из /usr/local/etc/rc.d/.

      Проверим радиус на работоспособность:

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"
и запускаем mpd:
/usr/local/etc/rc.d/mpd5 start
Теперь нужно его проверить. Чтобы проще было вести отладку — добавим в /etc/syslog.conf:
!mpd
*.*                  /var/log/mpd.log
И перезапускаем syslog, предварительно создав /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=""
Файлик с правилами для pf может иметь примерно такой вид (pf.rules):
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.

Источники:

  1. Mpd 5.1 User Manual
  2. Руководство FreeBSD
  3. FreeRadius WIKI


ДонНТУ > Портал магистров ДонНТУ > Главная | Реферат | Библиотека | Ссылки | Отчет о поиске | Индивидуальное задание