Настройка системы учета трафика на базе Cacti, SNMP, bpft, FreeBSD [2009]
Система:
FreeBSD 7.1, jail-ы с помощью ezjail-3.0 с выделенными IP на одном интерфейсе
Цель:
Мониторинг всего трафика (исходящий/входяший) по каждому из jail. Фактически будем считать по каждому IP
Возможности применения:
Мониторинг наборов пользовательских потоков
Требования:
Непосредственно: Cacti, SNMP, bpft Необходимо также: bpf фильтр в ядре, bttp сервер Apache, сервер баз данных mySQL
Реализация:
Инсталлируем Cacti из портов
cd /usr/ports/net-mgmt/cacti make make install
по окончании установки следуем полученным инструкциям (сообщение инсталлятора):
1. Создаем БД в MySQL:
# mysqladmin --user=root create cacti
2. Устанавливаем логин пароль для cacti: (change user and/or password if requered)
# echo "GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY ''cactiuser''; FLUSH PRIVILEGES;" | mysql
3. Импортируем БД cacti:
# mysql cacti < /usr/local/share/cacti/cacti.sql
4. Настраиваем соедниение к базе данных mySQL для Cacti в файле /usr/local/share/cacti/include/db-settings.php если ничего не меняли в инициализации базы данных (см. предыдущий пункт), примерно так:
/* make sure these values refect your actual database/host/user/password */ $database_type = "mysql"; $database_default = "cacti"; $database_hostname = "localhost"; $database_username = "cactiuser"; $database_password = "cacti"; $database_port = "3306"; ?>
создаём конфигурационный файл /usr/local/etc/snmp/snmpd.conf и пишем в него строки
syslocation "Мой город, улица" syscontact moj-email@moj-server.com
com2sec readonly default PASSWORD group MyROGroup v1 readonly group MyROGroup v2c readonly view all included .1 80 access MyROGroup "" any noauth exact all none none
запускаем демон SNMP
/usr/local/etc/rc.d/snmpd.sh start
пробуем получить ответ от демона SNMP
snmpwalk -v 2c -c PASSWORD localhost system
должен вернуть список переменных с ключами
Инсталлируем bpft4(trafd) из портов
cd /usr/ports/net-mgmt/bpft make make install
Создаём конфигурационный файл и пишем в него строки (в моём случае это интерфейс em0)
# trafd configuration file
# interfaces to proceed #IFF_LISTEN="eth0 eth1" IFF_LISTEN="em0"
# options for trafd (-pr - default options) # Don''t use "-i" here ! em0_opts="-pr" #eth1_opts="-r -m0"
Создаём папку /var/log/trafd и делаем symlink /usr/local/var/bpft/
Запускаем bpft4(trafd)
/usr/local/etc/rc.d/trafd.sh
Пробуем снять статистику
trafstat -n
Теперь нам необходимо добавить в SNMP списки IP, входящего и исходящего трафика
создаём 3 скрипта
скрипт для сброса статистики каждые 5 мин по крону в бинарный файл /usr/scripts/trafd-5min.sh
for i in `jot $ipcount`; do echo $i done exit $ipcount # this is the value at OID .1.3.6.1.4.1.2021.49.42.100.1 ;;
*) exit 254 ;; esac
попробуем получить список IP интерфейса
/usr/scripts/snmp-iplist.sh g
и просто индексы
/usr/scripts/snmp-iplist.sh i
для получения исходящего/входящего трафика всех IP интерфейса по отдельности /usr/scripts/snmp-iplist-traffic.sh
#!/bin/sh myIPs=`/usr/scripts/snmp-iplist.sh g` case $1 in
in) for IP in $myIPs; do /usr/local/bin/traflog -n -i em0 from all to $IP | grep ''Summary'' | /usr/bin/awk ''{print $2+$5}'' done ;;
out) for IP in $myIPs; do /usr/local/bin/traflog -n -i em0 from $IP to all | grep ''Summary'' | /usr/bin/awk ''{print $2+$5}'' done ;;
*) exit 254 ;;
esac
попробуем получить входящий трафик всех IP интерфейса по отдельности (если уже сработал крон для скрипта /usr/scripts/trafd-5min.sh)
/usr/scripts/snmp-iplist-traffic.sh in
попробуем получить исходящий трафик всех IP интерфейса по отдельности (если уже сработал крон для скрипта /usr/scripts/trafd-5min.sh)
/usr/scripts/snmp-iplist-traffic.sh out
Добавляем созданные скрипты в конфигурационный файл SNMP /usr/local/etc/snmp/snmpd.conf
extend .1.3.6.1.4.1.2021.49 iplist /usr/scripts/snmp-iplist.sh g extend .1.3.6.1.4.1.2021.49.42 ipindex /usr/scripts/snmp-iplist.sh i extend .1.3.6.1.4.1.2021.50 traffic_in /usr/scripts/snmp-iplist-traffic.sh in extend .1.3.6.1.4.1.2021.51 traffic_in /usr/scripts/snmp-iplist-traffic.sh out
перезапускаем SNMP
/usr/local/etc/rc.d/snmpd restart
пробуем возвращает ли SNMP данные скриптов (по очереди)