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