From: Южанинов А. В. <citrin dog citrin.ru>
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Использование ng_ipacct
Оригинал: http://citrin.pp.ru/my/ng_ipacct.html
Мой опыт использования ng_ipacct
Система учета трафика ng_ipacct работает с использованием netgraph и
выполнена в виде подгружаемого модуля ядра. Новая реализация проекта
ipacctd. Формат управления и статистики похожи на Cisco ip accounting.
На мой взгляд - одна из лучших систем учета трафика для FreeBSD, когда
требуется подробная статистика. Т. е. не только количество байт,
которое скачал клиент, но и откуда (с каких ip) скачал и по какому
протоколу. Помогает при разрешении спорных ситуаций и выявлении
аномалий (например, сетевые черви). Автор ng_ipacct - Роман Палагин.
Установить не сложно:
fetch ftp://ftp.wuppy.net.ru/pub/FreeBSD/local/kernel/ng_ipacct/ng_ipacct-20040109.tar.gz
tar -xzf ng_ipacct-20040109.tar.gz
cd ng_ipacct
make
make install
Для FreeBSD 5 нужно использовать ng_ipacct-20040109-freebsd5.tgz. На
момент написания заметки версия для 5.3 еще не была выпущена. Я ставил
под 5.2.1
Ман там на русском в koi8-r. Не знаю как в 4-ке, а в 5.2.1 это ман
нечитался из за того, что некорректно преформатироваплся ман в кои8.
Чтоб его можно было читать, пришлось это сделать ручками:
zcat /usr/share/man/man8/ipacctctl.8.gz | nroff -man | gzip >
/usr/share/man/cat8/ipacctctl.8.gz
И еще в мане есть опечатка, там написано В случае использования опции
verbose статистика выводится в виде:
ip_from s_port ip_to d_port proto bytes packets А на самом деле (по
крайней мере, в версии 20040109 для 5-ки) ip_from s_port ip_to d_port
proto packets bytes
Использовать несколько сложнее. Желательно (хотя не обязательно)
представлять, что такое Нетграф и как он работает. Можно почитать
статью All About Netgraph на daemonnews (http://www.daemonnews.org/200003/netgraph.html)
или её перевод на русский (http://citrin.pp.ru/daemonnews/netgraph.html).
Чтоб он начал работать и собирать статистику его нужно подключить.
Примеры скриптов есть в каталоге scripts в архиве с ng_ipacct
Я сделал скрипт для инициализации на его базе,
030.ng_ipacct_init.sh и кинул его в /usr/local/etc/rc.d/
Далее эту информацию нужно периодически считывать. Очень похоже на ip
accounting в циске.
По команде checkpoint данные переносятся из активной базы в checkpoint
базу где их можно посмотреть командой show.
У меня раз в 10 минут запускается скрипт ipacct.sh, который
считывает эти данные и скалывает в лог, а раз в сутки эти текстовые
логи архивируются скриптом ipacct-comress.sh.
В принципе несложно сделать так, чтоб суммарные данные складывались в
базу, просто у меня задача была другая - иметь максимально подробные
логии, в случае чего по которым можно посмотреть достаточно подробную
информацию по трафику. Извлекается она оттуда самописными перловыми
скриптами.
И еще есть очень важный параметр treshold Он определяет сколько данных
может накопить в внутренних структурах ng_ipacct.
Если его сделать маленьким, то данные будут теряться при большом
трафике.
Если сделать очень большим, то в 5.2.1 возможна паника ядра. Как с
этим в 4-ке не знаю.
К счастью если трешхолда не хватает, и данные теряются он об этом явно
говорит. У меня вывод скрипта ipacct.sh шлется на почту, и если
трешхолд будет превышен, об этом придет письмо.
По этому я бы рекомендовал при 128 метрах оперативки начать с 5000 и
если этого будет нахватать, постепенно увеличивать.
Нагрузка на процессор от ng_ipacct минимальная, поскольку он работает
в ядре и нет дополнительных накладных расходов, которые присутствуют
при других методах учета, например через divert.
Если памяти мало вместо увеличения трешхолда можно по чаще снимать
данные, например раз в 3 минуты. Но тогда логи будут занимать больше
места на диске.
445 порт мне пришлось зафильтровать на маршрутизаторах локальной сети,
чтобы трафик, котрый в большом объеме генерирует эпидемия червя Sasser
не доходил до шлюза где работает ng_ipacct. Трешхолда не стало хватать
именно из-за него, да и логи в архивированном виде были больше 200 Мб
в день.
Южанинов Антон <citrin@mail.ru.>, сентябрь 2004 г.
#!/bin/sh
# http://citrin.pp.ru/my/ipacct.sh
#
# Written by Anton V. Yuzhaninov <citrin % mail.ru>
# traffic logger based on ng_ipacct by Roman V. Palagin
# ftp://ftp.wuppy.net.ru/pub/BSD/FreeBSD/local/kernel/ng_ipacct/
# File name format
# YYYY-MM-DD-hour
#####################################################################################
#
# Формат лога
# При использовании команды show выводится содержимое checkpoint базы данных в формате
# ip_from ip_to packets bytes
# Этот формат аналогичен выводу команды IOS show ip accounting
# В случае использования опции verbose статистика выводится в виде:
#
# ip_from s_port ip_to d_port proto packets bytes
#
# Если proto - ICMP, то s_port - ICMP type, d_port - ICMP sub-code.
#
#####################################################################################
# Written by Anton V. Yuzhaninov <citrin % mail.ru>
# traffic logger based on ng_ipacct by Roman V. Palagin
# ftp://ftp.wuppy.net.ru/pub/BSD/FreeBSD/local/kernel/ng_ipacct/
# File name format
# YYYY-MM-DD-hour
#####################################################################################
#
# Формат лога
# При использовании команды show выводится содержимое checkpoint базы данных в формате
# ip_from ip_to packets bytes
# Этот формат аналогичен выводу команды IOS show ip accounting
# В случае использования опции verbose статистика выводится в виде:
#
# ip_from s_port ip_to d_port proto packets bytes
#
# Если proto - ICMP, то s_port - ICMP type, d_port - ICMP sub-code.
#
#####################################################################################
DIR=/var/log/ipacct
SDIR=`date -v-1d "+%Y-%m-%d"`
files=`ls $DIR/$SDIR`
for file in $files; do
nice /usr/bin/gzip $DIR/$SDIR/$file
# даем процесору и винту отстыть
sleep 150
done
# delete old logs (older than 180 days)
find $DIR -mtime +180 -mindepth 1 -delete