Итак начнем =). Возникла задача точно считать ВЕСЬ трафик с максимальной детализацией. Полез в инет искать готовые решения. Нашел кучу: SAMS NETAMS SARG IPACCT и другие...
Но неустравивал функционал систем. Не гибко, проблемы с установкой, конфигурированием, трудно "подстраивать под себя". И решил искать альтернативу и делать "что-то свое". Скажу сразу что получилась связка ng_ipacct+squid+парсер логов+авторизатор+nginx+mysql и куча служебных скриптов для работы всей системы. Я назвал ее АСУТ (Автоматизированная система управления трафиком)
Часть 1. Установка ng_ipacct
Что такое ng_ipacct? Это NETGRAPH модуль ядра который представляет из себя TEE ноду NETGRAPH, перехватывает все пакеты проходящие через указанный интерфейс, суммирует байты по адресам и протоколам, хранит все это в памяти, и по сигналу скидывает собранные данные в файл. Так как это модуль ядра то сбор данных практически не сказывается на работе системы. Мне не удалось заметить сколь либо ощутимой загрузки средненького целерона даже при трафике 100 Мбит через интерфейс =)
cd /usr/ports/net-mgmt/ng_ipacct
make install clean
Оставляем опции по умолчанию Тут можно добавить: в руководствах рекомендуют при каждой следующей пересборке ядра ставить ng_ipacct снова т.к. это все таки модуль ядра и пересборке он удаляется, но исходя из личного опыти после пересборки ядрая я забывал ставить ng_ipacct и тем не менее его модуль загружался и он работал.
Далее правим конфиг /usr/local/etc/ng_ipacct.conf
# указываем интерфейс на котором считать трафик
# не забываем менять bce1 во всем конфиг файле,
# еще ниже встречается несколько раз
ng_ipacct_interfaces="bce1"
ng_ipacct_modules_load="YES"
ng_ipacct_modules_list="netgraph ng_ether ng_ipacct"
ng_ipacct_default_ether_start='
mkpeer %%iface%%: tee lower right
name %%iface%%:lower %%iface%%_tee
connect %%iface%%: lower upper left
mkpeer %%iface%%_tee: ipacct right2left %%iface%%_in
name %%iface%%_tee:right2left %%iface%%_ip_acct
connect %%iface%%_tee: %%iface%%_ip_acct: left2right %%iface%%_out
'
ng_ipacct_default_ether_stop='
shutdown %%iface%%_ip_acct:
shutdown %%iface%%_tee:
shutdown %%iface%%:
'
ng_ipacct_bpf_ether_start='
mkpeer %%iface%%: tee lower right
name %%iface%%:lower %%iface%%_tee
connect %%iface%%: lower upper left
mkpeer %%iface%%_tee: bpf right2left %%iface%%_in
name %%iface%%_tee:right2left %%iface%%_bpf
connect %%iface%%_tee: right2left left2right %%iface%%_out
mkpeer %%iface%%_bpf: ipacct %%iface%%_match_in %%iface%%_in
name %%iface%%_bpf:%%iface%%_match_in %%iface%%_ip_acct
connect %%iface%%_bpf: %%iface%%_ip_acct: %%iface%%_match_out %%iface%%_out
'
ng_ipacct_bpf_ether_stop='
shutdown %%iface%%_ip_acct:
shutdown %%iface%%_bpf:
shutdown %%iface%%_tee:
shutdown %%iface%%:
'
ng_ipacct_bce1_dlt="EN10MB" # required line; see ipacctctl(8)
# 10000 записей будет хранится в памяти. чем больше
# RAM тем больше можно ставить значение
# из личного опыта 10000 записей при сбросе дампа
# каждые 2 минуты хватает даже при больших нагрузках канала
# в том случае если будет превышено значение и все 10000
# будут заполнены
# все лишние записи просто не будут учитыватся и статистика "пропадет"
ng_ipacct_bce1_threshold="10000" # '5000' by default
ng_ipacct_bce1_verbose="yes" # 'yes' by default
ng_ipacct_bce1_start=${ng_ipacct_default_ether_start}
ng_ipacct_bce1_stop=${ng_ipacct_default_ether_stop}
# указываем на имя скрипта для сброса лога
ng_ipacct_bce1_checkpoint_script="/var/asut/ipacct.sh bce1"
содержимое скрипта /var/asut/ipacct.sh этот скрипт заставляет ng_ipacct сбросить собранную статистику в файл лога
#!/bin/sh
IPACCTCTL="/usr/local/sbin/ipacctctl"
IFACE=$1
# каталог куда скидывать лог файл
DIR=/var/asut/ipacct
if [ ! -e "$DIR" ]; then
mkdir $DIR
fi
NAME="ng_ipacct.log"
$IPACCTCTL ${IFACE}_ip_acct:$IFACE checkpoint
$IPACCTCTL ${IFACE}_ip_acct:$IFACE show >> $DIR/$NAME
$IPACCTCTL ${IFACE}_ip_acct:$IFACE clear
/usr/bin/tail -1 $DIR/$NAME | /usr/bin/fgrep exceed
Для того чтобы заставить ng_ipacct сбрасывать дамп теперь нужно выполнить команду