Ключевые слова:netgraph, traffic, freebsd, (найти похожие документы)
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.
В кроне прописано:
*/10 * * * * /root/scripts/ipacct.sh
7 4 * * * /root/scripts/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.
#
#####################################################################################
IPACCTCTL="/usr/local/sbin/ipacctctl"
IFACE="xl0"
DIR=/var/log/ipacct
SDIR=`date -v-9M "+%Y-%m-%d"`
if [ ! -e "$DIR/$SDIR" ]; then
mkdir $DIR/$SDIR
fi
NAME=`date -v-9M "+%Y-%m-%d-%H"`
$IPACCTCTL ${IFACE}_ip_acct:$IFACE checkpoint
$IPACCTCTL ${IFACE}_ip_acct:$IFACE show >> $DIR/$SDIR/$NAME
$IPACCTCTL ${IFACE}_ip_acct:$IFACE clear
/usr/bin/tail -1 $DIR/$SDIR/$NAME | /usr/bin/fgrep exceed
#!/bin/sh
# http://citrin.pp.ru/my/ipacct-comress.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.
#
#####################################################################################
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
#!/bin/sh
# http://citrin.pp.ru/my/030.ng_ipacct_init.sh
# ng_ipacct traffic counter
#
# memory size approximately ((threshold * 40) + (8192 * sizeof(void *))) in FreeBSD 5
THRESHOLD=3000
VERBOSE=1
IPACCTCTL="/usr/local/sbin/ipacctctl"
INTERFACES="xl0"
case "$1" in
start)
# XXX should check via kldstat is module already loaded
/sbin/kldload netgraph > /dev/null 2>&1
/sbin/kldload ng_ether > /dev/null 2>&1
/sbin/kldload ng_socket > /dev/null 2>&1
/sbin/kldload ng_tee > /dev/null 2>&1
/sbin/kldload ng_ipacct > /dev/null 2>&1
for IFACE in $INTERFACES; do
/usr/sbin/ngctl mkpeer ${IFACE}: tee lower right
/usr/sbin/ngctl connect ${IFACE}: lower upper left
/usr/sbin/ngctl name ${IFACE}:lower ${IFACE}_acct_tee
/usr/sbin/ngctl mkpeer ${IFACE}_acct_tee: ipacct right2left ${IFACE}_in
/usr/sbin/ngctl name ${IFACE}_acct_tee:right2left ${IFACE}_ip_acct
/usr/sbin/ngctl connect ${IFACE}_acct_tee: ${IFACE}_ip_acct: left2right ${IFACE}_out
$IPACCTCTL ${IFACE}_ip_acct:$IFACE verbose $VERBOSE
$IPACCTCTL ${IFACE}_ip_acct:$IFACE threshold $THRESHOLD
done
;;
stop)
for IFACE in $INTERFACES; do
/usr/sbin/ngctl shutdown ${IFACE}_acct_tee:
/usr/sbin/ngctl shutdown ${IFACE}:
done
/sbin/kldunload ng_ipacct
;;
*)
echo ""
echo "Usage: `basename $0` { start | stop }"
echo ""
;;
esac