Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> подсчёт трафика —> trafd & MySQL

Прикручивание trafd к MySQL

Автор: lissyara.


    Немного истории. Когда-то у меня на сервере стоял trafd. Стоял и стоял. Считал траффик бегавший в инет и обратно. Раз в день, ночью, запускался скрипт, который подбивал траффик по хостам сети и присылал мне письмо с отчётом: кто и сколько с начала месяца успел натаскать траффика.
   Короче, всё хорошо, но душа хотела чего-то большего :). Примерно в это время мне попалась на глаза статья в которой описывалось как трафик полученный от trafd запихать в БД MySQL, были приложены скрипты на perl и образцы WEB-морды на php. Ну я и загорелся.
   Скрипты на perl оказались нерабочие. Может быть они и были рабочие, но в перл я ничё не понимал и до сих пор мало понимаю - мне не нравится синтаксис этого языка. Слишком свободный, слишком много можно, в том числе и в плане ошибок - поэтому было переписано на shell - ибо этот язык самый универсальный на UNIX. Также неустраивала функциональность, в нём был самый минимум - кто, куда, сколько. Обработка запускалась раз в сутки, т.е. время "во сколько" автоматически выпадало - потому, что эту статистику trafd не собирает. Также меня интересовали порты и протоколы по которым пользователи ползают - сколько на ICQ, например уходит, сколько на FTP (про HTTP отдельная песня - у меня squid, а под него считалок более чем достаточно).
   Логику примерно я понял из описалова исходного скрипта - оставалась только реализация. Вот сам скрипт который получился:

#!/bin/sh
#
#
# Вводим данные для подключения к MySQL серверу
# IP адрес MySQL сервера
IP_MySQL_servera="localhost"
# Имя пользователя для доступа к БД в которой храниться траффик
username="trafd"
# Пароль пользователя MySQL
user_passw="trafd"
# Имя базы данных
db_name="trafd"

# поехали

# Сегодяшний день
day="`date +%Y-%m-%d`"
# Текущий год
year="`date +%Y`"
# Текущий месяц
month="`date +%m`"
# Текущее время (секунды специально сделаны 00 - иногда cron запускает скрипт не
# в 00 секунд а позже (максимум что я видел - в 13), если машина очень загружена -
# как итог в логах начинает фигурировать разное число секунд.
# Мне это непонравилось :)
curr_time="`date +%H:%M:00`"
# Директория в которой будут храниться текстовые файлы с логами trafd
NewDir="/var/traffic/${year}/${month}"
# Пытаемся создать эту самую директорию на случай если это первый запуск
# или произошла смена месяца (года)
mkdir -p ${NewDir}
# Ну и топаем туда
cd ${NewDir}

# Местоположение исполняемого файла клиента MySQL
mysql="/usr/local/bin/mysql"
# Префикс для команд (лень же каждый раз набивать параметры подключения)
sql_preffix="${mysql} --host=${IP_MySQL_servera} \
--user=${username} --password=${user_passw} --database=${db_name}"

# Считываем все переменные из файла /etc/rc.conf с целью извлечь оттуда
# строчку с названиями интерфейсов по которым работает trafd
# (У меня три сетевых платы и lo0 - просто интереса ради)
. /etc/rc.conf

# Для всех интерфейсов выковырнутых из rc.conf (висят в ${trafd_ifaces})
# выполняем один и тот же набор действий по разбору логов и запихиванию
# их в базу данных
for iface in ${trafd_ifaces}
do
# Сохраняем статистику по текущему интерфейсу
/usr/local/bin/trafsave ${iface}
# Преобразуем логи из двоичного в текстовый формат. Сохраняются они в
# папке /tmp в виде файлов summary.* c расширением по имени интерфейса
/usr/local/bin/traflog -i ${iface} -a -n -s > /tmp/summary.${iface} 2>/dev/null
# Очищаем файл с логами в двоичном формате
cat /dev/null > /usr/local/var/trafd/trafd.${iface}
# Дозаписываем логи в текстовый файл (пусть лежат на всякий случай...)
cat /tmp/summary.${iface} >> ${NewDir}/summary.${iface}
# Далее - загоняем траффик в БД
#
${sql_preffix} --execute="CREATE TABLE \`traffic_tmp\` \
(\`date\` DATE NOT NULL, \`time\` TIME NOT NULL, \
\`from_IP\` CHAR(16) NOT NULL, \`port_from_IP\` CHAR(8) NOT NULL, \
\`to_IP\` CHAR(16) NOT NULL, \`port_to_IP\` CHAR(8) NOT NULL, \
\`protocol\` ENUM('icmp','tcp','udp') NOT NULL, \`bytes\` int(16) NOT NULL, \
\`all_bytes\` int(16) NOT NULL) TYPE=MyISAM COMMENT='tmp_table'" 2>/dev/null

