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, и многие другие протоколы.
* 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 параметры согласования
* 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 адаптеров
* Интерфейс, независимый от типа устройств
* Обширные возможности авторизации
* управление по 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 версии:
* Изменения структуры:
o Устранены статические линки (static link) – реализация зависимостей бандла (bundle). Линки выбирает бандл, используя параметры согласования на сетевой стадии (NETWORK phase). Этим достигается простота и полная работоспособность клиента и мультифункциональность сервера. Также это дает возможность реализовать боелее сложные LAC, PAC и TSA настройки, чем было до 5 версии.
o Внедрены шаблоны, основанные на динамическом создании линках/бандлах. Это позволило значительно сократить конфигурацию для серверов с большим количеством клиентов. Линк может автоматически создаваться входящим запросом (call request) от устройства или DoD/BoD запросом (Dial on Demand/Brake on Demand) из бандла. Бандл может автоматически создаваться при достижении сетевой стадии NETWORK phase.
o Для упрощения объединена конфигурация физического и канального уровня, разделенных с верии 4.2.
* Новые возможности:
o PAM авторизация.
o Добавлена поддержка динамического пула IP адресов.
o Добавлена поддержка внешних скриптов авторизации ‘ext-acct’ как альтернатива ‘radius-acct’.
* Изменения:
o Значительные изменения в конфигурации комманд. Следует прочитать мануал и примеры.
o FreeBSD 4.x и старые релизы DragonFly не поддерживаются.
o Устранены статические линки (static link) – реализация зависимостей бандла (bundle). Линки выбирает бандл, используя параметры согласования на сетевой стадии (NETWORK phase). Этим достигается простота и полная работоспособность клиента и мультифункциональность сервера. Также это дает возможность реализовать боелее сложные LAC, PAC и TSA настройки, чем было до 5 версии.
o Внедрены шаблоны, основанные на динамическом создании линках/бандлах. Это позволило значительно сократить конфигурацию для серверов с большим количеством клиентов. Линк может автоматически создаваться входящим запросом (call request) от устройства или DoD/BoD запросом (Dial on Demand/Brake on Demand) из бандла. Бандл может автоматически создаваться при достижении сетевой стадии NETWORK phase.
o Для упрощения объединена конфигурация физического и канального уровня, разделенных с верии 4.2.
* Новые возможности:
o PAM авторизация.
o Добавлена поддержка динамического пула IP адресов.
o Добавлена поддержка внешних скриптов авторизации ‘ext-acct’ как альтернатива ‘radius-acct’.
* Изменения:
o Значительные изменения в конфигурации комманд. Следует прочитать мануал и примеры.
o 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
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. В этой директории вы можете найти примеры конфигурационных файлов.
При установке на 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
Файл содержит скрипты для модемных устройств.
Файл описывает одну или более конфигурации. При старте mpd через консоль указывается название конфигурации (которая может состоять из нескольких mpd комманд), которая и загружается. Если название не указывается, загружается конфигурация, описанная в разделе ‘default’. Каждая конфигурация определяет один или несколько бандлов (bundle), линков (link) или репитеров (repeater). Их описание начинаются с комманды create. Последующие комманды в конфигурации описывают различные уровни этих блоков.
mpd.secret
Файл содержит пары логин-пароль. MPD просматривает файл при авторизации. Файл должен быть доступен для чтения только root.
mpd.script
Файл содержит скрипты для модемных устройств.
Прикручиваем логи:
В файл /etc/syslog.conf добавляем:
!mpd
*.* /var/log/mpd.log
!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
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
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
#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:
Блок 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.
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] – логин пользователя
$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
options HZ=1000
После этого можно включить поллинг через /etc/sysctl.conf:
kern.polling.enable=1
kern.polling.user_frac=10
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.
Комментариев нет:
Отправить комментарий