Настройка агентов SNMP
Еще хотелось бы отметить, что для работы процесса съёма статистики с сетевого оборудования (сервера, коммутаторы, маршрутизаторы) необходимо настроить их SNMP программное обеспечение и определить comminuty string, которым уже будет пользоваться Method router. Приведу примеры минимальной настройки для оборудования и некоторых сервисов для снятия статистики по SNMP.
- Маршрутизаторы и коммутаторы Cisco:
# conf t
(config)# snmp-server enable informs
(config)# snmp-server community public ro (public доступ на чтение ?ro?)
- Cisco PIX Firewall:
# conf t
(config)# snmp-server enable
(config)# snmp-server community public
- Утилита bsnmpd из состава FreeBSD 5-STABLE и 6-STABLE:
Настраиваем файл /etc/snmpd.conf.
host := 172.21.81.3
system := 1 # FreeBSD
read := "public"
%snmpd
begemotSnmpdDebugDumpPdus = 2
begemotSnmpdDebugSyslogPri = 7
begemotSnmpdCommunityString.0.1 = $(read)
begemotSnmpdCommunityDisable = 1
begemotSnmpdPortStatus.[$(host)].161 = 1
begemotSnmpdPortStatus.127.0.0.1.161 = 1
begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4
sysObjectId = 1.3.6.1.4.1.12325.1.1.2.1.$(system)
Добавляем в rc.conf строку bsnmpd_enable="YES" и запускаем:
# /etc/rc.d/bsnmpd start
Проверяем /var/log/messages на наличие/отсутствие ошибок.
- Пакет Net-SNMP из портов:
Правим файл /usr/local/share/snmp/snmpd.conf, оставляем/добавляем запись про community string:
rocommunity public 172.21.81.3
Добавляем в rc.conf строку snmpd_enable="YES" и запускаем:
# /usr/local/etc/rc.d/snmpd.sh start
- Служба SNMP в Microsoft Windows
Для начала устанавливаем службу: Пуск(Start)/ Настройка(Settings)/ Панель Управления (Control Panel)/ Установка удаление программ (Add or remove programs)/ Установка компонентов Windows (Add/remove Windows Components)/ Средства управления и наблюдения (Management and Monitoring Tools)/ Протокол SNMP (Simple Network Management Protocol). После установки необходимо выполнить настройку службы Пуск/ Настройка/ Панель управления/ Администрирование/ Службы. Находим службу "Служба SNMP" ("SNMP Service"), можно сразу выполнить переход на закладку "Безопасность". Добавляем новое имя сообщества (community string) по кнопке "Добавить" для чтения.
Проверка работы SNMP агентов
После запуска агентов SNMP необходимо выполнить проверку работы. Я делаю это через snmpwalk из пакета Net-SNMP вот так:
% snmpwalk -v версия_протокола cc communitystring IP
% snmpwalk -v 1 -c public 172.21.81.3
Если данные идут, значит служба работает как надо. Если не идут: либо не правильно задана community string, либо агент snmp не запущен, либо данному хосту нельзя забирать данные по SNMP.
Для того чтобы определить IfIndex для интерфейсов, например в MS Windows, я делаю следующее: читаю ifTable (кому удобнее можете все данные по snmp прочитать) нахожу там что-то вроде:
Код:
IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.65539 = INTEGER: 65539
IF-MIB::ifDescr.1 = STRING: MS TCP Loopback interface
IF-MIB::ifDescr.65539 = STRING: Realtek RTL8139 Family PCI FastEthernet NIC
Тут видно что имеется 2 интерфейса - Loopback и rl, имеющие ifIndex=1 и 65539 соответственно.
Мониторинг интерфейсов, имеющих IfIndex больше 65535
С такой задачей я столкнулся только при мониторинге серверов MS Windows. Причина в том, что netmond отказывается принимать интерфейсы в конфигурационном файле, имеющие IfIndex больше 65535, узнать об этом можно будет после запуска в файле /var/log/messages будет строка вроде "interface index out of range". Лекарство нашлось только маленькой правкой кода netmond в файле parseconf.y. Находим там поиском 2 строки содержащие "interface index out of range" и правим в условиях: if ($2 < 1 || $2 > 65535) цифру 65535 на что то вроде 655350 (может не совсем правильно, но я сделал так). После этого пересобираем netmond.
Код:
# cd /usr/ports/net-mgmt/netmond
# make patch
# cd work/netmond-2.2-b6
# vi parseconf.y
# cd /usr/ports/net-mgmt/netmond
# make install clean
Сохранение в rrdtool других числовых значений
Для того чтобы сохранять какие-то другие числовые параметры (загрузка CPU Cisco маршрутизаторов, свободная память, количество процессов и т.п.) в rrdtool необходимо сначала их получать, то есть написать соответствующий метод опроса (см.
http://soft.risp.ru), чтобы определить переменную в netmond. Если числовое значение считывается по SNMP через известный идентификатор, то можно в конфигурационном файле netmond прописать:
Код:
Save "save_var" {
# Создаём новый пользовательский метод сохранения данных в rrdtool
# метод принимает 2 аргумента, первый имя создаваемого файла
# второй строка с сохраняемыми данными
# количество ячеек RRA определено в методе сохранения
Pipe "/usr/local/sbin/rrdsave"
Data
"$DATADIR/$1\n"
"60\n"
"RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:60:10080\n"
"$2"
}
Object "Cisco" {
Address "10.1.1.1"
Method router "public"
Save "make_dir"
Interface 1 { Save "make_dir" Save "save_rrd_if" }
Interface 2 { Save "make_dir" Save "save_rrd_if" }
# Прописываем переменную которую нам надо считать по SNMP
# ВНИМАНИЕ ЭТО ВСЕГО ЛИШЬ ПРИМЕР ИДЕНТИФИКАТОРА
$testvar 1.3.6.1.2.1.2.1.0
# Получаем значение переменной
Method SNMP "public" {$testvar}
# Вызываем метод сохранения, передав ему 2 параметра через пробел
# имя файла лучше давать такое же как название переменой
# строка ${testvar}:testvar:GAUGE:600:0:U уже была рассмотрена выше
Save "save_var" "testvar ${testvar}:testvar:GAUGE:600:0:U"
}
После запуска netmond должен будет создать файл testvar в каталоге объекта "Cisco".Можно будет просмотреть какие данные будут положены в файл:
Код:
# rrdtool fetch testvar AVERAGE
Построение графиков из командной строки
Таким образом, мы имеем систему сбора числовых параметров и сохранения их в rrdtool базу. Теперь самое дело отобразить полученные значения. Отображение можно сделать средствами командной строки (подробнее man rrdgraph). Я приведу пример скрипта для построения графиков байтовой загрузки для файлов интерфейсов, созданных методом "save_rrd_if":
Код:
#!/bin/sh
/usr/local/bin/rrdtool graph $1 \
--end $4 --start $3 \
--width 600 --height 400 \
--imgformat PNG --title "Image PNG" \
--color BACK#FAFAFA \
DEF:ifin=$2:ifinoctets:AVERAGE \
DEF:ifout=$2:ifoutoctets:AVERAGE \
CDEF:ifin1=ifin,60,/ \
CDEF:ifout1=ifout,60,/ \
VDEF:sumin=ifin1,TOTAL \
VDEF:sumout=ifout1,TOTAL \
VDEF:maxin=ifin1,MAXIMUM \
VDEF:maxout=ifout1,MAXIMUM \
VDEF:avgin=ifin1,AVERAGE \
VDEF:avgout=ifout1,AVERAGE \
AREA:ifin1#00FF00:In \
GPRINT:maxin:Max=%lf%s \
GPRINT:avgin:Avg=%lf%s \
GPRINT:sumin:Sum=%lf%s\l \
LINE1:ifout1#0000FF:Out \
GPRINT:maxout:Max=%lf%s \
GPRINT:avgout:Avg=%lf%s \
GPRINT:sumout:Sum=%lf%s\l
Синтаксис использования:
Код:
% /path/to/script /путь_до_создаваемого_изображения /путь_до_rrd_файла начальное_время_на_графике конечное_время_на_графике
Время задаётся в формате, который воспринимает rrdtool. Я пользуюсь временем в таком виде: -1m (минуту назад), -54m (54 минуты назад), -12d (12 дней назад), now (текущий момент) и т.п. Пример использования данного скрипта:
Код:
% script /tmp/graph.png /var/netmon/Cisco/Interface1/rrdint -1d now
Первым параметром скрипт принимает имя создаваемого файла изображения, вторым - путь до файла содержащего rrd данные, 3 и 4 параметры определяют время, за которое будет построен график.
Чтобы построить график, например, по моноадресным пакетом, достаточно будет поменять 2 строки, задать другой источник данных (другой столбец в нашем случае):
Находим строки:
DEF:ifin=$2:ifinoctets:AVERAGE \
DEF:ifout=$2:ifoutoctets:AVERAGE \
Меняем на:
DEF:ifin=$2: ifinucastpkts:AVERAGE \
DEF:ifout=$2: ifoutucastpkts:AVERAGE \
Название столбцов можно посмотреть у файла через rrdtool fetch или rrdtool info.
Чтобы построить данные из одного столбца, или одной переменной (как у нас в примере testvar) скрипт придётся модифицировать.
Покажу пример как это сделать:
Код:
#!/bin/sh
/usr/local/bin/rrdtool graph $1 \
--end $4 --start $3 \
--width 600 --height 400 \
--imgformat PNG --title "Image PNG" \
--color BACK#FAFAFA \
DEF:varname=$2:testvar:AVERAGE \
LINE1:varname#0000FF:line
Параметры скрипта те же самые, только изменены несколько параметров подписи данных на графике. Думаю, по данным примерам легко написать скрипты под другие задачи.
Пример Web оболочки для работы с графиками
Описанный выше способ построения графиков не всегда удобен. Некоторые задачи администрирования требуют просмотра многих графических зависимостей за короткий промежуток времени, поэтому мне пришлось написать под свои нужды некоторый web интерфейс на Perl и Java- Script для удобной работы с графиками загрузки интерфейсов сети. Скачать пример можно вот с
http://slil.ru/23560451 (~13 Kb). Данный архив содержит 2 каталога (cgi-bin,data) и описание по установке. Принцип работы скрипта сводится к следующему: получив запрос от пользователя скрипт подключается к netstate порту у netmond и считывает имена всех интерфейсов, объектов и сервисов, а так же DATADIR для них. Скрипт на основании этих данных строит дерево объктов мониторинга с интерфейсами и пользователю остаётся лишь выбрать требуемый интерфейс для просмотр графика.
Настройка скрипта отображения данных:
Код:
Копируем содержимое каталога cgi-bin (файл shownetmon) в соответствующий каталог web сервера.
Даём право на запуск пользователю www:
# chmod 755 /usr/local/www/cgi-bin/shownetmon
В скрипте shownetmon устанавливаем адрес netstate порта у netmond:
$main::config{'netstateaddress'} = "127.0.0.1"; # Адресс NETSTATE сервера
$main::config{'netstateport'} = 3333; # Порт NETSTATE сервера
Устанавливаем в скрипе каталог куда будут скаладыватся созданные изображения:
$main::config{'imgdir'} = "/usr/local/www/data/img"; # Путь до создаваемых
изображений
$main::config{'webimgdir'} = "/img"; # Путь до изображений в www
Создаём каталог /usr/local/www/data/img. Даём пользователю www возможность записи в него:
# chmod 777 /usr/local/www/data/img
или
# chown www /usr/local/www/data/img
# chmod 755 /usr/local/www/data/img
Копируем папку data/shownetmon в соответствующий каталог web сервера.
Даём права доступа пользователю www на все файлы в этой папке.
Запускаем netmond если не запущен.
Проверяем есть ли возможность с хоста заходить на порт NetSTATE.
# telnet 127.0.0.1 3333
Если не удаётся подключится, то смотрим настройки firewall и конфиг netmon.conf на предмет netstate групп.
Устанавливаем модуль Net-Telnet для perl если он отсутствует:
# cd /usr/ports/net/p5-Net-Telnet
Обращаемся http://IP/cgi-bin/shownetmon, предварительно включив JavaScript.
Заключение
В заключении хотел бы отметить нагрузку на компьютер, создаваемую созданной системой. Данная система разворачивалась на компьютерах с различной тактовой частотой CPU. Как показал опыт Intel Pentium 166 мог сохранять и отображать статистику примерно по 200 интерфейсам. Компьютер на базе Intel 867 Мгц справляется без труда с 500 интерфейсами (больше просто не было), не нагружая систему больше 1%. Лишь на момент сохранения нагрузка слегка возрастает на 1-5 секунд. Если учесть, что обновление данных в базах rrdtool идёт раз в минуту, можно сказать, что полученная система требует куда меньше ресурсов системы, чем старушка mrtg.
Кропачев Артемий (aka neon), сентябрь 2006