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

0) Введение.

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


Что имеем: FreeBSD 7.0, установлен squid, ядро собрано с поддержкой divert, dummynet, ipfw.
Кое-что почерпнул из статьи http://www.tmeter.ru/misc/trafd, поэтому кое-что может пересекаться.

1) Установка и начальная подготовка 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. Поменять это значение вроде бы нельзя, но можно создать симлинк.

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

И так, вот это скрипт (trafd_dump) будет запускаться раз в 15 минут, и будет сливать так называемый «дамп» траффика (файл trafd_dump):

#!/bin/sh
/usr/local/bin/trafdump sis0

Этот скрипт будет запускаться под конец суток и сохранять статистику за сутки в бинарный файл (файл trafd_save)

#!/bin/sh
/usr/local/bin/trafsave sis0

И ещё один скрипт, который статистику переводит в текстовый формат (файл 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. Вот он (файл trafd_stat)

#!/bin/sh
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 | /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="     "} $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

Немного поясню данный скрипт.

/usr/bin/awk ‘ $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ‘ — исключает внутренние ресурсы именно из поля From
/usr/bin/awk ‘ $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ‘ — тоже самое, но из поля To.
Тут самое важно заметить: 10.0.9.100 — внутренний ИП шлюза, остальное внутренние ресурсы. Собственно исключаем подсчёт именно внутреннего траффика (то есть, обращение компов в другие локальные подсети) . Так же важно заметить, что подсчёт идёт для подсети 10.0.9.0/24, саму её из этих полей исключать нельзя, ибо потом собственно нечего будет считать.
/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}’ — собственно подсчёт траффика.
/usr/bin/awk ‘ {OFS=»             «} $2 = int($2/1048576) {print $2,$1}’ | /usr/bin/sort -fnr >> $fstatup — вывод траффика в МБ и сортировка во убыванию.

В конце скрипта можно добавить фичу, что бы удалялись старые файлы отчётов, например, старше 7 дней:

for i in `/usr/bin/find /usr/local/var/trafd -atime +7d -type f`
do
/bin/rm -f "$i"
done

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

  1. Golibshoh

    Здравствуйте, Спасибо за статю, сделал как тут и все работает на ура, потому как мне нужно было я и внутренный трафик тоже собираю. Есть одно но, дела в том что тут считается весь трафик и кто скачаль с какого IP (имеется в виду локальные адреса) не показывается. В логах выдается только внешный адрес самого сервера. Второе, как мне его запустить через каждые 2-3 минуты? Ещё раз спасибо, причем ОГРОМНОЕ, потому как я уже целых 2 недели как ишу и все старе, настраиваю но не дают резултата, а тут уже почти что совершилось чудо.

  2. skeletor Автор записи

    Привет.
    Видимо у тебя указан внешний интерфейс. Попробуй в настройках указать внутренний.
    Второе: добавить в /etc/crontab такую строчку (пример для каждые 3 минуты)

    */3 * * * * root trafd_dump

  3. Umar

    2 комментария: Подсчет трафика на Freebsd с использованием trafd и без mysql
    Umar говорит:

    Здравствуйте, Спасибо за статю, сделал как тут и все работает на ура, потому как мне нужно было я и внутренный трафик тоже собираю. Есть одно но, дела в том что тут считается весь трафик и кто скачаль с какого IP (имеется в виду локальные адреса) не показывается. В логах выдается только внешный адрес самого сервера. Второе, как мне его запустить через каждые 2-3 минуты? Ещё раз спасибо, причем ОГРОМНОЕ, потому как я уже целых 2 недели как ишу и все старе, настраиваю но не дают резултата, а тут уже почти что совершилось чудо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *