В данной статье рассматривается возможность использование MPD 5-й версии в качестве сервиса PPPoE на серверах FreeBSD.
Введение
Mpd — реализация multi-link PPP протокола для FreeBSD, основанная на netgraph(4). В его основу легли концепции скорости и гибкости настроек. Исходя из этих принципов настройка соединений происходит на пользовательском уровне (user land), в то время как передача данных является функцией ядра (kernel).
Mpd поддерживает множество типов соединений:
- модем — для соединения различных асинхронных последовательных соединений (asychronous serial connections), включая модем, ISDN адаптеры, и нуль-модемное соединение (null-modem). Mpd включает в себя скриптовый язык обработки данных основанный на событиях (event-driven scripting language) для установки типа модема, утановки соединения, авторизации и т.д.
- pptp — соединение точка-точка через Internet по протоколу PPTP (Point-to-Point Tunnelling Protocol). Данный протокол поддерживается большинством производителей операционных систем и оборудования.
- l2tp — соединение через Internet используя протокол 2-го уровня L2TP (Layer Two Tunnelling Protocol). L2TP является дальнейшей реализацией протокола PPTP и также поддерживается современными производителями операционных систем и оборудования.
- pppoe — соединение поверх Ethernet по протоколу PPP (PPP-over-Ethernet). Данный протокол в основном используется DSL провайдерами.
- tcp — тунелирование PPP сессии поверх TCP соединения. Кодирование фреймов (Frames) происходит по аналогии с асинхронным соедиениеним (asychronous serial connections).
- udp — туннелирование PPP сессии поверх UDP соединения. Каждый фрейм инкапсулируется в пакет с UDP датаграммой (UDP datagram packet).
- ng — соединение различных устройств, поддерживаемых netgraph. Netgraph — система сетевых модулей уровня ядра, поддерживает синхронные последовательные соединения (synchronous serial connections), Cisco HDLC, Frame Relay, и многие другие протоколы.
MPD поддерживает некоторые реализации субпротоколов PPP и их расширений, таких как:
- Multi-link PPP
- PAP, CHAP, MS-CHAP и EAP автроризация
- сжатие трафика (traffic compression (MPPC, Deflate, Predictor-1))
- криптование трафика (traffic encryption (MPPE, DESE, DESE-bis))
- IPCP и IPV6CP параметры согласования
В зависимости от конфигурационных правил и параметров соединения, mpd может функционировать как обычный PPP клиент/сервер (client/server) или передавать пакеты без изменения другому хосту, используя поддерживаемый тип соединения, обеспечивая при этом LAC/PAC/TSA функциональность для построения распределенных сетей.
Mpd включает в себя следующие дополнительлные возможности:
- поддержка IPv4 и IPv6.
- управление по Telnet и HTTP.
- различные типы авторизации и методы подсчета трафика (RADIUS, PAM, авторизация по скрипту, авторизация по файлу, …)
- подсчет трафика по NetFlow
- Network address translation (NAT)
- Dial-on-demand с выключением по неактивности (idle timeout)
- Динамическое управление соединением (Dynamic demand based link management (также известное как «rubber bandwidth»))
- Функциональный язык написания скриптов для асинхронных последовательных соединений (synchronous serial ports)
- Готовые скрипты для некоторых основных типов модемов и ISDN адаптеров
- Интерфейс, независимый от типа устройств
- Обширные возможности авторизации
Mpd изначально разрабатывался Whistle Communications, Inc. для ипользования во внутренней сети Whistle InterJet. В его основе лежит iij-ppp
user-mode PPP код, сильно изменившийся до сего дня. Домашняя страница разработчиков Mpd в настоящее время хостится на сайте sourceforge.net MPD Project Page
Отличия от 4 версии:
- Изменения структуры:
- Устранены статические линки (static link) — реализация зависимостей бандла (bundle). Линки выбирает бандл, используя параметры согласования на сетевой стадии (NETWORK phase). Этим достигается простота и полная работоспособность клиента и мультифункциональность сервера. Также это дает возможность реализовать боелее сложные LAC, PAC и TSA настройки, чем было до 5 версии.
- Внедрены шаблоны, основанные на динамическом создании линках/бандлах. Это позволило значительно сократить конфигурацию для серверов с большим количеством клиентов. Линк может автоматически создаваться входящим запросом (call request) от устройства или DoD/BoD запросом (Dial on Demand/Brake on Demand) из бандла. Бандл может автоматически создаваться при достижении сетевой стадии NETWORK phase.
- Для упрощения объединена конфигурация физического и канального уровня, разделенных с верии 4.2.
- Новые возможности:
- PAM авторизация.
- Добавлена поддержка динамического пула IP адресов.
- Добавлена поддержка внешних скриптов авторизации ‘ext-acct’ как альтернатива ‘radius-acct’.
- Изменения:
- Значительные изменения в конфигурации комманд. Следует прочитать мануал и примеры.
- FreeBSD 4.x и старые релизы DragonFly не поддерживаются.
Установка
Перед установкой следует решить для себя, как MPD будет загружать модули netgraph — через ядро или самостоятельно по мере необходимости.
Опции:
# netgraph options
options HZ=1000
options NETGRAPH
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET
options NETGRAPH_CISCO
options NETGRAPH_ECHO
options NETGRAPH_FRAME_RELAY
options NETGRAPH_HOLE
options NETGRAPH_KSOCKET
options NETGRAPH_LMI
options NETGRAPH_RFC1490
options NETGRAPH_TTY
options NETGRAPH_ASYNC
options NETGRAPH_BPF
options NETGRAPH_ETHER
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_L2TP
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_PPP
options NETGRAPH_PPTPGRE
options NETGRAPH_TEE
options NETGRAPH_UI
options NETGRAPH_VJC
Можно включать в конфиг ядра не все подряд, а только то, что нужно вам.
При установке на FreeBSD черед пэкедж или порт, mpd автоматически установится в /usr/local/sbin/mpd5 с компиллированием дефолтового набора поддерживаемых устройств. Для запуска mpd требуются несколько конфигурационных файлов, которые находятся в директории /usr/local/etc/mpd5. В этой директории вы можете найти примеры конфигурационных файлов.
Перед запуском mpd, нужно выполнить настроики следующих файлов:
-
mpd.conf
- Файл описывает одну или более конфигурации. При старте mpd через консоль указывается название конфигурации (которая может состоять из нескольких mpd комманд), которая и загружается. Если название не указывается, загружается конфигурация, описанная в разделе ‘default’. Каждая конфигурация определяет один или несколько бандлов (bundle), линков (link) или репитеров (repeater). Их описание начинаются с комманды
create
. Последующие комманды в конфигурации описывают различные уровни этих блоков.
-
mpd.secret
- Файл содержит пары логин-пароль. MPD просматривает файл при авторизации. Файл должен быть доступен для чтения только
root
.
-
mpd.script
- Файл содержит скрипты для модемных устройств.
Прикручиваем логи:
В файл /etc/syslog.conf добавляем:
!mpd
*.* /var/log/mpd.log
Создаем файл /var/log/mpd.log ручками командой:
touch /var/log/mpd.log
Задаем ротацию логов в файле /etc/newsyslog.conf
/var/log/mpd.log 600 7 100 * JC
Файл /etc/rc.conf должен содержать запись:
mpd_enable=»YES»
иначе система не даст запустить процесс mpd.
Старт MPD проходит через загрузчик /usr/local/etc/rc.d/mpd5 с опцией start.
/usr/local/etc/rc.d/mpd5 start
Стандартные опции {start|stop|restart}.
Системные настройки сервера
Есть некоторые моменты, которые следует учесть, если ваш сервер имеет большое количество соединений. Например, можно столкнуться с ситуацией, когда при выводе комманды ngctl list будет выдававаться No buffer space available. Чтобы этого избежать следует добавить в /boot/loader.conf:
kern.ipc.nmbclusters=16384
kern.ipc.maxsockets=16384
net.graph.maxalloc=2048
kern.maxusers=512
kern.ipc.maxpipekva=32000000
в /etc/sysctl.conf:
net.graph.maxdgram=128000
net.graph.recvspace=128000
Более подробную информацию об этих настройках можно найти здесь.
Если MPD работает на вланах (vlan), которые поднимаются из /etc/rc.local, я наблюдал такую картину. Процесс MPD стартует раньше, чем поднимаются вланы на интерфейсах. В итоге получается, что вроде как сервер рабоатет нормально, только никто подключиться не может. Из этой ситуации есть два выхода (напоминает: из любой ситуации всегда есть два выхода). Либо поднимать вланы через /etc/rc.conf, либо в загрузчик MPD /usr/local/etc/rc.d/mpd5 в начало добавляем строчку:
`/bin/sh /etc/rc.local`
Будьте осторожны, возможно через этот файл у вас прописывается маршрутизация или еще что-нибудь.
Убедитесь, что этот способ не затронет другие сервисы в вашей системе.
Файл конфига mpd.conf
В этой главе я постараюсь по подробнее рассмотреть файл своего рабочего конфига. Если вы мигрируете с более ранней версии MPD, конфигурационный файл придется переписывать. Напомню также, что в 5-ой версии отказались от mpd.links. Для начала полный листинг mpd.conf:
startup:
#configure mpd users
set user admin PASSWORD
#configure the console
set console self 127.0.0.1 5005
set console open
#configure the web server
set web self 0.0.0.0 5006
set web open
default:
load def_conf
def_conf:
create bundle template B
set iface up-script /usr/local/etc/mpd5/vpn_up_mpd.pl
set iface down-script /usr/local/etc/mpd5/vpn_down_mpd.pl
set bundle enable compression
set bundle enable encryption
set iface idle 0
set iface disable proxy-arp
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges aaa.bbb.ccc.ddd/32 0.0.0.0/0
set ipcp dns xxx.yyy.zzz.ddd qqq.www.eee.rrr
set ccp yes mppc
set mppc yes e40
set mppc yes e56
set mppc yes e128
set mppc yes stateless
set ecp disable dese-bis dese-old
log -echo -ipv6cp -radius -rep
load common
common:
create link template PPPoE pppoe
set link enable no-orig-auth
set link max-children 300
set auth max-logins 0
load pppoe
pppoe:
set link action bundle B
set link enable multilink
set link yes acfcomp protocomp
set link disable chap pap eap
set link enable chap chap-msv1 chap-msv2 chap-md5
set link keep-alive 10 60
#pppoe on bge1 with service name "service_name0"
create link template bge1_0 PPPoE
set pppoe iface bge1
set link enable incoming
set pppoe service service_name0
#pppoe on bge1 with service name "service_name1"
create link template bge1_1 PPPoE
set pppoe iface bge1
set link enable incoming
set pppoe service service_name1
#pppoe on bge2 with service name "service_name0"
create link template bge2_0 PPPoE
set pppoe iface bge2
set link enable incoming
set pppoe service service_name0
Примечание:
Все строки, кроме комментариев и ссылок (строки которые заканчиваются на «:»), в файле mpd.conf должны начинаться с отступа (пробела).
Блок
startup:
В этом блоке описываются юзеры для консольного и web интерфейса MPD, а также сами настройки консоли и web сервера. Если вам это не нужно, то конфигурация может начинаться с блока default, а блока startup может вообще не быть.
Блок default:
В сущности здесь описываются дефолтовые действия, в частности загрузить дефолтовый конфиг, который загружается если не указывать называние конфигурации при загрузке, как было описано выше.
Блок def_conf:
С этого блока начинается конфигурация самого сервера. Если в конфиг файле описаны несколько конфигураций, у каждой должно быть свое уникальное имя.
Далее будем описывать построчно:
create bundle template B — создаем бандл «B», он же будет выступать в качестве шаблона
set iface up-script /usr/local/etc/mpd5/vpn_up_mpd.pl
set iface down-script /usr/local/etc/mpd5/vpn_down_mpd.pl — цепляем
внешние скрипты на события создания и закрытия туннеля ppp.
MPD может передавать данные в качестве аргументов на события подключения и отключения пользователя к серверу:
$ARGV[0] — ngXX — номер тунеля
$ARGV[1] — inet
$ARGV[2] — aaa.bbb.ccc.ddd/32 — IP адрес сервера
$ARGV[3] — IP адрес, выданный пользователю
$ARGV[4] — логин пользователя
Эти аргументы вы можете использовать в perl скриптах vpn_up_mpd.pl и vpn_down_mpd.pl
set bundle enable compression — разрешаем CCP (Compression Control Protocol). Разрешаем только использование протокола, выбор протокола сжатия описан ниже.
set bundle enable encryption — разрешаем ECP (Encryption Control Protocol). Аналогично предыдущему пункту, выбор протокола сжатия описан ниже.
set iface idle 0 — таймаут в секундах неактивности, по истечении которого соединение принудительно разрывается со стороны сервера. «0» — не разрывать (стоит по дефолту).
set iface disable proxy-arp — запрещаем proxy-arp. Этот параметр полезен для имитации единой локалки для удаленных хостов.
set iface enable tcpmssfix — позволяет MPD управлять настройкой входящих и исходящих TCP SYN сегментов таким образом, чтобы не превышать MTU, допустимый на интерфейсе.
set ipcp yes vjcomp — разрешает компрессию заголовков (Van Jacobson TCP).
set ipcp ranges aaa.bbb.ccc.ddd/32 0.0.0.0/0 — пул IP адресов сервера/клиентов
set ipcp dns xxx.yyy.zzz.ddd qqq.www.eee.rrr — dns сервера, отдаваемые клиенту
set ccp yes mppc — включаем MPPC субпротокол сжатия/шифрования
set mppc yes e40 — включаем 40-bit MPPE шифрование
set mppc yes e56 — включаем 56-bit MPPE шифрование
set mppc yes e128 — включаем 128-bit MPPE шифрование
set mppc yes stateless — настройка, полезная при пакетлоссах (потерях)
log -echo -ipv6cp -radius -rep — уровни логгирования
load common — загрузка другого блока с именем common
Переходим к блоку common:
create link template PPPoE pppoe — создаем линк, он же будет выступать в качестве шаблона
set link enable no-orig-auth — Обычно при использовании PAP или CHAP авторизация происходит в начале соединения. Эта опция временно выключает данное требование в случае если наш сервер является единственным в сети, а клиенту вдруг не нравится запрос от сервера на авторизацию.
set link max-children 300 — максимальное количество соединений для этого шаблона
load pppoe — подгружаем следующий блок
set link action bundle B — накладываем на линк настройки бандла
set link enable multilink — опция позволяет создавать множественное подключение PPP. Но в данном случае опция позволяет пропускать большие пакеты (больше MTU) фрагментами. Что-то вроде фрагментации пакетов.
set link yes acfcomp protocomp — сжатие адресного поля, поля заголовков и поля протокола. Для экономии нескольких байтов во фрейме.
set link disable chap pap eap — запрещаем данные протоколы проверки пароля
set link enable chap-msv1 chap-msv2 chap-md5 — разрешаем протоколы проверки пароля (необходимы для возможности включения шифрования (Microsoft)).
set link keep-alive 10 60 — разрешает LCP пакеты. По умолчанию 5 40. Можно отказаться от этой опции, поставив первое значение в «0».
create link template bge1_0 PPPoE — создаем линк bge1_0 и накладываем настройки шаблона PPPoE
set pppoe iface bge1 — задаем интерфейс, где будет поднят наш сервис. Может быть как физическим интерфейсом, так и вланом (vlan).
set link enable incoming — разрешаем входящие соединения
set pppoe service service_name0 — поднимаем сервис-нейм (service-name) на заданном интерфейсе
Если у вас множество интерфейсов, то достаточно дописывать в конец конфига последний видоизмененный блок, как показано в общем листинге.
Заключение
Из плюсов использования MPD в качестве PPPoE сервера хочу отметить меньшую загрузку CPU, особенно в сочетании с использованием поллинга (polling).
Для этого нужно собрать ядро с поддержкой поллинга:
options DEVICE_POLLING
options HZ=1000
После этого можно включить поллинг через /etc/sysctl.conf:
kern.polling.enable=1
kern.polling.user_frac=10
Последнее означает что система будет делить ресурсы CPU в соотношении userland/kernel как 10/90. По умолчанию это значение 50/50.
Конфиг работает на версиях порта mpd-5.0, mpd-5.1. С версией mpd-5.1_1 наблюдались проблемы на серверной стороне. При невыясненных обстоятельствах запускался второй процесс mpd5, который грузил CPU в 100%, а пользователи не могли подключиться. Пришлось откатываться на 5.1.
Ссылки:
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: Folio