Сага о биллинге, или Считаем трафик на FreeBSD (ng_ipacct + perl+ MySQL). (Данная статья была опубликована во 2 и 3 номерах за 2005 год журнала 'Системный администратор' http..
Биллинг на Free. BSD: пишем сами, используя PHP, trafd и My. SQL: :Журнал СА 8. Александр Чагадаев. Биллинг на Free. BSD: пишем сами, используя PHP, trafd и My. SQLЕсли пользователи жалуются, что Интернет «тормозит», а начальство ругается, что счета от провайдера слишком большие, покупка готового биллинга – не единственный выход.
В настоящее время большинство юридических лиц – пользователей Интернета – оплачивают услуги исходя из количества принятого (и/или переданного) трафика. Для небольших организаций плата за трафик не является такой уж незначительной, и остро встаёт вопрос учета трафика, израсходованного конкретным пользователем, и целей, на которые этот трафик был потрачен. Проще говоря, руководству организации нужна информация о посещённых сайтах в случае использования протокола http, скачанных файлах в случае использования протокола ftp и т.
Newsgroups: http:// Date: Mon, 14:31:37 +0000 (UTC) Subject: Биллинг для домашней сети, FreeBSD + FreeNIBS + Mpd .
Причём некоторых сотрудников бывает сложно убедить, что большой трафик – результат их собственных действий, если не предоставить подробного списка ресурсов с данными о трафике. По тем или иным причинам (забота организации об информационной безопасности, дефицит реальных IP- адресов у провайдера) подключение внутренней ЛВС организации к Интернету обычно происходит через роутер, установленный на границе между внутренней ЛВС организации и Интернетом. В качестве роутера может использоваться ПК с 2 сетевыми картами и специальным образом настроенной (включён сервис NAT) сетевой ОС (Free. BSD, Linux, Windows, Solaris и т. Или же это может быть специально разработанное устройство (нередко также использующее одну из перечисленных выше ОС). Возможны и другие варианты, я рассмотрю наиболее распространенный. В своё время передо мной была именно такая задача – учёт и ограничение трафика.
- 0. Предыстория Около двух лет назад перед сравнительно небольшой, но развивающейся сетью, в которой я, волею судеб, оказался.
- Распространяется бесплатно и с исходными кодами при соблюдении соглашения; поддерживаемые операционные системы: Windows, Linux, FreeBSD.
- . 0. Предыстория Около двух лет назад перед сравнительно небольшой, но развивающейся сетью, в которой я, волею судеб, оказался .
- Биллинг на FreeBSD: пишем сами, используя PHP, trafd и MySQL. роутера использовался ПК с 2 сетевыми картами и установленной ОС FreeBSD.
В качестве роутера использовался ПК с 2 сетевыми картами и установленной ОС Free. BSD. Несмотря на кажущуюся распространённость – почти банальность – задачи, полностью устраивающее готовое решение найти не удалось. Рассматривались только бесплатные системы.) В результате было принято решение писать собственную биллинговую систему. Используемое ПОДля сбора трафика используется BPFT (http: //bpft.
Установку БД MySQL под FreeBSD 10 производится через pkg: pkg install ln -s /usr/local/ billing /phpclient/admin /usr/local/www/apache24/data/admin ln -s. По адресу http:// для свободного скачивания и использования выложен образ настроенной FreeBSD 5.4 с установленным биллингом NoDeny..
Система построена на основе библиотеки libpcap и использует механизм BPF (Berkley Packet Filter «pseudo- device») для захвата IP- трафика. При выборе СУБД я выбирал между My. SQL и Firebird. За Firebird было: Против: работа текущей на тот момент версии (1. На сервере этот демон не использовался и поднимать его только ради биллинга не хотелось; поддержка транзакций, обеспечивающих большую надёжность в ущерб скорости, что для нашей системы совершенно неоправданно. В конечном счёте, я остановился на My. SQL (4- я или 5- я версии, но, думаю, будет работать и с 3- й).
Язык программирования для общения с базой данных – PHP, за C- подобный синтаксис, возможность использования программ на нём как просто в системе, так и внутри HTML- страниц. Система учёта IP- трафика.
Функционально в системе биллинга можно условно выделить три модуля: учёт трафика, вывод информации об учтённом трафике и модуль разрешения/запрещения пользования Интернетом. Поскольку данные в таблицы пишет первый из этих модулей, начнём раздел с описания структуры таблиц. Структура таблиц. Создадим базу данных с именем traffic. В базе создадим две таблицы: Ip – данные о IP- адресе и Log – данные о трафике.
Назначение полей этих таблиц понятно из их названий. Также создадим двух пользователей, имеющих право подсоединяться к базе данных только с локального компьютера: insert_user – пользователь, который имеет право только добавлять данные в базу и view_user – пользователь, который имеет право только читать данные из базы. Пароли, конечно же, только для статьи – при инсталляции системы рекомендуется сгенерировать более стойкие к взлому.
Файл create_db_& _users_& _tables. CREATE DATABASE traffic DEFAULT CHARACTER SET koi. DEFAULT COLLATE koi. GRANT INSERT ON traffic.* TO 'insert_user'@'localhost' IDENTIFIED BY '1. GRANT SELECT ON traffic.* TO 'view_user'@'localhost' IDENTIFIED BY '9. USE traffic; CREATE TABLE Ip ( IP VARCHAR(1.
NOT NULL PRIMARY KEY, QUOTA INTEGER, PCNAME VARCHAR(1. FNAME VARCHAR(1.
MNAME VARCHAR(1. LNAME VARCHAR(1. EMAIL VARCHAR(2. INDEX(IP)) ENGINE = My. ISAM; CREATE TABLE Log ( NN INTEGER(1. UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, IP_FROM VARCHAR(1. NOT NULL, IP_TO VARCHAR(1.
NOT NULL, SRC_PORT VARCHAR(5) NOT NULL, DEST_PORT VARCHAR(5) NOT NULL, PROTO VARCHAR(4) NOT NULL, DATA_BYTES INTEGER NOT NULL, ALL_BYTES INTEGER NOT NULL, FIRST_TIME TIMESTAMP NOT NULL, LAST_TIME TIMESTAMP NOT NULL, INDEX(IP_FROM), INDEX(IP_TO), INDEX(SRC_PORT), INDEX(DEST_PORT), INDEX(PROTO), INDEX(ALL_BYTES), INDEX(FIRST_TIME), INDEX(IP_FROM,FIRST_TIME), INDEX(IP_TO,FIRST_TIME)) ENGINE = My. ISAM ROW_FORMAT = fixed; Как видно из скрипта create_db_& _users_& _tables. My. ISAM, который обеспечивает большую скорость работы за счёт отсутствия транзакций.
Параметр ROW_FORMAT определяет, каким образом должны храниться строки в файле базы данных. Задавая этому параметру значения fixed, мы предписываем My. SQL под каждую переменную типа VARCHAR выделять не реально занимаемое её значением место, а максимально возможное. Например, если мы при создании базы определили поле IP_TO как VARCHAR(1.
Хотя из- за этого файл базы данных будет занимать больше места, нам в этой ситуации важнее, что операции с базой будут проходить несколько быстрее. Настройка ОС Free. BSDЯдро системы Free. BSD должно включать поддержку pseudo- device BPF, для чего в файле конфигурации adc- kernel должна присутствовать строка: # The `bpf" device enables the Berkeley Packet Filter. Berkeley packet filter. Я рекомендовал бы устанавливать trafd, My.
SQL, PHP и прочее программное обеспечение из портов (как и любой софт под Free. BSD, кроме cvsup). Примечание: порт net/cvsup зависит от системы Modula- 3, которой потребуется существенный объем времени и пространства на диске для загрузки и установки, поэтому обычно автор устанавливает cvsup из пакетов.
Настройка trafd. Настройка основных параметров trafd осуществляется в файле rc. Free. BSD. trafd_enable="YES"trafd_ifaces="rl.
Полезна возможность пакета программ trafd, позволяющая существенно сэкономить усилия при написании биллинга, который в качестве анализатора трафика использует trafd – не надо писать свой парсер логов. В состав пакета программ trafd входит утилита traflog, которая может экспортировать данные по трафику в любой текстовой файл в соответствии с форматом, заданным в её конфигурационном файле – traflog. В traflog. format был прописан формат sql- команды insert для нашей базы.
Log (ip_from,ip_to,src_port, dest_port,proto,data_bytes,all_bytes,first_time, last_time) values("%s","to: ""%s","sport: ""%s","dport: ""%s","proto: ""%s","bytes: "%ld, "psize: "%ld, "ftime: ""%y- %m- %d %T","ltime: ""%y- %m- %d %T"); "}; Командные файлы. Были написаны два командных файла для связки trafd и My. SQL: trafd_dump. sh и trafd_to_mysql.
Краткое описание выполняемых действий: trafd_dump. Информация об успехе или неуспехе подачи команды сохраняется в syslogd. Файл trafd_dump. sh#!/bin/sh. INT `cat ${trafd_pid}.${iface}` logger - t trafd_dump "signaling trafd on ${iface} dump to file" else logger - t trafd_dump "trafd on ${iface}: file ${c_pid} not found (trafd don't listen on ${iface}?)" fidone. Trafd_to_mysql. sh импортирует данные по трафику на всех прослушиваемых trafd интерфейсах из временных файлов, созданных trafd_dump.
My. SQL. Информация об успехе или неуспехе подачи команды сохраняется в syslogd. Файл trafd_to_mysql. Эти два файла должны регулярно запускаться. Насколько регулярно – зависит от интенсивности трафика на роутере.
Для наших условий нормально делать это каждые пять минут. Прописываем в /etc/crontab: */5 * * * * root /usr/home/root/sbin/trafd_dump. Веб- интерфейс системы учёта трафика. Просмотр статистики – как пользователем, так и администратором – производится через веб- интерфейс (выполнен в виде HTML- страниц с кодом на языке PHP внутри) любым браузером.
При открытии в браузере ресурса, который размещён по назначенному администратором для страницы статистики адресу, пользователь сразу видит имеющуюся в базе данных информацию об IP- адресе, с которого он зашел на страницу статистики (см. Рисунок 1. Интерфейс биллинговой системы, каким его видит пользователь. Администратор открывает страницу admin. Защита интерфейса администратора от несанкционированного доступа может быть реализована различными способами.
Например, если в качестве веб- сервера используется Apache, можно воспользоваться файлами . Экран администратора разделён на две части: в верхней – меню, в нижней – таблица с результатами запроса. Сразу при открытии показывается таблица трафика за сегодняшний день и за текущий месяц (см. Рисунок 2. Интерфейс администратора сразу после загрузки страницы. В выпадающих списках «Период» задаётся период, по которому мы хотим получить информацию.
Кнопка «Список IP- адресов сети + входящий и исходящий трафик» – выводит полную информацию обо всех имеющихся в базе данных IP- адресах внутренней сети, а также количество входящего и исходящего трафика для каждого из них за указанный период (см. Рисунок 3. Список, выдаваемый в результате нажатия на кнопку «Список IP- адресов сети + входящий и исходящий трафик»Кнопка «Подробная для IP- адреса» – выводит список всех входящих и исходящих соединений для IP- адреса, заданного в поле ввода с таким же названием.
По сути, это просто дамп базы данных с отбором по заданному IP- адресу. Зелёным цветом обозначен входящий трафик, желтым – исходящий (см. Рисунок 4. Подробная статистика для IP- адреса.
Кнопка «Суммарная – по хостам – для IP- адреса» – выводит список всех входящих и исходящих соединений для IP- адреса, заданного в поле ввода с таким же названием. При этом для каждого IP- адреса из списка считается суммарный трафик, и таблица сортируется по убыванию.