TrafdStat Сбор статистики интернет по протоколам и/или IP с web интерфейсом

Очередная “хотелка” руководства вылилась в следующую статью.

Задача: знать сколько интернета используется на почту (у меня свой почтовый сервер), синхронизацию времени, DNS и прочие системные службы. Так как trafd предоставляет гораздо больше данных получилась универсальная статистика по любому количеству интерфейсов (сетевых карт) с детализацией по портам, IP, протоколам, датам и часам.

Лично мне больше нравиться, когда статистика храниться долго и смотриться через браузер.  Ничего 100% подходящего в интернете я не нашел, хотя может просто плохо искал :) , поэтому решил быстренько накидать вебморду сам. В результате, как всегда,  получилось не очень быстренько, зато вроде симпатично.

скачать trafdstat-1.0.3 (648)

и еще скачать trafdstst-1.0.3.patch.tar.gz (372)

Порядок установки и настройки:

1.  Ставим trafd.

Программа под FreeBSD, и хотя по заявлениям людей легко компилируется под Linux~ы еще с 2001 года, у меня поставить получилось только последнюю (на момент написания статьи) trafd-3.0.3-b7 взятую на сайте разработчиков http://trafd.sourceforge.net/ . Все предыдущие версии либо не компилировались, либо бинарики категорически отказывались запускаться.

Пакет прилагается, заходим в каталог trafd-3.0.3-b7, для корректной компиляции под линь даем команду

make -f Makefile.linux all install install-misc

запуск демона /usr/local/bin/trafctl start прописал в rc.local т.к. как демон прописываться оно не захотело, разбираться лениво было :)

еще сильно рекомендую в крон прописать следующее */5 * * * * /usr/local/bin/trafctl dump каждые 5 минут собранная статистика будет из оперативной памяти сбрасываться на винт и восстановиться в случае перезапуска сервера или демона.

2. Настраиваем MySQL.

Работу с MySQL описывать не буду, можно все сделать запросами, можно использовать что-то графическое - дело вкуса. Информации на эту тему сейчас вагон и маленькая тележка ;) .

Создадим пользователя trafd с паролем trafd, который является админом опять же создаваемой базы trafd. В этой базе создадим две таблички:

stat_period # хранит периоды за которые есть статистика в формате YYYYMM
y_month int(6)

и

iface_name # описание интерфейсов
iface varchar(5) # имя интерфейса к примеру eth0
ip varchar(16) # ip интерфейса кто не знает запустите ifconfig
descr varchar(100) # текстровое описание интерфейса

Обязательно заполните таблицу iface_name данными.  В stat_period ничего заносить не надо - само занесется :) .

3. Сделаем парсер логов

В /var/trafd (дефолтный каталог, менять не стал) создаем папку log и в ней создаем файл logparser. pl не забываем сделать его выполняемым ;) .

Текст приводить не буду - он есть в архиве. Парсер НЕ ЧИТАЕ конфигурационный файл, поэтому ОБЯЗАТЕЛЬНО проверьте параметры подключения к MySQL открыв его в любом текстовом редакторе.

Еще один момент, который может пригодиться: парсер оставляет текстовые логи, что позволяет его запускать и в ручном режиме. Данные в базе при этом не дублируются, а обновляются.

4.  Настраиваем логирование.

Статистику будем собирать ежечасно. По предварительным расчетам если статистику детализировать до часа - годовая база на два интерфейса будет весить порядка гектара. Меня это устраивает.

В каталоге /usr/local/bin (демон ставиться туда, ну я туда :) ) создадим запускаемый файлик traf2log следующего содержания (тоже имеется в архиве):

#!/bin/sh

# Сохраняем лог в бинарик
/usr/local/bin/trafctl save && wait;

# вычисляем дату для имени каталога и файла
dat=`date ‘+%Y%m%d%H’`;
pdat=`date ‘+%Y%m%d’`;
dirf=/var/trafd/log/$pdat;
f=$dirf/$dat;
# Пытаемся создать эту самую директорию на случай если это первый запуск
# или произошла смена месяца (года)
mkdir -p $dirf;

# Не всегда успевают записаться логи в бинариках
# тупо добавил задержку
sleep 10

# каждый час будем создавать текстовый файлик со статистикой из бинарного лога
/usr/local/bin/traflog -n -a -i eth0 > $f.eth0 && wait;
/usr/local/bin/traflog -n -a -i eth1 > $f.eth1 && wait;

# ротируем бинарный лог то-бы не дублировать данные
/usr/local/bin/trafctl rotate;

# Копирование логов в базу.
/var/trafd/log/logparser.pl $dat eth0;
/var/trafd/log/logparser.pl $dat eth1

и создадим на него ссылку в /etc/cron.hourly либо любым другим способом заставим его выполняться в начале каждого часа.

5. Настраиваем Apahe

Для начала в файлик httpd.conf (у меня он лежит в /etc/httpd/conf/) добавим вот такие волшебные строчки:

<Directory “путь_куда_положим_trafdstat/trafdstat”>
AddHandler cgi-script .cgi
AllowOverride All
</Directory>