# Лопатим данные для интерфейса ${iface}
# Очищаем временную таблицу
${sql_preffix} --execute="DELETE FROM \`traffic_tmp\`"
# Построчно превращаем файл со статистикой в набор переменных
grep -v "^ " /tmp/summary.${iface} |
{
while read stroka
do
from_IP=`echo "${stroka}" | awk '{print $1}'`
port_from_IP=`echo "${stroka}" | awk '{print $2}'`
to_IP=`echo "${stroka}" | awk '{print $3}'`
port_to_IP=`echo "${stroka}" | awk '{print $4}'`
protocol=`echo "${stroka}" | awk '{print $5}'`
bytes=`echo "${stroka}" | awk '{print $6}'`
all_bytes=`echo "${stroka}" | awk '{print $7}'`
# Загоняем полученный набор во временную таблицу
${sql_preffix} --execute="INSERT INTO \`traffic_tmp\` (\`date\`, \
\`time\`, \`from_IP\`, \`port_from_IP\`, \`to_IP\`, \`port_to_IP\`, \
\`protocol\`, \`bytes\`, \`all_bytes\`) \
values ('${day}', '${curr_time}', '${from_IP}', \
'${port_from_IP}', '${to_IP}', '${port_to_IP}', \
'${protocol}', '${bytes}', '${all_bytes}')"
done
}
# Стираем пустые строки (а вот откуда они вылазиют я так и непонял....)
${sql_preffix} --execute="DELETE FROM \`traffic_tmp\` WHERE from_IP='' AND \
port_from_IP='' AND to_IP='' AND port_to_IP='' AND protocol=''"
# Стираем строки в которых полное число байт (вместе с технической инфой)
# равно нулю (тоже непойми откуда берутся - раз в статистику trafd попали -
# значит соединение было и байты должны были б быть...)
${sql_preffix} --execute="DELETE FROM \`traffic_tmp\` WHERE all_bytes='0'"
# Создаём таблицу для окончательного хранения траффика
# (на тот случай если она не создана - хотя конечно тоже дурацкий вариант -
# пытаться создать таблицу при каждом запуске скрипта, но другой вариант -
# проверять существование и если нету её - то создавать. А какая разница? Так
# как сделано сейчас - проще и менее ресурсоёмко)
${sql_preffix} --execute="CREATE TABLE \`${iface}_${year}\` \
(\`unic_id\` INT(16) NOT NULL AUTO_INCREMENT, \
\`date\` DATE NOT NULL, \`time\` TIME NOT NULL, \
\`from_IP\` CHAR(16) NOT NULL, \`port_from_IP\` CHAR(8) NOT NULL, \
\`to_IP\` CHAR(16) NOT NULL, \`port_to_IP\` CHAR(8) NOT NULL, \
\`protocol\` ENUM('icmp','tcp','udp') NOT NULL, \`bytes\` int(16) NOT NULL, \
\`all_bytes\` int(16) NOT NULL, \
PRIMARY KEY (\`unic_id\`), \
KEY \`date\`(\`date\`) \
) TYPE=MyISAM COMMENT='База \
данных траффика по (${iface}) интерфейсу за ${year} год'" 2>/dev/null
# Перекидываем траффик из временной таблицы в окончательную, при этом
# объединяем строки в которых совпадает ВСЁ кроме числа байт.
${sql_preffix} --execute="INSERT INTO \`${iface}_${year}\`\
(\`date\`, \`time\`, \`from_IP\`, \`port_from_IP\`, \`to_IP\`,\
\`port_to_IP\`, \`protocol\`, \`bytes\`, \`all_bytes\`) \
SELECT \`date\`, \`time\`, \`from_IP\`, \`port_from_IP\`,\
\`to_IP\`, \`port_to_IP\`, \`protocol\`, sum(\`bytes\`) as \`bytes\`,\
sum(\`all_bytes\`) as \`all_bytes\` FROM \
\`traffic_tmp\` GROUP BY \`date\`, \`time\`, \`from_IP\`, \`port_from_IP\`,\
 \`to_IP\`, \`port_to_IP\`, \`protocol\`"

done

# Очищаем файл c логами о том когда и по какому интерфейсу сохранялась статистика
cat /dev/null > /var/log/traffic.log

   Теперь вкратце описалово. С той частью где ввод переменных кажется проблем быть не должно
