Документация по ОС FreeBSD Пятница, 31.01.2025, 02:20
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Net

Подсчет трафика с помощью ng_ipacct [2008]
Итак начнем =). Возникла задача точно считать ВЕСЬ трафик с максимальной детализацией. Полез в инет искать готовые решения. Нашел кучу:
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 сбрасывать дамп теперь нужно выполнить команду
/usr/local/etc/rc.d/ng_ipacct checkpoint

Желательно добавить ее в /etc/cron
echo '
*/2 * * * * root /usr/local/etc/rc.d/ng_ipacct checkpoint
' >> /etc/cron

/etc/rc.d/cron restart

Вот пример лога
192.168.0.222 1245 195.24.228.3 22 6 199 8428
192.168.0.222 1462 195.24.228.3 22 6 18 772
192.168.0.222 1458 195.151.80.6 22 6 112 4688
192.168.0.222 1731 195.24.228.2 110 6 2 88
192.168.0.222 1464 195.151.80.6 22 6 18 824
192.168.0.222 4567 192.168.0.28 4582 6 13 760
195.24.228.3 22 192.168.0.222 1245 6 351 105260
195.24.228.3 22 192.168.0.222 1462 6 19 11632
195.151.80.6 22 192.168.0.222 1458 6 191 49240
195.24.228.2 110 192.168.0.222 1731 6 1 48
195.151.80.6 22 192.168.0.222 1464 6 20 13544
192.168.0.28 4582 192.168.0.222 4567 6 18 2228

столбцы слева нправо:
адрес источника
порт источника
адрес получателя
порт получателя
номер протокола (6-tcp)
пакетов
байт

Все! Осталось добавить в /etc/rc.conf
echo '
ng_ipacct_enable="YES"
' >> /etc/rc.conf

Возможно после загрузки будут сыпатся сообщения типа
root: /etc/rc: WARNING: can not load kld module netgraph
kernel: module_register: module ng_ether already exists!
kernel: Module ng_ether failed to register: 17
root: /etc/rc: WARNING: can not load kld module ng_ether

тем не менее ng_ipacct работает стабильно не на одном десятке серверов :)

Часть 2. Парсер логов в мускул
в разработке... скоро допишу :)



Источник: http://www.lissyara.su/?id=1750
Категория: Net | Добавил: oleg (14.09.2008) | Автор: arksu
Просмотров: 1039 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2025