====== PPPD IPv4 zone counters ====== ===== Контакты ===== Чтоб не мучать ~Asmodeus~, вопросы и пожелания направляйте сразу мне: * stas at onlineua.net * 226774405 ===== Для чего ===== Патч создавался для подсчёта траффика, проходящего через pppd по зонам IPv4 адресов: * 0 - зона по умолчанию. В эту зону попадает весь траффик, который не попал в другие зоны. Данная зона не заполняется IP-диапазонами. * 1,... - зоны в которые попадает траффик, соответсвующий внесённым диапазонам. ===== Установка ===== Для работы необходимы: - Linux (sources) - pppd-2.4.2 (sources) - 2.4.3 у меня чего-то не заработал (без патча), если кто заведет, пишите. - Патч для linux kernel и pppd (брать с [[http://sourceforge.net/project/showfiles.php?group_id=115151&package_id=194366|SourceFourge]]). - Навыки по конфигурированию ядра Linux и наложению патчей. ==== Конфигурирование и сборка ядра Linux ==== - Распакуйте ядро. Обычно в /usr/src/ - Наложите патч (linux-2.6.16-ipv4zones.patch) - Если не нужна отладочная информация (на рабочем сервере её очень много - одна строка на каждый IP пакет на каждом из ppp), замените в drivers/net/ppp_generic.c ''# define lib_log_trace(fmt, args...) printk(KERN_INFO fmt, args)'' на '' #define lib_log_trace(fmt, args...)'' - Запустите конфигуратор (make menuconfig или другой) - Зайдите в Network device support. PPP (point-to-point protocol) support должен быть включен кому как больше нравится. В нём есть подпункт PPP IPv4 zone counters - включите, под ним есть PPP IPv4 zones number, по умолчанию 4. Если поменяете, не забудьте поправить потом в PPPD соответственно. - Выйдите из конфигуратора и запустите make bzImage modules etc. ==== Конфигурирование и сборка PPPD ==== - Распакуйте pppd, наложите патчи (mppe-mppc, etc) - Наложите pppd-2.4.2-ipv4zones.patch - Поправьте CONFIG_PPP_IPV4ZONES_COUNT если поменяли в ядре. Тут ничего не могу сделать, pppd использует локальную копию ppp_defs.h, не смотрит чего есть в kernel. - Если собираете сами, проверьте, чтобы были включены все необходимые plugins: pppd/plugins/Makefile.linux - Соберите и поставьте pppd - Скопируйте dictionary.pppd в sysconfdir radiusd и включите его в dictionary. ===== Использование ===== ==== Конфигурирование IPv4 зон для подсчёта траффика ==== После загрузки модуля ppp_generic или загрузки ядра (если поддержка PPP вкомпилена в ядро) должен появится файл ''/proc/ipv4zones''. Если его нет, значит либо ядро собрано без патча, либо не загружен модуль. Данный файл - канал для конфигурирования зон. Для конфигурирования используются бинарные пакеты, следовательно необходима утилита. Утилиту брать на SourceForge, там же где и всё остальное. Для сборки и работы необходима библиотека libxml2, правильно прописанная в pkgconfig. Сборка осуществляется командой make :) В каталоге с утилитой лежит config.xml - пример конфигурации. Его нужно подправить под конкретные нужды. Для изменения конфигурации зон необходимо выполнить: ''./config_parser config.xml'' !!! Внимание !!! Сейчас пока config_parser выводит много отладочной информации в stdout, ошибки выводятся в stderr. Но в любом случае просмотрите чего написал config_parser - вдруг там будет сообщение об ошибке? ==== Конфигурирование ABillS ==== / System configuration/ NAS/ Выставить тип leppd:Linux PPPD IPv4 zone counters PPPD теперь будет дополнительно отправлять такие аттрибуты по accounting types Stop и Interim-Update (все счётчики относительно интерфейса): * ''PPPD-Output-Packets-Zones-0'' - количество пакетов, которые pppd отправил пользователю. * ''PPPD-Input-Packets-Zones-0'' - количество пакетов, которые pppd принял от пользователя. * ''PPPD-Output-Octets-Zones-0'' - количество байт, которые pppd отправил пользователю. * ''PPPD-Input-Octets-Zones-0'' - количество байт, которые pppd принял от пользователя. и также для остальных зон. Если зон больше 4-х, нужно поправить dictionary.pppd и прописать дополнительные зоны. !!! Внимание !!! Если у вас много зон (зон тарификации, а не разных IP адресов, которые вы включаете в зоны), лучше пользуйтесь Ipn - он предназначен именно для таких случаев. ==== Пример аттрибутов, приходящих от pppd к freeradius ==== rad_recv: Accounting-Request packet from host 192.168.254.2:2048, id=189, length=316 Acct-Session-Id = "4490620615B3" User-Name = "stas" Acct-Status-Type = Interim-Update Service-Type = Framed-User Framed-Protocol = PPP Acct-Authentic = RADIUS Acct-Session-Time = 2225 Acct-Output-Octets = 222 Acct-Input-Octets = 894 Acct-Output-Packets = 5 Acct-Input-Packets = 13 PPPD-Output-Packets-Zones-0 = 0 PPPD-Input-Packets-Zones-0 = 4 PPPD-Output-Octets-Zones-0 = 0 PPPD-Input-Octets-Zones-0 = 328 PPPD-Output-Packets-Zones-1 = 2 PPPD-Input-Packets-Zones-1 = 6 PPPD-Output-Octets-Zones-1 = 168 PPPD-Input-Octets-Zones-1 = 492 PPPD-Output-Packets-Zones-2 = 0 PPPD-Input-Packets-Zones-2 = 0 PPPD-Output-Octets-Zones-2 = 0 PPPD-Input-Octets-Zones-2 = 0 PPPD-Output-Packets-Zones-3 = 0 PPPD-Input-Packets-Zones-3 = 0 PPPD-Output-Octets-Zones-3 = 0 PPPD-Input-Octets-Zones-3 = 0 NAS-Port-Type = Async Framed-IP-Address = 192.168.253.1 NAS-IP-Address = 127.0.0.1 NAS-Port = 0 Acct-Delay-Time = 0 rad_recv: Accounting-Request packet from host 192.168.254.2:2048, id=190, length=316 Acct-Session-Id = "4490620615B3" User-Name = "stas" Acct-Status-Type = Stop Service-Type = Framed-User Framed-Protocol = PPP Acct-Authentic = RADIUS Acct-Session-Time = 2263 Acct-Output-Octets = 222 Acct-Input-Octets = 894 Acct-Output-Packets = 5 Acct-Input-Packets = 13 PPPD-Output-Packets-Zones-0 = 0 PPPD-Input-Packets-Zones-0 = 4 PPPD-Output-Octets-Zones-0 = 0 PPPD-Input-Octets-Zones-0 = 328 PPPD-Output-Packets-Zones-1 = 0x00000002 PPPD-Input-Packets-Zones-1 = 0x00000006 PPPD-Output-Octets-Zones-1 = 0x000000a8 PPPD-Input-Octets-Zones-1 = 0x000001ec PPPD-Output-Packets-Zones-2 = 0 PPPD-Input-Packets-Zones-2 = 0 PPPD-Output-Octets-Zones-2 = 0 PPPD-Input-Octets-Zones-2 = 0 PPPD-Output-Packets-Zones-3 = 0 PPPD-Input-Packets-Zones-3 = 0 PPPD-Output-Octets-Zones-3 = 0 PPPD-Input-Octets-Zones-3 = 0 NAS-Port-Type = Async Framed-IP-Address = 192.168.253.1 NAS-IP-Address = 127.0.0.1 NAS-Port = 0 Acct-Delay-Time = 0 ===== TODO ===== - !!! Конфигуратор. Надо сделать интерфейс (ядро + программа или ядро + функция pppd) для задания зон без пересборки ядра и перезагрузки модуля. - ??? Per-PPP zones. Сейчас зоны общие для всех ppp. - ??? Конфигуратор через радиус. Задание зон при авторизации pppd на радиус-сервере. - ?!? Переход с отстороненного объектного интерфейса на KOBJECTs. - ?!! Лимит сессии по траффику в зоне. - !!! Переход на rbtree.c - в lib оказывается есть rbtree.c, а я прозевал :( - !!! Добавить Acct-Input-Gigawords и Acct-Output-Gigawords - !!! Перейти с передачи статистики по зонам в основном пакете к отдельному ioctl - !!! Переписать конфигуратор на основе user-space списков, убрать , так как в kernel 2.4 list наружу не экспортируется. Скорее всего на C++ std::vector. ==== Ideas ==== Возможно, лучшим выходом будет использование VSA - Vendor Specific Attributes. Например, так: RADIUS пакет с VSA (в текстовом или бинарном виде) * От RADIUS к NAS для задания зон будут отправляться такие атрибуты (внутри Auth-Response пакета): * Area=:: * Area-Speed-Limit=:: * От RADIUS к NAS для ограничения будут отправляться такие атрибуты (внутри Auth-Response и/или Accounting-Response пакета): * Area-Session-Octets-Limit=: * Area-Octets-Direction=: * От NAS к RADIUS будут ходить атрибуты (внутри Accounting-Request пакета): * Incoming-Area=:::: * Outgoing-Area=:::: Встретил упоминание о POD - Packet of Disconnect. Надо посмотреть, чего можно вытянуть из [[http://rfc.sunsite.dk/rfc/rfc3576.html|RFC 3576 - Dynamic Authorization Extensions to Remote Authentication Dial In User Service (RADIUS)]] ===== ChangeLog ===== === lepppd 0.1.2 === * Исправлено неверное определение зоны при работе pppoe-server через pppoe модуль ядра (Input записывался в зону 0). * Исправлен неверный подсчёт input traffic по всем зонам (терялось 2 байта на каждый пакет). * Почищен вывод информации (разбивка по типу). === Configurator 0.1.1 === * Переписан конфигуратор на основе std::vector. Сейчас для сборки необходим g++. * Исправлена заглушка при получении номера зоны из config.xml. Сейчас используется atoul, без проверки на ошибки разбора. === lepppd 0.1.1 === * Исправлена ошибка в размере копируемого блока. * Максимально унифицированы патчи для linux 2.4.32 и 2.6.16. * Конфигуратор без изменений, брать версию 0.1.0. === Changes between 0.0.1 and 0.1.0 === * Выброшены файлы lib_rbtree.[ch] - осуществлён переход на Red-Black Tree который есть в ядре. * Добавлен конфигуратор (ppp-ipv4zones-0.1.0.tar.bz2).