Мой опыт использования ng_ipacct

Система учета трафика ng_ipacct работает с использованием netgraph и выполнена в виде подгружаемого модуля ядра. Новая реализация проекта ipacctd. Формат управления и статистики похожи на Cisco ip accounting. На мой взгляд - одна из лучших систем учета трафика для FreeBSD, когда требуется подробная статистика. Т. е. не только количество байт, которое скачал клиент, но и откуда (с каких ip) скачал и по какому протоколу (и каким портам). Помогает при разрешении спорных ситуаций и выявлении разичных аномалий (например, сетевых червей). Автор ng_ipacct - Роман Палагин.

Установить не сложно:

cd /usr/ports/net-mgmt/ng_ipacct make install clean
Для FreeBSD 5 лучше поставить галочку напротив опции MEM_ZONE

Использовать несколько сложнее. Желательно (хотя не обязательно) представлять, что такое Нетграф и как он работает. Можно почитать статью All About Netgraph на daemonnews или её перевод на русский.

Чтоб модуль начал работать и собирать статистику его нужно подключить.

Один из наиболее удобных способв - подключть его к узлу ng_ether через ng_tee. Схематично это показано ниже:

ng_ipacct <-> ng_tee <-> ng_ether

Подключение к ng_ether далеко не единственный вариант, netgraph позволяет очень гибко организовать учет трафика. Можно, например подключить его к ng_bpf(4) и считать только пакеты, которые удовлетворяют определенному условию, а можно через ng_ksocket(4) принимать пакеты из ipfw tee

При установке порта ставится скрипт, который подключает ng_ipacct к ng_ether через ng_tee, и нужно только подредактировать конфиг
/usr/local/etc/ng_ipacct.conf
Там изменяем следующие параметры:

ng_ipacct_enable="YES" ng_ipacct_modules_list="netgraph ng_ether ng_ipacct" # указываем интерфейсы на котрых нужно считать трафик ng_ipacct_interfaces="tx0" ng_ipacct_tx0_dlt="EN10MB" # required line; see ipacctctl(8) ng_ipacct_tx0_threshold="10000" # '5000' by default ng_ipacct_tx0_verbose="yes" # 'yes' by default ng_ipacct_tx0_start=${ng_ipacct_default_ether_start} ng_ipacct_tx0_stop=${ng_ipacct_default_ether_stop} # об этом скрипте будет сказано ниже. ng_ipacct_tx0_checkpoint_script="/root/scripts/ipacct.sh tx0"

Далее эту информацию нужно периодически считывать. Очень похоже на ip accounting в циске.

По команде checkpoint данные переносятся из активной базы в checkpoint базу где их можно посмотреть командой show.

У меня раз в 10 минут запускается скрипт ipacct.sh, который считывает эти данные и скалывает в лог, а раз в сутки эти текстовые логи архивируются скриптом ipacct-comress.sh.

Скрипт ipacct.sh указан в конфиге и если выполнить команду /usr/local/etc/rc.d/ng_ipacct.sh checkpoint то он будет выполнен для каждого интерфейса.

В кроне прописано:

*/10 * * * * /usr/local/etc/rc.d/ng_ipacct.sh checkpoint 7 4 * * * /root/scripts/ipacct-comress.sh

Перед запуском скриптв нужно создать директорию где будут храниться логи: mkdir /var/log/ipacct/

В принципе несложно сделать так, чтоб суммарные данные складывались в sql-базу, просто у меня задача была другая - иметь максимально подробные логи, в случае чего по которым можно посмотреть достаточно подробную информацию по трафику. Извлекаются нужные данные из логов самописными перловыми скриптами.

И еще есть очень важный параметр treshold. Он определяет сколько данных может накопить в внутренних структурах ng_ipacct.

Если его сделать маленьким, то данные будут теряться при большом трафике. Если его сделать слишком большим, то не исключены проблемы из за нехватки памяти в ядре.

К счастью если трешхолда не хватает, и данные теряются он об этом явно говорит. У меня вывод скрипта ipacct.sh шлется на почту, и если трешхолд будет превышен, об этом придет письмо.

По этому я бы рекомендовал при 128 метрах оперативки начать с 5000 и если этого не будет хватать, постепенно увеличивать.

Нагрузка на процессор от ng_ipacct минимальная, поскольку он работает в ядре и нет дополнительных накладных расходов, которые присутствуют при других методах учета, например через divert.

Если памяти мало вместо увеличения трешхолда можно чаще снимать данные, например раз в 3 минуты. Но тогда логи будут занимать больше места на диске.

еще мне пришлось зафильтровать 445 порт на маршрутизаторах локальной сети, чтобы трафик, котрый в большом объеме генерирует эпидемия червя Sasser не доходил до шлюза где работает ng_ipacct. Во время эпидемии червя treshold постоянно превышался, да и логи архивированном виде были больше 200 Мб в день.


Южанинов Антон <citrin [at] citrin.ru>, сентябрь 2004 г.