— NewDir="/var/traffic/${year}/${month}" - директория для сохранения статистики trafd в его "родном", текстовом формате. Нужно это или нет - сами решайте. Я на всякий случай сохранял - мало ли что (БД случайно грохну, например :)).
— IP_MySQLservera="localhost" - IP адрес MySQL сервера на котором хранится БД. В данном варианте это наследие времён, когда сервер БД стоял на одной машине, а trafd крутился на другой. Если они у Вас стоят на одной машине то можно смело повыкидывать все упоминания о хосте сервера.
— username="trafd" - имя пользователя для доступа к БД
— user_passw="trafd" - парольпользователя для доступа к БД
— db_name="trafd" - имя базы данных
   Далее статистика интерфейсов сохраняется в /tmp и дописывается в /var/traffic/${year}/${month}. Временный файл читается построчно, строка разбирается по полям в переменные - кто, куда, откуда, по каким портам, по каким протоколам, сколько байт, сколько байт вместе с технической информацией (не знаю, пригодится ли кому-то последнее поле, но при написании скрипта я постарался чтобы никакие из данных не пропали - пусть лежат, пригодятся). Получается куча переменных содержащих все эти данные, которые и пхаются в MySQL - во временную таблицу `traffic_first`.
   После того, как весь текстовый файл переехал в БД начинается разбор того, что попало в БД - удаляются пустые строки, строки в которых число байт равно нулю (вот откуда они появляются я не вполне понимаю - если есть адреса IP, порты - то запрос был, были и данные, но данных нет....). Затем данные перелохмачиваются в таблицу `traffic_tmp` с одновременной суммацией одинаковых строк - бывает такое, что все данные одинаковые кроме числа байт. Чтоб не хранить лишние строки - такие суммируются в одну.
   После попытки создать таблицу для хранения данных за текущий месяц (чтобы каждый раз не заморачиваться скрипт при каждом запуске пытается создать свои таблицы, на случай если это первый запуск, или сменился год) траффик запихивается на постоянное хранение в таблицу с именем типа `sis0_2005_06`. Затем цикл повторяется для другого интерфейса.
   Запуск в "кроне" ставится на каждую минуту. Сам по себе скрипт конечно же небыстрый (это связяано с тем, что на каждый запрос соединение с MySQL устанавливается заново), но тем не менее - на моём P-166MMX он успевал отработать за 5-7 секунд даже если процессор был занят чем-то ресурсоёмким (компиляция и прочее).Если нет реальной необходимости иметь поминутную статистику то можно запускать реже - раз в 10 минут или раз в час. WEB-морду к этому хозяйству прикручивать изначально планировал - и даже приделал. Но - та, что была мне не понравилась - интерфейсом и убогостью метода подсчёта - хосты валились в кучу без разбора локальная или нет сетка, и траффик считался и входящий и исходящий без учёта того, что могут быть обращения на сам сервер (например я постоянно работаю с серваком и к концу месяца при таких методиках подсчёта лишнего траффика, неимеющего отношения к инету набирается бывает несколько гигабайт(!) информации.) Потому считать начал в командной строке запросом типа:

mysql --user=trafd --password=trafd --database=trafd --execute="SELECT \
to_IP,SUM(bytes) FROM sis0_2005 WHERE to_IP LIKE '192.168.%' \
AND from_IP NOT LIKE '192.168.8.254' GROUP BY to_IP" | mail -s traffic \
admin@lissyara.su

А текст из полученого письма просто в ёксель скопировать и построить графики для руководства, если вдруг выяснится, что кто-то по http налазил 50 мег и вот по ftp затащил пару порнофильмов :) Будет время, или реальная необходимость в WEB-интерфейсе, тогда и сделаю. Сложности никакой вроде не видно в этом....

P.S. Я всё-таки приделал WEB-морду. :) Пока не самую сложную, но тем не менее.
P.S.2 На AMD64 мне не удалось заставить работать ни trafd, ни bpft.... Какую-то галиматью в логи выдают.... Поэтому там использую ipacctd



размещено: 2005-08-19,
последнее обновление: 2006-06-15,
автор: lissyara


Sweeper_jr, 2005-10-18 в 19:43:06

Спасибо, статья понравилась, сразу захотелось реализовать :)
Теперь вопросы:
что-то непонятно здесь

"# Считываем все переменные из файла /etc/rc.conf с целью извлечь оттуда
# строчку с названиями интерфейсов по которым работает trafd
# (У меня три сетевых платы и lo0 - просто интереса ради)
. /etc/rc.conf"

убрал . /etc/rc.conf , поставил trafd_ifaces="rl0 xl0"
запустил скрипт , но выдало ошибку
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'where clause'
ERROR 1146 (42S02) at line 1: Table 'trafd.rl0_2005' doesn't exist
error: /var/run/trafd.xl0 not found
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'where clause'
ERROR 1146 (42S02) at line 1: Table 'trafd.xl0_2005' doesn't exist

запустил еще раз только с trafd_ifaces="rl0", опять ошибка

ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
ERROR 1054 (42S22) at line 1: Unknown column 'all_bytes' in 'field list'
^C

Вот калупаюсь, но безрезультатно. Может есть идеи ???



lissyara, 2005-10-19 в 9:04:30

люди... задавайте вопросы в форуме....
Насчёт скрипта - он точно рабочий в том виде, в каком выложен. Потому что у меня он в таком виде на 5-ти машинах работает. Рой - где-то ошибся, скорей всего.

Spider, 2005-12-28 в 5:20:00

Выучи перл и жизнь тебе станет проще
С перло открываются новые возможности !
Перед перлом в иерархии Юникс стоит только С++

lissyara, 2005-12-28 в 9:05:27

SHELL - рулит.
А перл - ненавижу! :)))

monstr, 2005-12-29 в 13:56:47

почемуто скрипт останавливается вот в этом месте?
Пишит
# ./trafd.sh
--host=localhost: not found
В чем проблема?

MONSTR, 2006-01-11 в 13:48:39

Lisa по mysql выкладка какая нить будет?

lissyara, 2006-01-11 в 13:50:17

Я мужского рода, вообще-то.. :)))

По существу вороса - что конкретно интересует? Там вроде особых сложностей-то нет....

MONSTR, 2006-01-12 в 12:32:42

Если бы не было то я и не стал бы задавать такого рода вопросы. В моем случае проблема с запуском скуля. Ругается по чем зря. Поставил из портов сервер он потянул и поставил клиента, перезагрузился а скюля нет не запускается пишит

mysql start
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Pattern, 2006-03-03 в 14:44:34

MONSTR, это проблема не скрипта, а запуска MySQL. Проверь привилегии пользователей, под которыми коннектишься к базе, под каким хостом он запустился (если запустился) localhost или какой нить my-superpuper.domain.etc. За подробностями кури лог.

lissyara, целесообразно, при создании таблиц в скрипте добавлять индексы полей. Иначе, когда таблицы сильно разрастаются своими данными, они становятся "тяжелые". А так же при запуске скрипта от крона приходит месага:
Subject: Cron <root@*********> /usr/local/etc/traffic/traffic.sh

ERROR 2013 (HY000): Lost connection to MySQL server during query
Это говорит о том, что скрипт, запущенный из под крона запустился, но, не дождавшись завершения, вышел по таймауту. Для машин с базами, на которых нагрузка не велика - это не столько критично, однако оно и не помешает. А вот для таких машин как у меня, скуль которого обрабатывает до 100 запросов в минуту, не индексированные таблицы могут положить сервант наглухо. Я долго пытался выснить, что за загадочное сообщение мне приходит и откуда у неё растут ноги, пока не выявил данную фичу.

Pattern, 2006-03-03 в 14:48:22

Кста, ещё вопросец: для полей bytes и all_bytes ты поставил значения типа char(16). А почему не int(16)?

lissyara, 2006-03-03 в 15:17:26

ошибка :)
Когда я это писал я слабо понимал какие поля какими должны быть. Изначально у меня все были варчар. По мере понимания заменял тем, что должно быть. В итоге в моих скриптах на серверах int, а тут так и осталось - char.

Исправил.

Pattern, 2006-03-03 в 15:36:37