Не забываем дать команду /etc/init.d/httpd reload .

Ну и скопируем папку со скриптами из архива куда душа просит :) . Открываем браузер и наслаждаемся.

Сейчас немного дополнительной информации. Ограничусь конфигом и передаваемыми параметрами . Мне кажется возможности вебморды будут понятны.

#!/usr/bin/perl
# конфигурационный файл

# подключение к mysql
$basename=”trafd”;
$soket=”/var/lib/mysql/mysql.sock”;
$username=”trafd”;
$pass=”trafd”;

# интерфейс (сетевая карта) отображаемый по умолчанию
$def_iface=”eth1″;

#режим по умолчанию
$def_mode=1;

# не показывать строки меньше Кбайт (для часового отчета используется значение в байтах)
$show_min=1024;
# показывать не больше стольких строк
$show_str=30;

# описание портов в формате
# service-name  port/protocol  [aliases ...]   [# comment]
# вообще на всех дистрибутивах которые смотрел лежит тут, но вдруг у кого не так :)
$port_file=”/etc/services”;

параметры передаваемые по GET (естественно иногда передаются не все):

iface - имя интерфейса
mode - режим в формате n[a[b]] если заглянуть в файлик body.cgi - то все будет понятным
year - год в формате YYYY
month - месяц MM
det - детально по порту в формате port_to|port_from|protocol
det2 - детализация по IP nnn.nnn.nnn.nnn
day - число месяца DD
hour - час HH

Собственно все.

Буду рад услышать отзывы и/или предложения по доработке (найденным ошибкам).

В версии 1.0.4 планируется сделать:
1. Таблицу с доменными именами IP адресов для их разыменования.

14 Комментариев

АнонимАпрель 10, 2009 в 17:24

Много опечаток.

РусланАпрель 10, 2009 в 19:57

Аналог для linux
http://www.sqweek.com/sqweek/index.php?p=1

adcАпрель 10, 2009 в 22:01

Я делал похожую систему - http://a-d-c.ru/adc_billing.htm

zoranАпрель 10, 2009 в 22:49

>Много опечаток.
не то слово… просто ахтунг, такое читать без допинга невозможно. Спеллчекеры нынче не моде и “аффтары” пишут видимо в mc.

“Приграмма под FreeBSD”… 5 баллов :)

nopeАпрель 11, 2009 в 03:10

Хорошо было бы дамп пустой базы закинуть. Ставить было бы проще намного :)

nopeАпрель 11, 2009 в 03:13

И еще вопрос, требуеца ли promiscuous mode при сборе статистики?

nopeАпрель 11, 2009 в 04:40

[root@blabla /]# /usr/local/bin/trafctl start
/usr/local/bin/trafd: symbol lookup error: /usr/local/bin/trafd: undefined symbol: eproto_db
/usr/local/bin/trafd: symbol lookup error: /usr/local/bin/trafd: undefined symbol: eproto_db
ОС: RHEL 5.1

nopeАпрель 11, 2009 в 05:41

rpm –oldpackage –force -i libpcap-0.6.2-9.i386.rpm
Решило проблему, с новымы либкап трафд не работает.

MossonАпрель 11, 2009 в 10:24

2 Руслан
>Аналог для linux
вообще не то. Того что просто считает ОБЩИЙ трафик и строит графики много… Основная “фишка” именно в делении трафика по протоколам.

2 adc
> делал похожую систему
солидно выглядит, но опять же немного для других целей предназначена.

2 zoran
>>Много опечаток.
>не то слово… просто ахтунг, такое читать без допинга невозможно. Спеллчекеры нынче не моде и >“аффтары” пишут видимо в mc.
а свой пост перечитать попробуй….
>“Приграмма под FreeBSD”… 5 баллов :)
а ты пакет то видел? сначала посмотри, а потом в комменты гадь..

2nope
>Хорошо было бы дамп пустой базы закинуть. Ставить было бы проще намного :)
чей-то я сам недодумал. сделаю. спасибо за идею :)
>И еще вопрос, требуеца ли promiscuous mode при сборе статистики?
вроде нет.

MossonАпрель 17, 2009 в 15:50

даже удивительно - скачали почти 200 человек, и никто не неписал про ошибку с суммированием :(. пока делал красявости - накосячил.
Кто в состоянии исправить сам - в mode_day.cgi mode_hour.cgi mode_ip.cgi mode_udp.cgi прибавление в переменные $sum_b и $sum_allb должно быть до условия печати строки.
Кто не понял - выложил патч.

AnatolyДекабрь 13, 2009 в 01:41

Потестим. ;)

0pexДекабрь 14, 2009 в 08:35

Пожалуйста, если вам будет не трудно, отпишите результаты тестирования, думаю нам и другим тоже будет интересно ;-)

AnatolyФевраль 3, 2010 в 16:07

Все работает хорошо.
Расхождений с squid (80 порт) и статистикой провайдера - минимальна.
Работает вот уже почти 2-а месяца.

bigfootФевраль 24, 2011 в 23:38

эта версия trafd не пригодна в случае большого трафика (у меня больше 1 Тб/сутки)
может быть в новых исправят