SNMP - протокол, позволяющий по сети управлять различными устройствами и системами. Кроме того можно получать различные данные, как в режиме запрос/ответ, так и в режиме уведомления.
Не смотря на свое название SNMP
не так уж прост. Для понимания всех
тонкостей стандарта, необходимо прочитать множество стандартов и RFC.
Необходимый минимум можно найти на
википедии.
Рассмотрим простейшее применение стандарта на примере. Допустим на
каких-то серверах работают элементы системы. На одном сервере может
работать несколько элементов. Хотелось бы мониторить
некоторые ключевые параметры системы. На мониторе
устанавливается менеджер SNMP, а на хостах - агенты SNMP. На каждом
из агенов располагается база данных основных параметров (MIB
). MIB
представляет из себя набор переменных, характеризующих состояние объекта
управления. Эти переменные могут отражать такие параметры, как
количество пакетов, обработанных устройством, состояние его интерфейсов,
время функционирования устройства и т.п. Переменные идентифицируются с
помощью OID.
SNMP
как непосредственно сетевой протокол предоставляет только набор
команд для работы с переменными MIB
. Этот набор включает такие операции
как
- get-request
- set-request
- get-next-request
- get-bulk-request
- response
- trap
- inform-request
При изменении некоторых переменных устройство может производить какие-то действия.
Протокол версий 1 и 2 не содержал инструментов аутентификации и шифрования запросов. В версии 3 существенно улучшили безопасность. Но это сильно усложнило реализацию.
SNMP и zabbix
Zabbix поддерживает SNMP. Он может выступать в качестве менеджера SNMP. Проще говоря приложение можно наделить методами SNMP агента, тогда zabbix сможет получать от него данные и управлять им. На хабре есть пример использования snmp в zabbix
SNMP в языках программирования
Есть реализации для популярных языков:
Как мы уже говорили, агент управляет базой MIB. Кроме того, на него возложены функции по авторизации и шифрованию. Управляемая система должна лишь считывать и устанавливать данные базы. Часто общие для всех агентов служебные функции (такие как управление сообщениями, авторизация, шифрование, ответы на запросы о состоянии железа и операционной системы) выделяют в отдельный сервер, тем самым облегчая агенты внутри системы. Net-snmp - это раз отдельный сервер. Свои переменные можно реализовать несколькими способами - mib-module, subagent ... Тогда как agent++ позволяет относительно быстро реализовать полноценного агента внутри системы.
Net-snmp и agent++ довольно мутно лицензированы, но судя по ответам в списках рассылки, их можно использовать в коммерческих проектах почти без ограничений.
Agent++
Net-snmp описана более детально и собрала вокруг себя неплохое сообщество. Имеется wiki. Agent++ почти не содержит документации, но позволяет реализовать полноценного агента непосредственно внутри системы. На основе agent++ напишем пример приложения, которое на запрос объекта 1.3.6.1.3.100.2.1.0 будет отвечать на главный вопрос жизни - 42.
Установка
Agent++ включает в себя несколько частей. Основные - [snmp++][http://www.agentpp.com/doc_snmp++3.x/index.html] и
agent++. Для того, чтобы
их полноценно использовать (SNMPv3) понадобятся также pthreads, rt,
crypt и ssl. А для сборки snmp++
нужны еще и autotools (pkgconfig,
automake, autoconf). Причем для CentOS 6.4 придется обновить autoconf c
rpmfind.
Сборка snmp++:
sudo yum install pkconfig automake autoconf make gcc gcc-g++ libtool openssl-devel
wget http://www.agentpp.com/snmp++-v3.0.0.tar.gz
tar -zxvf snmp++-v3.0.0.tar.gz
cd snmp++
autoreconf -i --force
./configure --enable-static --disable-shared --disable-debug --prefix=/usr
make
sudo make install
Для того, чтобы agent++ правильно искал библиотеки необходимо в lib64 делать ссылки:
`find /usr/lib -name '*snmp*' | awk '{name=$0; gsub(/\/usr\/lib\//,"",name); printf("ln %s %s\n", $0, name)}'`
Сборка agent++:
./configure --enable-static --disable-shared --disable-debug --prefix=/usr
make
sudo make install
Для gentoo я сделал ebuild'ы. Надо бы и для RHEL/CentOS rpm-ы написать...
Код примера расположен на
github. Агент должен
ответить на Get запрос. Его можно послать с помощью утилиты snmpget
пакета
net-snmp-utils
:
snmpget -v3 -a MD5 -u MD5 -l authNoPriv -A MD5UserAuthPassword 127.0.0.1:4160 1.3.6.1.3.100.2.1.0
или snmpGet из snmp++:
snmpGet 127.0.0.1 1.3.6.1.3.100.2.1.0 -v3 -sl2 -snMD5 -authMD5 -uaMD5UserAuthPassword -P4160
Comments
comments powered by Disqus