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
3 коментарі “Подсчет трафика на Freebsd с использованием trafd и без mysql”
Здравствуйте, Спасибо за статю, сделал как тут и все работает на ура, потому как мне нужно было я и внутренный трафик тоже собираю. Есть одно но, дела в том что тут считается весь трафик и кто скачаль с какого IP (имеется в виду локальные адреса) не показывается. В логах выдается только внешный адрес самого сервера. Второе, как мне его запустить через каждые 2-3 минуты? Ещё раз спасибо, причем ОГРОМНОЕ, потому как я уже целых 2 недели как ишу и все старе, настраиваю но не дают резултата, а тут уже почти что совершилось чудо.
Привет.
Видимо у тебя указан внешний интерфейс. Попробуй в настройках указать внутренний.
Второе: добавить в /etc/crontab такую строчку (пример для каждые 3 минуты)
*/3 * * * * root trafd_dump
2 комментария: Подсчет трафика на Freebsd с использованием trafd и без mysql
Umar говорит:
Здравствуйте, Спасибо за статю, сделал как тут и все работает на ура, потому как мне нужно было я и внутренный трафик тоже собираю. Есть одно но, дела в том что тут считается весь трафик и кто скачаль с какого IP (имеется в виду локальные адреса) не показывается. В логах выдается только внешный адрес самого сервера. Второе, как мне его запустить через каждые 2-3 минуты? Ещё раз спасибо, причем ОГРОМНОЕ, потому как я уже целых 2 недели как ишу и все старе, настраиваю но не дают резултата, а тут уже почти что совершилось чудо.