Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
|||||||||
www.lissyara.su
—> статьи
—> FreeBSD
|
|
Программа абсолютно копеечного размера (15кб), но самый главный плюс оказался не в этом - если у Вы удосужились прикрутить русский язык к консоли, то сможете лицезреть ман по этой программе на русском :) Собственно по этой причине не буду расписывать ключи, и прочее.
Работает через IPFW - пришлось пересобрать ядро и поднять файрволл. Извращаться особо не стал, забил совсем немного правил - машина с одним интерфейсом, смотрящим в локалку:
/etc/rc.firewall
|
Учтите, что правила надо добавлять в самом верху файрволла до остальных (сразу после -f flush). Также добавляем следующие строки в /etc/rc.conf (для двух интерфейсов - lo0 и sk0)
|
После чего запускаем ipacctd:
|
и перезагружаем правила файрволла:
|
Всё. Траффик считается. Осталось привенуть скрипт, который, будет всё это складывать в БД. Я чуть-чуть модифицировал свой скрипт, написанный для trafd:
|
Доработки минимальны - изменилась команда сохранения траффика, и одна колонка сменилась - вместо `all_bytes` стало `paketov`... После чего пихаем скрипт в планировщик - я всунул его на запуск раз в минуту (все звёздочки, кроме команды)...
P.S. По прошествии нескольких дней обратил внимание, что в моменты пиковой загрузки (когда всех припёрло лезть в инет) скрипт работает долго - 20-30 секунд на нененагруженной машине... Пару раз, когда машина была загруженна, даже не успевал отработать. Причина нашлась быстро - сильно возросло число строк в логах - trafd все порты больше 10000 обзывал client а ipacctd честно их писал... Подумавши, настругал такой скрипт на перл:
|
Он прекрасно заменяет тот же шелловый скрипт. Тока работает раз в 10-15 быстрей :))) Также есть и нововведения (колонка unix_time и unic_id) - понадобились для работы. Если заменять существующий shell скрипт колонку unix_time надо добавить, а если с нуля - то сам всё создаст. Также убрана временная таблица. Тут она не нужна.
P.S. Ненавижу перл.
размещено: 2006-02-01,
последнее обновление: 2006-05-31,
автор: lissyara
nikolay, 2006-06-09 в 9:51:12
пустые строку появляются после каждого запуска скрипта
покрайней мере который написан на sh
Alextriam, 2006-07-06 в 18:37:47
Я с фрей недавно, в портах есть netams, он и считает неплохо и статистику генерит в html.
red, 2006-08-31 в 9:20:52
месяц в виде вдузначного числа
=====================================
#!/usr/bin/perl
use strict;
use vars qw( $year $month );
($year, $month) = (localtime)[5,4];
$year += 1900;
$month = ++$month < 10 ? "0$month" : $month;
print "$year\t$month\n";
=====================================
red, 2006-08-31 в 9:25:31
фигню сморозил...
гораздо правильней так:
$month = sprintf('%02d', ++$month);
dik), 2006-09-01 в 17:38:11
Есть флаг в ipacctd: -c Он меняет местами кол-во пакетов байтов.
Efendy, 2006-10-18 в 6:54:34
substr('0'.(1+localtime->mon),-2,2)
WarWar, 2006-10-25 в 21:05:03
Можно еще посмотреть в сторону ipcad (есть в портах)
Из приятного: умеет суммировать нужные порты (меньше инфы вливается в временную таблицу да и быстрей это происходит естественно), и удаленно можно статистику снимать.
Ghost, 2006-12-05 в 19:44:23
В последнеи скрипте
# очищаем файло
system("cat /dev/null > $otkuda");
# создаём таблицу, где будет храниться траффик
последний комментарий случайно затесался, или должна еще создаваться таблица?
lissyara, 2006-12-06 в 8:45:03
наверно - случаяно :)))
Закомменчено же :)))
io, 2007-01-11 в 21:20:29
а вею морда с trafd сюда подходит?
Aldaron, 2007-01-12 в 11:06:13
Вопрос такой - а если это шлюз с двумя интерфейсами, NAT дивертится двумя правилами в ipfw, то тогда каким образом должна выглядеть свзка дивертов для ipacctd и для NAT соответсвенно?Сейчас стоит trafd, делал по статье, врет ужасно...
fabi, 2007-01-15 в 18:38:21
Aldaron, не новость а вот как это лечить, если это возможно???
Да и вообсче хотелось бы узнать у знающих людей о честности считалок(trafd,ipacctd и др).
VladB, 2007-01-18 в 19:52:11
Привет, стоит сервер с двумя интерфейсами [в сеть и инет] на нем ipacctd + mysql (обновляется каждые 10мин.) . Сверил статистику за последние пол года: разница в 50Мб (ipacctd показал больше провайдера). Так что с точностью подсчета, по моему, проблем нет. Единственное неудобство это большой объем БД и длительное время математического подсчета трафика. На подсчет месячного трафика (~3-4Gb) уходит около ~50Mb., ~500,000 записей и ~5-10 сек. для подсчета.
P.S. cat Thanks >> Lissyara.su ;)
mick, 2007-07-12 в 21:02:47
eсть такая фича для очистки файла (вместо cat /dev/null > filename.txt)
: > filename.txt
Zont, 2007-08-25 в 19:32:53
не надо пользовать ipacctd, он теряет пакеты как и trafd. юзайте ng_ipacct!
Maikeru, 2007-10-16 в 8:53:09
я так понимаю ограничения в количестве интерфейсов для повсчета и системные требования ipacctd и trafd одинаковы?
valerakr.net, 2007-12-11 в 23:24:11
Вопрос:
умеет ли он считать на нодах mpd?
Dushes, 2008-01-02 в 16:17:34
ага ещё бы хоть кто нить внятно написал как поднять этот ng_ipacct ...
Dushes, 2008-01-02 в 19:00:50
насчёт даты я думаю правельнее будет так
my $datetime = localtime (time);
$hour = $datetime->hour();
$min = $datetime->min();
$sec = $datetime->sec();
$mday = $datetime->mday();
$mon = $datetime->mon() + 1;
$year = $datetime->year() + 1900;
Luck, 2008-01-08 в 14:22:39
Внятно о ng_ipacct
http://lcl.sytes.net:3880/doc/netgraph.html
Inri, 2008-12-28 в 20:48:00
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}'`
paketov=`echo "${stroka}" | awk '{print $7}'`
etc...
=
cat /var/log/traffic_${iface}.log | while read from_IP port_from_IP to_IP port_to_IP protocol bytes paketov
lissyara, 2008-12-28 в 21:14:28
Если столбцов окажется больше - что будет в последней переменной?
adre, 2009-06-14 в 10:17:11
Поменял что ли переменный ipacctd в rc.conf? раньше по другому было вроде...
max, 2010-02-16 в 9:21:53
Во первых, Спасибо to lissyara. Много что позаимствовано, и много, что подтолкнуло в нужную сторону благодаря данному ресурсу.
Второе. Возможно не я первый но...
Большая часть кода (perl или sh) по большому счету используется для построчного добавления данных в БД и главное добавления даты и времени в строки полученные от ipacctd. Долго. Ресурсоемко.
Для того чтоб данные запихивались в БД совсем быстро можно применить оператор SQL «LOAD DATA INFILE»:
LOAD DATA INFILE '/путь/к/файлу' INTO TABLE 'имя_таблицы' (souceip,sport,destip,dport,proto,bytes,pkts) SET date=DATE(NOW()), time=TIME(NOW()).
Поля 'uniq_id' и 'unix_time' не используются, но и это не проблема.
К примеру пихаем 1`100`000 строк в БД.
Скрипт на perl (по принципу описанному в статье) отработал за 9 минут.
sh скрипт, а собственно не важно на чем написан, с применением LOAD DATA INFILE отрабатывает за 6 секунд!
Все это довольно несложно реализуется.
Еще раз, сенькю Лиссяре.
Pattern®, 2011-09-19 в 12:11:53
Прикольная програмулина, хорошая замена trafd.
Lissyara, как всегда - отличная работа!
Единственный минус ipacctd в том, что он не пишет в лог время чтения пакета. А время, которое вбивается скриптом в БД, является текущим по отработке самого скрипта. И при средней нагрузке за одну минуту набивается 2к-3к записей, но при методе написанным max'ом, все эти записи отличаются 2-3 секунды. Пока с этим не сталкиваешься, не обращаешь внимания. Чисто как подсчет общего трафика - ipacctd самодостаточен. Но если из всех данных нужно выбрать какой то конкретный за определенный период, получаешь свалку логов.
freesky, 2014-02-04 в 2:41:18
Спасибо Лису большое за статью!
Хочу присоединиться к комментарию max и добавить свои 5 копеек. Не очень удобно то, что в БД записи, содержащие дату/время будут содержать их сдвинутыми на то число секунд (минимум, а то и более), чем указано в sleep. Поэтому предлагаю воспользоваться MySQL'ными функциями для выгребания кругленькой даты из текущей. Вот мой кусок перлового кода, пихающий всю эту радость из лога в БД:
$dbh->do("LOAD DATA INFILE '/var/log/traffic_$iface.log' INTO TABLE traffic_tmp (ip_from, s_port, ip_to, d_port, proto, bytes, packets) SET datetime = STR_TO_DATE(CONCAT(DATE(NOW()), ' ', TIME(CONCAT(HOUR(TIME(NOW())), ':00:00'))), '%Y-%m-%d %H:%i:%s')");
Обратите внимание, здесь нет полей date и time по отдельности - я предпочитаю использовать совмещённое datetime для дальнейшего облегчения поиска по БД при построении отчёта
nikola93, 2015-03-04 в 13:39:22
У кого ошибка Can't locate Mysql.pm in @INC
выложил на форум исправление
http://forum.lissyara.su/viewtopic.php?f=3&t=361&sid=9fd2a0d1eea4ab83b5026ba72e17184a&start=75
nikola93, 2015-03-04 в 13:40:24
Пост nikola93 » 2015-03-04 14:35:52
nikola93, 2015-03-04 в 13:40:26
Пост nikola93 » 2015-03-04 14:35:52
Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.
© lissyara 2006-10-24 08:47 MSK
Комментарии пользователей [29 шт.]