Подсчет трафика на Freebsd используя trafd без mysql


Решил написать свою статью по управлению трафика. Мне нужно было ещё формировать статистику (отдельно upload и download), и исключить из неё внутрисетевой трафик, то есть считать только чисто интернет: кто сколько накачал. В сети есть много примеров, но они почему-то используют Mysql. Шлюз у меня немощный, да и лишний сервис подымать только что бы хранить статистику - для моих целей не нужно было. Поэтому и решил: статистика будет храниться в файлах, будет суммироваться трафик и отправляться на e-mail.

Что имеем: FreeBSD 7.0, установлен squid, ядро собрано с поддержкой divert, dummynet, ipfw.

Базу почерпнул из статьи http://www.tmeter.ru/misc/trafd/, поэтому кое-что может пересекаться.

Установка и начальная подготовка trafd.

Trafd ставим из портов.
cd /usr/ports/net/trafd
make install clean

Вместе с ним ставятся

# trafd - демон сбора трафика
# trafdump/trafsave - программы для записи собранного трафика демоном trafd в бинарный формат
# traflog - программа для преобразования бинарных файлов трафика в тестовый формат
Для запуска демона при загрузке ОС, в /etc/rc.conf прописываем такое
trafd_enable="YES"
trafd_ifaces="sis0"
trafd_flags="-r -p"
trafd_log="/var/log/traffic.log"

Я добавил один интерфейс, но можно и несколько (через пробел)

Параметр -r означает попытку восстановления данных из существующего бинарного файла при рестарте демона.

Параметр -p означает то, что переводить сетевой адаптер в promiscuous mode не надо (по умолчанию, демон trafd переводит сетевой адаптер в
promiscuous mode)

ВНИМАНИЕ! trafd кладёт дамп трафика по адресу /usr/local/var/trafd.
Поменять это значение вроде бы нельзя, но можно создать симлинк.

Скрипты для сбора, обработки и отправки статистики.

И так, вот это скрипт (trafd_dump) будет запускаться раз в 15 минут, и будет сливать так называемый “дамп” трафика.
#cat trafd_dump
#!/bin/sh

/usr/local/bin/trafdump sis0

Этот скрипт будет запускаться под конец суток и сохранять статистику за сутки в бинарный файл.
#cat trafd_save
#!/bin/sh

/usr/local/bin/trafsave sis0

И ещё один скрипт, который статистику переводит в текстовый формат.
#cat trafd_daily
#!/bin/sh

date=`date -v-1d '+%Y%m%d'`
fp=/usr/local/var/trafd/$date
fn=/usr/local/var/trafd/plain/$date

cp /usr/local/var/trafd/trafd.sis0 $fp.sis0
rm /usr/local/var/trafd/trafd.sis0

/usr/local/bin/traflog -a -n -i $fp.sis0 >> $fn.sis0

/scripts/trafd_stat

который в конце вызывает скрипт обработки и отправки отчёта на e-mail.
Вот он.
#cat trafd_stat
#!/bin/sh

/bin/date=`date -v-1d '+%Y%m%d'`

path=/usr/local/var/trafd/plain

fn=$path/${date}.sis0
fstatup=$path/stat.${date}.upload.txt
fstatdown=$path/stat.${date}.download.txt

/bin/rm -f $fstatup
/bin/rm -f $fstatdown

/bin/echo `date -v-1d "+DATE: %Y-%m-%d"` >> $fstatup
/bin/echo "Upload Traffic" >> $fstatup
/bin/echo "Traffic (Mb) IP address" >> $fstatup
/bin/echo "" >> $fstatup

/bin/echo `date -v-1d "+DATE: %Y-%m-%d"` >> $fstatdown
/bin/echo "Download Traffic" >> $fstatdown
/bin/echo "Traffic (Mb) IP address" >> $fstatdown
/bin/echo "" >> $fstatdown

/bin/cat $fn | awk ' $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} '
| /usr/bin/awk ' $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} '
| /usr/bin/awk ' {OFS=" "} $1~/10.0.9./ {print $1,$7} ' | /usr/bin/sort -fn
| /usr/bin/awk '{sum[$1]+=$2}END{for(i in sum) print i,sum[i]}'
| /usr/bin/awk ' {OFS=" "} $2 = int($2/1048576) {print $2,$1}' | /usr/bin/sort -fnr >> $fstatup
/bin/cat $fstatup | /usr/bin/mail -s "Statistics for upload" skeletor@mydomain.com

/bin/cat $fn | /usr/bin/awk ' $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} '
| /usr/bin/awk ' $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} '
| /usr/bin/awk ' {OFS=" "} $3~/10.0.9./ {print $3,$7} ' | sort -fn
| /usr/bin/awk '{sum[$1]+=$2}END{for(i in sum) print i,sum[i]}'
| /usr/bin/awk ' {OFS=" "} $2 = int($2/1048576) {print $2,$1}' | /usr/bin/sort -fnr >> $fstatdown
/bin/cat $fstatdown | /usr/bin/mail -s "Statistics for download" skeletor@mydomain.com

/bin/rm -f $fstatup
/bin/rm -f $fstatdown

Немного поясню данный скрипт.
Вот эта строчка
$1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./

исключает их статистики внутренние подсети (локалка у меня имеет подсеть 10.0.9.0/24) (я считал только инет-трффик, внутрисеть не считал). Можете поменять на свои :)

Кстати, то же самое я делаю и для третьего поля.
$3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./

ибо trafd пишет статистику в таком виде
from_IP type to_IP ...

$2 = int($2/1048576) - это я перевожу из байт в мегабайты.

Дальше по скрипты сортирую по максимальному значению и отправляю на e-mail.
То же самое делается и для статистики download.

Вот собственно и всё.

Отсчёт приходит в таком виде.
DATE: 2008-12-04
Upload Traffic
Traffic (Mb) IP address

16 10.0.9.55
11 10.0.9.58
9 10.0.9.63
6 10.0.9.61
4 10.0.9.64
4 10.0.9.59
4 10.0.9.54
3 10.0.9.62
3 10.0.9.60
2 10.0.9.66
2 10.0.9.57
1 10.0.9.56

http://faqman.ru

Обновлено: 12.03.2015