Ну тогда в дополнение, и чтобы тебе не мучаться и не решать, как прописывать индексы, вот как я их прописал у себя:
KEY \`date\` (\`date\`), KEY \`time\` (\`time\`), KEY \`from_IP\` (\`from_IP\`), KEY \`port_from_IP\` (\`port_from_IP\`), KEY \`to_IP\` (\`to_IP\`), KEY \`port_to_IP\` (\`port_to_IP\`), KEY \`protocol\` (\`protocol\`), KEY \`bytes\` (\`bytes\`), KEY \`all_bytes\` (\`all_bytes\`)
Возможно у кого то есть более дельное решение.

lissyara, 2006-03-03 в 15:38:21

У меня только по дате ключ и по IP. Это основные выборки, которые делаются при просмотре пользователями статистики. А я могу и подождать :) Да и не нужно столько ключей...

Abigor, 2006-03-15 в 11:41:38

это я такойо собенный или у всех man trafd ни чего не говорит, ставил и зпортов, а в чесности интересует чего в rc.conf писать
нашел тольк онемного на http://bpft4.sourceforge.net/ да и то там того нет

Abigor, 2006-03-15 в 11:44:20

блин, как всегда поторопился =) в /usr/local/etc/rc.d/trafd.sh.sample все написано =)

Дмитрий, 2006-03-18 в 1:39:37

Все заработало прекрасно :)
Только форум мне не зарегаться и про переменную trafd_ifaces
надо было поподробней написать :))
а то я не понялд сначала что ее создать нуна :)

Для всех интерфейсов выковырнутых из rc.conf (висят в ${trafd_ifaces})

ralf4, 2006-06-15 в 10:57:45

так первая ступень при создание Database: trafd, всё отлично создаёт

mysql> CREATE DATABASE /*!32312 IF NOT EXISTS*/ trafd;
Query OK, 1 row affected (0.00 sec)

а при создание таблицы

--
— Table structure for table `traffic_tmp`
--

CREATE TABLE traffic_tmp (
 date date NOT NULL default '0000-00-00',
 time time NOT NULL default '00:00:00',
 from_IP varchar(19) NOT NULL default '',
 port_from_IP varchar(7) NOT NULL default '',
 to_IP varchar(19) NOT NULL default '',
 port_to_IP varchar(7) NOT NULL default '',
 protocol set('tcp','icmp','udp') NOT NULL default '',
 bytes varchar(9) NOT NULL default '',
 all_bytes varchar(10) NOT NULL default ''
) TYPE=MyISAM COMMENT='тоже временная табличка';

выдаёт ошибку
ERROR 1046: No Database Selected

в чём проблема может быть

ALex_hha, 2006-11-07 в 11:35:54

>выдаёт ошибку
>ERROR 1046: No Database Selected
>в чём проблема может быть
переведи на русский, ты не подключился к БД, а пытаешься выполнить запрос.

Перед созданием таблиц должна быть такая строка
connect trafd;

Или запрос надо выполнять так
# mysql -u root -p trafd < trafd.sql

Вообщем учим мат часть

Maksiim, 2006-12-26 в 10:41:04

Спасибо Лисяра. Все заработало без всякой дополнительной обработки. Акурат "скопировал-вставил" :)

FreeBSD 6.2

schizoid, 2007-03-21 в 11:16:04

А для пптп-шных интерфейсов такая бодяга прокатит? кто-нить делал? стоит замарачиваться? их то в рц.конфе нету...

alex3, 2007-04-25 в 11:19:27

Если кто будет вставлять вышеупомянутый KEY.... - не забудьте, перед одиночными кавычками должен стоять бэкслеш (\). Сам напоролся.

dip, 2007-04-25 в 12:39:04

Вы пробовали использовать последнюю версию trafd-3.0.3-b6? Там в CHANGES написано следующее:

Sun Jan 21 12:28:51 NOVT 2007

- All tools were revised to support 64 bit arch (tested on FreeBSD/amd64).

Nadz Goldman, 2007-07-24 в 9:59:29

Хмм...

Вместо . /etc/rc.conf поставил trafd_ifaces="rl0 rl1 rl2 rl3" и все стало считаться.

Nadz Goldman, 2007-07-30 в 14:09:10

Хотя с другой стороны - это ведь надо в /etc/rc.conf прописать - новички могут и не догнать сразу

zoob, 2007-10-27 в 23:16:25

Не могу не сказать спасибо.
Всё заработало с первого раза.
Тупо копирую выложеный скрипт, убираю коментарии (потому-что у меня Фря без русского) и всё работает.
Очень приятно.
Спсибо.

Zar, 2007-12-26 в 11:43:22

Присоединяюсь к благодарностям!! спасибо за столь хорошо проделанный труд!!

но можно всеж задать 1 вопрос...

почему так:
берем запускаем скрипт.. он отрабатывает секунд 5... после этого еще раз на него нажимаем.. и он работает минут 1-2... взависимости как давно он перед этим нажимался.. может и минут 5.. а первый раз пару секунд... ? и так все время...
вот я и думаю в чем разница этой статистики.. ведь в кроне он запускается 1 раз...
машина давольно шустрая. (2,0Гхз гипертрэйнинг, бзд6.2,256оперы..)

как проверить что он действительно складывает все что надо?

Pattern, 2007-12-27 в 17:12:35

Факторов влияющих на скорость обработки скрипта не много... а очень много. =) Загруженность обращений к скуль БД, количество траффика (in/out) за прошедшее время и т.д.

>>как проверить что он действительно складывает все что надо?

заглянуть в БД и посмотреть, что он туда добавил. Нет уверенности, что он "правильно всё делает" - поставить альтернативу и сравнить.

Daemani, 2008-01-05 в 15:11:48

А как насчет потери информации о трафике? В свое время столкнулся на канале в 2Мбита терялось 20 процентов трафика.
Поэтому перешел на ng_netflow и проблема со временем трафика исчезает и еще много чего пишется.

Pattern, 2008-01-06 в 18:36:45

Daemani, ну и отлично, однако сабж "Прикручивание trafd к MySQL"

Iceman, 2008-02-04 в 12:22:23

Приятная статья, осталось только сравнивать с другими решениями, т.к. есть сомнительное чувство о серьёзной потере трафика (~10%)

Zar, 2008-02-05 в 3:45:50

Согласен с Iceman
за первую неделю(с 1го февраля) работы расхождение трафика с учетам squid составило более 100метров трафика.
squid плказывает 2017Гб трафика.
а trafd всего 2076 из них 123 натом. отсюда
1952 через squid
есть какие нибудь предложения по этому вопросу?

ps 2lissyara, на форуме нет конкретной темы по обсуждению данной статьи. может для всех твоих статей  на форуме создать отдельный раздел и в нем создать закрепленные темы?

Sergey21102, 2008-03-02 в 0:56:46

Daemani Iceman Zar
Ставьте последнюю версию BPFT4 (TRAFD) от Дмитрия Казарова и с трафиком у вас будет все в порядке.
Старая версия не учитывает пакеты меньше какого то размера, сейчас не помню какого именно. В этой последней работающей версии размер минимального пакета устанавливается ключом -m

Zar, 2008-03-03 в 6:27:31

Sergey21102
заинтриговал)
...
посмотрел в портах.
kazarov вроде и в портах в /usr/ports/net-mgmt/bpft
в редми его фамилия.
и последние изменеия в описание совпадают.
да и версия в портах от 2004 года. Казарова от 2002
есть смысл выкачивать это или лучше ставить из портов?

Zar, 2008-03-04 в 5:28:30

вообщем отчет за проботанный bpft4 из портов в течение суток.

примерно в 11 утра. был собран и введен в использование  bpft4 и портов.
сборка
/usr/local/etc/rc.d/060.trafd.sh stop
cd /usr/ports/net-mgmt/trafd && make deinstall
cd /usr/ports/net-mgmt/bpft && make install
Посмотрев мельком характеристику порта пришел к выводам что ничего менять не надо.
/usr/local/etc/rc.d/060.trafd.sh start
поднял интерфейсы. слушает. все вроде замечательно...

2008-03-04, примерно заполночь.

/var/traffic/2008/03/
логи на 2 интерфейса были по ~800метров.
что привело к заполнения /var на 109%(по показаниям df) и вешание системы в 0
после передергивания сервера. путем 5сек отсечки на кнопке Power. и его перезапуск в синг моде и чистенье /var  && fsck

еще один ребут но уже нормальный.
через 15 минут работы сервера
в ps ax | grep *скрипт*
было... не соврать штук 15-20
он просто не успевал обработаться.
логи за это время выросли примерно на 23 метра в общей сложности. на 2 интерфейса.

итог. остановил trafd и думаю что делать дальше.

Sergey21102
советы будут?
может я что то не то сделал?

lissyara, 2008-03-04 в 8:52:49

Юзать перловый.
Он для такого и написан - работает на порядки быстрей.

Pattern, 2008-03-04 в 12:20:55

Хе! =) От добра добра не ищут. Юзайте то, что доктор Лис прописал ;) На 7 серверах стоит эта приблуда, в течении 5 лет: ни сбоя, ни переполнения (кошмар какой)

Sergey21102, 2008-03-04 в 13:06:09

Zar

Какие еще порты, в портах не последняя версия. Я же ссылку дал, там версия от 2005 года

Sergey21102, 2008-03-04 в 13:36:52

В BPFT4 поменяли месторасположение нескольких папок и поменяли формат записи трафика. Новый формат по моим ощущениям оказался неудачным (файлы трафика получаются больше и время их ежесуточной обработки моими скриптами увеличилось раза в полтора и эти минусы не компенсируются никакими плюсами от использования нового формата, плюсов просто нет). В этом пакете, к счастью, оставили совместимость со старым форматом, для этого нужно поправить несколько файликов.

Zar, 2008-03-20 в 8:08:49

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

SoreN, 2008-04-07 в 4:21:48

2 Zar

Я только что поставил на amd64, встало без проблем и даже считает))))) Бум продолжать наблюдения.

Ставил не из портов, качнул последнюю версию с [url= без проблем]

SoreN, 2008-04-07 в 4:26:14

Во понаписал-то))) Верный признак идти спать......

2 Zar

Качай http://trafd.sourceforge.net/, собирал я без опций, и форматы настраивать ненуно там симлинка с совместимостью)))

SoreN, 2008-04-07 в 4:29:32

p.p.s.
Конфиг формата у мя от старой версии мож поетому и работает...


Sergey21102, 2008-04-10 в 0:12:47

1. В связи с тем что некоторым лень разобраться с  настройкой BPFT 4 от Дмитрия Казарова могу выложить полностью подправленный (мною) комплект bpft 4 для  работы со старым форматом например здесь.
2. Сейчас вожуся с  новым сервером, у  которого CPU Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40. На нем сейчас стоит FreeBSD 6.3, инсталлированная с AMD64 дистрибутива, Так  вот, TRAFD на нем работает без проблем, если это  lissyara и другим будет интересно, можно было бы вместе  покапаться  в  конфигах для  прояснения ситуации c TRAFD под AMD64

lissyara, 2008-04-10 в 0:34:24

Интересней всего было бы если бы кто-то сделал порт новой версии

Sergey21102, 2008-04-10 в 0:58:16

lissyara, порта новой  версии уже  не  будет, этот проект уже  давно заглох....

Andreo88, 2008-05-04 в 13:06:19

у мня есть фич для этой статейки
она понравилась

приделал человеческую морду
пример моно посмотреть тут
http://195.189.134.10
вот с сортировкой совсеми делами )))
и нуно только 1 conf файл заполнить ни чего более ))

guner, 2008-05-07 в 19:33:03

бага с переполнением var и зависанием кучи процессов решается добавлением в конец скрипта
cat /dev/null > /var/log/traffic.log
for iface in ${trafd_ifaces}
do
   cat /dev/null > /tmp/summary.${iface}
   cat /dev/null > ${NewDir}/summary.${iface}

GuNeR, 2008-06-30 в 15:03:05

В предыдущем посте лишнюю строку добавил
надо вот так:

cat /dev/null > /var/log/traffic.log
for iface in ${trafd_ifaces}
do
   cat /dev/null > /tmp/summary.${iface}
done


еще немного пошаманил и значительно ускорил процесс занесения данных в БД

убираем это:
# grep -v "^ " /tmp/summary.${iface} |
# {
# while read stroka
# do
# from_IP=`echo "${stroka}" | awk '{print $1}'`
# port_from_IP=`echo "${stroka}" | awk '{print $2}'`
# to_IP=`echo "${stroka}" | awk '{print $3}'`
# port_to_IP=`echo "${stroka}" | awk '{print $4}'`
# protocol=`echo "${stroka}" | awk '{print $5}'`
# bytes=`echo "${stroka}" | awk '{print $6}'`
# all_bytes=`echo "${stroka}" | awk '{print $7}'`
# # Загоняем полученный набор во временную таблицу
# ${sql_preffix} --execute="INSERT INTO \`traffic_tmp\` (\`date\`, \
# \`time\`, \`from_IP\`, \`port_from_IP\`, \`to_IP\`, \`port_to_IP\`, \
# \`protocol\`, \`bytes\`, \`all_bytes\`) \
# values ('${day}', '${curr_time}', '${from_IP}', \
# '${port_from_IP}', '${to_IP}', '${port_to_IP}', \
# '${protocol}', '${bytes}', '${all_bytes}')"
# done
# }


вставляем это:

cov="','"
cov1="'"
cat /tmp/summary.${iface} | gawk 'BEGIN {
               tmp = 0
               getline
               getline
               getline
               print "INSERT INTO `test` (`date`, `time`, `from_IP`, `port_from_IP`, `to_IP`, `port_to_IP`, `protocol`, `bytes`, `all_bytes`) values (" >> "/tmp/traffic.sql"
               }
           {
               if ( tmp == 1) {
                   print "),(" >> "/tmp/traffic.sql"
               }
               print "'${cov1}${day}${cov}${curr_time}${cov}'" $1 "'${cov}'" $2 "'${cov}'" $3 "'${cov}'" $4 "'${cov}'" $5 "'${cov}'" $6 "'${cov}'" $7 "'${cov1}'" >> "/tmp/traffic.sql"
               tmp = 1
           }
           END {
               print ");" >> "/tmp/traffic.sql"
           }'
${sql_preffix} < /tmp/traffic.sql
cat /dev/null > /tmp/traffic.sql


не забываем создать файлик /tmp/traffic.sql

в результате этого изменения скрипт выполняется за доли секунды

GuNeR, 2008-06-30 в 15:07:54

ема народ поправка  :)
меняем print "INSERT INTO `test`
на print "INSERT INTO `traffic_tmp`

nakagun, 2008-07-01 в 13:21:33

Маладца аднака! Респект и уважуха автору - с полпинка заработало! Ж-*

risk94, 2008-08-17 в 12:13:45

Народ, дайте ктонить полностью скрипт веб-морды.

snusmumric, 2008-08-19 в 16:46:00

пользовал данный скрипт только mysql база была на другом серваке рядом в 100м/б сетке ..скрипт запускался по крону каждые два часа.. выполнялся по 20мин а то и больше ..интересно это так и должно быть если trafd и mysql база на разных компах.

papenkin, 2008-10-22 в 15:33:48

Огромное спасибо автору за статью! Все завелось с копипаста. И структура базы дает почти безграничные возможности для фантазии :)

bvd, 2008-11-12 в 16:26:06

"bvd писал(а):Заметил косяк с обработкой цикла.
   после вот этого:
   for iface in ${trafd_ifaces}
   do
   /usr/local/bin/trafsave ${iface}
   /usr/local/bin/traflog -i ${iface} -a -n -s > /usr/local/tmp/summary.${iface}
   cat /dev/null > /usr/local/var/trafd/trafd.${iface}
   cat /usr/local/tmp/summary.${iface} >> ${NewDir}/summary.${iface}

файлы /usr/local/var/trafd/trafd.${iface} не пустые, или через раз очищается только последний в цикле. боюсь это может повлечь наложение данных и как следствие не точность в финале..
пробовал по отдельности каждую из перечисленных команд в цикле прогонять - проходит без проблем, а все вместе косячит.
есть подозрение что он фигачит все эти команды не дожидаясь отработки каждой, тогда вообще о точности попадания данных в бд говорить не приходится. также с амперсантами (&&) в конце каждой команды эфекта не добился.

это только у меня такой косяк, или это известный баг? ответа на форуме не нашел. :unknown: выручайте!!"
---
Разобрался!! вся проблема в "/usr/local/bin/trafsave". так как эта команда всего лишь сигнал к выгрузке, она отрабатывается моментом, а результат в бинарник прилетает с некой долей секунд задержкой - дальше все по наклонной.. трафлог обрабатывает только то, что успело прилететь, бинарник зануляется, а данные продолжают прилетать и после - это и есть то, почему результат не соответствовал ожидаемому.
Развлекаловка с попыткой задержать дальнейшее выполнение команд после trafsave на н-сколько секунд не принесла успеха (так и не нашел как это правильно сделать), решил проблему отключив в данном скрипте trafsave, и поставив его в крон за минуту до отработки этого скрипта.
Да(!), возможно такая ситуация наблюдается не у всех, т.к. хотя моя машинка и мощная, но очень загружена трафиком, но обратить внимание стоит!

Andrew Danilov, 2008-11-12 в 19:10:02

Попробовали понравилось
вот написали вебку оцените ...
http://it.neftpx.ru/trafd/
там есть скриншоты и дистриб

ewgen, 2008-11-13 в 15:46:17

Спасибо Лисяра за работу. Сайт твой выручает давненько уже и постоянно. Всего не упомнишь действительно а тут всегда все на месте.
Скрипт твой завелся с копипаста влет.
Вопрос - айпишнеги trafd не резольвит чтоли?

ewgen, 2008-11-13 в 15:53:12

дело в том что:
/usr/local/bin > ./trafshow
выводит красивые данные в цветах и красках по протоколам с именами сайтов. А в trafd табличке мускула только айпи :(

ewgen, 2008-11-13 в 16:08:09

блин не сайтов а серверов

greg_b, 2008-12-05 в 17:47:08

Andrew Danilov,
Forbidden

You don't have permission to access /trafd/ on this server.
Apache/2.0.61 (FreeBSD) PHP/5.2.5 with Suhosin-Patch Server at it.neftpx.ru Port 80

Andrew Danilov, 2008-12-09 в 17:44:21

извиняюсь сменил политику апача
http://it.neftpx.ru/trafd/admin.JPG
http://it.neftpx.ru/trafd/user.JPG

Andrew Danilov, 2008-12-09 в 17:46:50

http://it.neftpx.ru/trafd/trafd_it.neftpx.ru.rar
по вопросам 273029525
или на мыло...
скоро хотим переписать чтоб бд резалась по разным табл на каждый день

Andrew Danilov, 2008-12-09 в 17:53:56

http://it.neftpx.ru/trafd/traffic.sh
вот наш рабочий рихтованнй файл

Andrew Danilov, 2008-12-09 в 19:12:25

ftp://it.neftpx.ru/
для вас господа
имя trafd
пасс trafd

Max, 2009-01-02 в 8:47:18

bvd

>>Развлекаловка с попыткой задержать дальнейшее выполнение команд после trafsave на н-сколько секунд не принесла успеха (так и не нашел как это правильно сделать), решил проблему отключив в данном скрипте trafsave, и поставив его в крон за минуту до отработки этого скрипта.
Спасибо, толковое замечение, но у меня все решилось простым добавлением строки sleep 5 после
/usr/local/bin/trafsave ${iface}

greg_b, 2009-01-04 в 0:44:49

bvd, 2008-11-12 в 16:26:06

сделай так:
#!/bin/sh
for iface in ${trafd_ifaces}; do
  /usr/local/bin/trafsave ${iface}
  sleep 10 # trafd сливает на совеременной машине конечные данные примерно 7 секунд
  /usr/local/bin/traflog -i ${iface} -a -n -s > /usr/local/tmp/summary.${iface}
  cp /dev/null /usr/local/var/trafd/trafd.${iface}
  cat /usr/local/tmp/summary.${iface} >> ${NewDir}/summary.${iface}
  cp /dev/null /usr/local/tmp/summary.${iface} # суммарники тоже надоть обнулять вроде как?

simple123, 2009-07-02 в 10:49:40

Не пойму как эта штука настраивается!!!
1 Ставим Trafd из портов
2 Прописываем в rc.conf trafd_enable=\"Yes\",trafd_ifaces=\"rl0 rl1\"
3 Создаем базу в мускуле, не пойму где взять этот скрипт trafd.sql
4 Далее запускаем скрипт trafd.sh он выполняет создание путей и так делаее, а потом что добавлять это скрипт в cron!!!
Правильно ли понял!!!

GUEST, 2010-02-11 в 13:58:17

Всё делается гораздо проще! Trafd имеет возможность настройки формата выходного файла. Загоняем туда нужный SQL формат и не тратим много %CPU на построчный анализ!

Unik, 2012-08-31 в 8:51:10

в версии 5.5 синтаксис с TYPE=MyISAM изменился на
ENGINE=MyISAM



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0564 секунд
Из них PHP: 39%; SQL: 61%; Число SQL-запросов: 77 шт.
Исходный размер: 94922; Сжатая: 22459