Содержание


Управление сетевой инфраструктурой по протоколу SNMP. Часть 1. Знакомство со стандартом и инструментарием

Стандарт SNMP (Simple Network Managment Protocol) был специально разработан для диагностики, управления и мониторинга любых устройств и программных компонентов, доступных по сетевым интерфейсам. Так протокол SNMP поддерживают практически все сетевые устройства: маршрутизаторы, коммутаторы, серверы, рабочие станции, принтеры и т.д. Но в рамках данного цикла статей мы рассмотрим только аспекты использования SNMP в реальных проектах. Поэтому предложенный материал в большей степени ориентирован на практическое применение, а не на теоретические изыскания.

Архитектура SNMP

Для начала необходимо более конкретно описать класс устройств, поддерживающих взаимодействие по SNMP. Так как SNMP работает поверх транспортных протоколов UDP/IP, то этот протокол может применяться для работы с сетевыми хостами, которые доступны по данным транспортным протоколам.

В модели управления протокола SNMP всегда присутствуют три компонента:

  1. управляемое устройство (аппаратное или программное);
  2. SNMP-агент (то, что в других сетевых системах называется сервером) — программный модуль сетевого управления, располагающийся на управляемом устройстве и обладающий управляющей информацией для данного устройства; агент также отвечает за перевод этой информации в специфичный SNMP-формат и обратно;
  3. менеджер (то, что в других сетевых системах называется клиентом) — программное обеспечение, запрашивающее информацию от агента или управляющее устройством посредством агента.

Агент получает запросы по UDP-порту, по умолчанию используется 161-й порт, но для большей защищённости разработчик может изменить номер используемого порта. Менеджер может посылать запросы с любого доступного порта на порт агента, и ответ агента будет отправлен назад на порт менеджера. По умолчанию менеджер также может получать асинхронные уведомления от агента (Traps и InformRequests) на порту 162.

Сам по себе протокол SNMP не определяет, какая информация и переменные должны предлагаться управляемой системой. Вместо этого в SNMP используется расширяемая модель, в которой доступная информация определяется в виде баз управляющей информации (MIB - management information base). Базы MIB описывают структуру управляемых данных, используя для этого иерархическое пространство имен, содержащее идентификаторы объектов (Object ID - OID).

Каждый OID определяет переменную, которая может быть сосчитана или установлена с помощью SNMP. В устройстве может быть определено несколько SNMP-объектов. Объекты, относящиеся к конкретному проекту/устройству, описываются в так называемых MIB-файлах определённого формата, которые впоследствии становятся составной частью общей базы MIB. В качестве объектов могут использоваться переменные и уведомления. Переменные могут быть двух типов: скалярные (одиночные) значения и таблицы с множественными значениями. Значения переменных могут считываться или записываться агентом по запросу менеджера.

Скалярная переменная характеризуется своим отдельным OID (можно считать это уникальным именем переменной), типом и значением. Например, последовательность .1.3.6.1.4.1.9876.11.5 — это OID скалярной (отдельной) переменной. Переменные могут принадлежать к различным типам, например, INTEGER, DisplayString, IpAddress, при этом каждый тип определяет набор значений, допустимых для переменной. Также могут быть определены переменные ограниченного типа: INTEGER (1..30) или скалярные переменные структурного типа (SEQUENCE).

Таблица в SNMP — это массив динамической размерности, содержащий однотипные скалярные переменные и имеющий общий OID. Каждому элементу в таблице сопоставляется уникальный OID, образующийся из OID таблицы. Например, OID табличной переменной - .1.3.6.1.4.1.9876.11.15, а входящие в эту таблицу скалярные переменные (элементы таблицы) будут иметь OID: .1.3.6.1.4.1.9876.11.15.1, .1.3.6.1.4.1.9876.11.15.2, .1.3.6.1.4.1.9876.11.15.3, т.е. таблица содержит 3 элемента.

Агент отправляет уведомления менеджеру в асинхронном режиме, поэтому инициатива на отправку уведомлений исходит от агента, а не от менеджера. Уведомления могут быть 2-х типов: Traps и InformRequests. Так как в основе SNMP лежит протокол UDP, не гарантирующий доставку отправляемых сообщений, агент, отсылая уведомление Trap, не знает, ожидает ли кто-нибудь его получения. Уведомление InformRequest было введено позже и предусматривает подтверждение доставки, для чего получатель отправляет обратно сообщение, повторяющее всю информацию из InfromRequest (подтверждение).

Всё множество OID-ов представляет собой единое дерево — например, .3.2.7.:, как показано на рисунке 1.

Рисунок 1. Схема формирования OID в протоколе SNMP
Схема формирования OID в протоколе SNMP
Схема формирования OID в протоколе SNMP

При подобном алгоритме адресации любой OID получается уникальным и занимает собственное место в иерархии базы MIB. Программные SNMP-агенты работают исключительно с числовой формой представления OID, но такой формат, очевидно, не подходит для восприятия человеком. Поэтому в MIB-файлы вводятся символьные имена – синонимы (aliases) для OID, и SNMP-утилиты смогут отображать именно эти текстовые значения, а не числовые OID. Например, .1.3.6.1.4.1.9876.11.5 может соответствовать синоним .iso.org.dod.internet.private.enterprises.olej.management.currentValue. Но необходимо учесть, что использование символьных синонимов возможно только тогда, когда соответствующие MIB-файлы присутствуют в системе и доступны утилитам SNMP.

В свою очередь, идентификаторы в старшей (корневой) части дерева определяются в MIB-файлах, находящихся в каталоге /usr/share/snmp/mibs. По умолчанию для поиска OID и их символьных синонимов SNMP-утилиты используют этот каталог и каталог текущего пользователя $HOME/.snmp/mibs (порядок и список каталогов можно переопределить опциями утилит SNMP):

$ ls -w100 /usr/share/snmp/mibs
AGENTX-MIB.txt		IPV6-TC.txt				SNMP-NOTIFICATION-MIB.txt
BRIDGE-MIB.txt		IPV6-UDP-MIB.txt			SNMP-PROXY-MIB.txt
DISMAN-SCRIPT-MIB.txt	NET-SNMP-AGENT-MIB.txt		SNMP-USM-AES-MIB.txt
EtherLike-MIB.txt	NET-SNMP-EXAMPLES-MIB.txt	SNMP-USM-DH-OBJECTS-MIB.txt
HOST-RESOURCES-MIB.txt	NET-SNMP-MIB.txt			SNMPv2-MIB.txt
HOST-RESOURCES-TYPES.txt	NET-SNMP-PASS-MIB.txt		SNMPv2-SMI.txt
INET-ADDRESS-MIB.txt	RFC-1215.txt				UCD-DEMO-MIB.txt
IP-MIB.txt			SCTP-MIB.txt				UCD-DLMOD-MIB.txt
IPV6-MIB.txt			SNMP-FRAMEWORK-MIB.txt		UDP-MIB.txt
...

В этом выводе представлены определения основных системных OID, и поддержка описываемых ими объектов осуществляется стандартным SNMP агентом snmpd.

Дополнительные наборы MIB представлены в каталоге /usr/share/mibs, но по умолчанию эти каталоги не используются в процессе поиска:

$ tree /usr/share/mibs | head -n10
/usr/share/mibs
|-- iana
|   |-- IANA-ADDRESS-FAMILY-NUMBERS-MIB
|   |-- IANA-CHARSET-MIB
...
$ ls -l /usr/share/mibs
итого 28
drwxr-xr-x. 2 root root  4096 июля  30 14:46 iana
drwxr-xr-x. 2 root root 12288 июля  30 14:46 ietf
drwxr-xr-x. 2 root root  4096 июля  30 14:46 irtf
...

Стандарт SNMP относится к мульти-платформенным, поэтому, если разработчик создал для своего устройства переменную .1.3.6.1.4.1.9876.11.5, то под этим OID она будет отображаться в любой операционной системе (Windows, Linux, и т.д.), и даже во встраиваемых устройствах без установленной операционной системы (SNMP-код, статически прикомпонованный к проекту). Агенты SNMP могут реализоваться программно различными способами, но должны удовлетворять стандарту SNMP. В операционных системах POSIX/UNIX базовая функциональность SNMP традиционно представлена проектом net-snmp (сайт проекта: http://www.net-snmp.org/), но также предлагается ряд сторонних проектов, расширяющих функциональность net-snmp в области разработки агентов и представляющих различные формы менеджеров.

За время развития протокол SNMP претерпел несколько изменений версии протокола, и в данный момент одновременно используются несколько версий:

  • версия 1 (SNMPv1) — изначальная версия, появившаяся в 1988г, когда ещё не существовало ОС Linux, сейчас уже почти не используется;
  • версия 2 (SNMPv2) — основная и наиболее популярная версия; сразу же после публикации в ней были исправлены некоторые недочёты, и эта версия известна и обозначается как 2c;
  • версия 3 (SNMPv3) не привносит никаких существенных изменений в протокол помимо добавления криптографической защиты.

Протоколы различных версий не совместимы между собой, но SNMP-агенты могут поддерживать все варианты протокола, при этом менеджеры обязаны указывать версию протокола, используемого в запросе (опция -v в утилитах snmp* или в программных вызовах).

Важное примечание! Обратите внимание, что бесконтрольное использование SNMP несёт в себе существенные риски. Так как в случае компрометации системы безопасности дорогостоящее оборудование при помощи SNMP-команд, отправленных злоумышленником, может быть отключено или вообще выведено из строя.

Установка пакетов для использования SNMP

В данной статье в качестве целевой системы используется "чистая" инсталляция ОС Linux, дистрибутив Fedora 17 RFR, в котором по умолчанию отсутствует SNMP. Поэтому мы по шагам выполним установку инструментов, необходимых для использования SNMP. Убедиться в том, что в системе имеются (отсутствуют) пакеты, относящиеся к SNMP, можно с помощью следующей команды:

$ yum list all net-snmp*
...
Установленные пакеты
net-snmp-libs.i686        1:5.7.1-4.fc17       @russianfedora/$releasever
Доступные пакеты
net-snmp.i686             1:5.7.1-5.fc17       updates
net-snmp-agent-libs.i686  1:5.7.1-5.fc17       updates
net-snmp-devel.i686       1:5.7.1-5.fc17       updates
net-snmp-gui.i686         1:5.7.1-5.fc17       updates
net-snmp-libs.i686        1:5.7.1-5.fc17       updates
net-snmp-perl.i686        1:5.7.1-5.fc17       updates
net-snmp-python.i686      1:5.7.1-5.fc17       updates
net-snmp-sysvinit.i686    1:5.7.1-5.fc17       updates
net-snmp-utils.i686       1:5.7.1-5.fc17       updates

Теперь можно по шагам выполнить установку инструментария SNMP, начав с базы - демонов, которые реализуют агентскую функциональность:

$ sudo yum install net-snmp.i686
...
Установлено:
  net-snmp.i686 1:5.7.1-5.fc17
Установлены зависимости:
  lm_sensors-libs.i686 0:3.3.2-5.fc17  net-snmp-agent-libs.i686 1:5.7.1-5.fc17
Обновлены зависимости:
  net-snmp-libs.i686 1:5.7.1-5.fc17
Выполнено!
New leaves:
  net-snmp.i686
$ ls -w120 /lib/systemd/system/*snmp*.service
/lib/systemd/system/snmpd.service  /lib/systemd/system/snmptrapd.service
$ ls /etc/snmp
snmpd.conf  snmptrapd.conf
$ which snmpd
/usr/sbin/snmpd
$ which snmptrapd
/usr/sbin/snmptrapd

Так в каталоге /lib/systemd/system/ появился скрипт для управления сервисом SNMP (агентом snmpd) с помощью общей системы управления сервисами systemd. В каталоге /etc появились конфигурационные файлы для управления демонами - snmpd.conf и snmptrapd.conf — основные инструменты, с которыми предстоит работать. Этой функциональности уже достаточно для выполнения простейшей задачи - включения SNMP агента на данном сетевом хосте, и зачастую настройка SNMP и ограничивается решением этой задачи.

Теперь появилась возможность запустить агенты SNMP и взаимодействовать с ними по сетевым протоколам (UDP порты 161 и 162). Но мы ещё не установили инструментов, необходимых для этого, хотя бы утилиту snmpwalk для диагностики установленной по умолчанию системы SNMP:

$ which snmpwalk
which: no snmpwalk in ...
...
$ net-snmp-config --base-cflags
bash: net-snmp-config: команда не найдена

Перед тем переходить к инсталляции инструментов для использования SNMP, следует хотя бы приблизительно разобраться в их назначении, так как для SNMP предлагается очень богатый набор инструментов:

$ yum info net-snmp*
...
Установленные пакеты
Название: net-snmp
...
Аннотация: A collection of SNMP protocol tools and libraries
Ссылка: http://net-snmp.sourceforge.net/
Лицензия: BSD
Описание: SNMP (Simple Network Management Protocol) is a protocol used for
...
        : You will probably also want to install the net-snmp-utils package,
        : which contains NET-SNMP utilities.
...
Доступные пакеты
...
Название: net-snmp-utils
...
Аннотация: Network management utilities using SNMP, from the NET-SNMP project
Ссылка: http://net-snmp.sourceforge.net/
Лицензия: BSD
Описание: The net-snmp-utils package contains various utilities for use with the
...
        : Install this package if you need utilities for managing your network
        : using the SNMP protocol. You will also need to install the net-snmp- package
...

Обратите внимание, что для SNMP-пакетов используется лицензия BSD, а не GPL, как для большинства пакетов ОС Linux. Из полученного таким образом списка утилит стоит обратить внимание на:

  • net-snmp-utils — это именно тот набор утилит, который нам сейчас нужен;
  • net-snmp-devel – средства для программного использования SNMP, которые будут использоваться в следующей статье;
  • net-snmp-gui — графические утилиты для работы с базой данных MIB;
  • net-snmp-sysvinit — инструменты для старой системы инициализации сервисов, которые могут оказаться полезными в других дистрибутивах (например, Debian или Ubuntu);

Теперь, после того как были выбраны необходимые пакеты, можно переходить к установке утилит для использования SNMP:

$ sudo yum install net-snmp-utils.i686
...
Установлено:
  net-snmp-utils.i686 1:5.7.1-5.fc17
Выполнено!
New leaves:
  net-snmp-utils.i686
$ ls -w100 /usr/bin/snmp*
/usr/bin/snmpbulkget   /usr/bin/snmpget      /usr/bin/snmpstatus     /usr/bin/snmptrap
/usr/bin/snmpbulkwalk  /usr/bin/snmpgetnext  /usr/bin/snmptable      /usr/bin/snmpusm
/usr/bin/snmpconf      /usr/bin/snmpinform   /usr/bin/snmptest	   /usr/bin/snmpvacm
/usr/bin/snmpdelta     /usr/bin/snmpnetstat  /usr/bin/snmptls	   /usr/bin/snmpwalk
/usr/bin/snmpdf        /usr/bin/snmpset      /usr/bin/snmptranslate

Большинство этих утилиты выполняют различные запросы к SNMP агенту (snmpd), то есть являются простыми консольными менеджерами: snmpget, snmpgetnext, snmpwalk. Использовать эти утилиты можно только при запущенном демоне SNMP. Но существуют утилиты, не требующие запуска snmpd, например, snmptranslate, которая статически транслирует (диагностирует) OID-ы, определённые в MIB-файлах, в разные формы: числовую, символьную, древовидную иерархию.

Наконец можно опробовать установленные утилиты, перед этим запустив ранее инсталлированный агент (демон, сервер, службу) snmpd. Обычно агент запускается как сервис Linux, и далее мы так и будем поступать, но для начального знакомства лучше запустить его в режиме отладки, когда он не переходит в режим демона, а выводит отладочную информацию на терминал. Обратите внимание, что запуск snmpd выполняется от имени root:

# snmpd -f -Le -d
mibII/mta_sendmail.c:open_sendmailst:
   could not guess version of statistics file "/var/log/mail/statistics"
Created directory: /var/lib/net-snmp/cert_indexes
Created directory: /var/lib/net-snmp/mib_indexes
NET-SNMP version 5.7.1
...
$ ps -A | grep snmp
 8037 pts/6    00:00:00 snmpd

Обращение к SNMP

Теперь можно проверить работу утилит SNMP, начав со стандартных системных OID. В SNMPv2c (2-ой версии SNMP на основе сообществ, community) опция -c в утилитах snmp* определяет имя сообщества, по принадлежности к которому в конфигурационном файле snmpd.conf разграничиваются полномочия доступа:

$ snmpwalk -v1 localhost -c public system
SNMPv2-MIB::sysDescr.0 = STRING: Linux notebook 3.5.2-1.fc17.i686.PAE #1 SMP ...
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (48754) 0:08:07.54
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> ...
SNMPv2-MIB::sysName.0 = STRING: notebook
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (8) 0:00:00.08
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
...
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
...
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (8) 0:00:00.08
$ snmpget -v1 localhost -c public SNMPv2-MIB::sysName.0
SNMPv2-MIB::sysName.0 = STRING: notebook
$ snmpget 192.168.1.5 -v1 -c public system.sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux notebook 3.5.2-1.fc17.i686.PAE #1 SMP ...

Так выполняются запросы к snmpd, а вот как выглядит статическая диагностика одного из поддеревьев OID-ов и его численное представление:

$ snmptranslate -Tp -OS SNMPv2-MIB::sysOREntry
+--sysOREntry(1)
   |  Index: sysORIndex
   |
   +-- ---- INTEGER   sysORIndex(1)
   |        Range: 1..2147483647
   +-- -R-- ObjID     sysORID(2)
   +-- -R-- String    sysORDescr(3)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -R-- TimeTicks sysORUpTime(4)
            Textual Convention: TimeStamp
$ snmptranslate -On SNMPv2-MIB::sysOREntry
.1.3.6.1.2.1.1.9.1

Таким способом можно получить полную спецификацию (тип, способ доступа) для этого же узла:

bash-4.2$ snmptranslate -Td -On SNMPv2-MIB::sysOREntry
.1.3.6.1.2.1.1.9.1
sysOREntry OBJECT-TYPE
  -- FROM	SNMPv2-MIB
  MAX-ACCESS	not-accessible
  STATUS	current
  INDEX		{ sysORIndex }
  DESCRIPTION	"An entry (conceptual row) in the sysORTable."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysORTable(9) 1 }

Пакеты для обработки MIB-файлов

Для создания набора OID-ов при разработке собственного проекта потребуется подготовить файлы MIB, в которых должна быть определена следующая информация:

  • поддерево иерархии собственных OID в базе данных MIB (в дереве);
  • структура поддерева;
  • OID узлов поддерева;
  • типы данных объектов в поддереве.

В принципе, от создания MIB-файлов можно отказаться, так как символьные имена узлов дерева нужны только для восприятия человеком, и если уже известна полная числовая запись OID интересующего параметра, то можно написать код агента для работы с этим OID. Однако на практике чаще применяется другой подход:

  1. в соответствии со строгим синтаксисом готовится один или несколько связанных MIB-файлов;
  2. производится автоматическая синтаксическая проверка и при необходимости правка MIB-файлов, для этого используются утилиты snmptranslate и smilint (она находится в пакете libsmi.i686, который мы ещё не устанавливали).
  3. MIB-файлы помещаются в один из каталогов, где они будут доступны подсистеме SNMP при поиске, выполняемом по стандартным путям.
  4. после этого вызываются автоматические генераторы кода, которые по описанным в MIB-файлах OID выполняют генерацию шаблонов кода для работы с ними; существует много сторонних пакетов для генерации кода на языках C, C++, Java один из таких генераторов для языка C - mib2c входит в состав пакета net-snmp-perl.
  5. полученные шаблоны кода включаются в код проекта, далее код шаблона наполняется конкретным программным кодом.

Остаётся только выполнить установку недостающих пакетов libsmi.i686 и net-snmp-perl:

$ sudo yum install libsmi-*
...
Установлено:
  libsmi-devel.i686 0:0.4.8-9.fc17
Обновлено:
  libsmi.i686 0:0.4.8-9.fc17
Выполнено!
New leaves:
  libsmi-devel.i686
$ which smilint
/usr/bin/smilint
$ sudo yum install net-snmp-perl
...
Установлено:
  net-snmp-perl.i686 1:5.7.1-5.fc17
$ which mib2c
/usr/bin/mib2c
$ sudo yum install net-snmp-devel
...
Установлено:
  net-snmp-devel.i686 1:5.7.1-5.fc17
Установлены зависимости:
  elfutils-devel.i686 0:0.154-2.fc17
  elfutils-libelf-devel.i686 0:0.154-2.fc17
  lm_sensors-devel.i686 0:3.3.2-5.fc17
  popt-devel.i686 0:1.13-10.fc17
  rpm-devel.i686 0:4.9.1.3-7.fc17
$ which net-snmp-config
/usr/bin/net-snmp-config

Заключение

В данной статье был представлен краткий обзор архитектуры и возможностей протокола SNMP. Также мы выполнили установку пакетов, необходимых для разработки собственного SNMP-управления в ОС Linux.

В следующей статье мы рассмотрим конкретный пример реализации управления сетевыми ресурсами по протоколу SNMP в рамках собственного проекта.


Ресурсы для скачивания


Похожие темы

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=970220
ArticleTitle=Управление сетевой инфраструктурой по протоколу SNMP. Часть 1. Знакомство со стандартом и инструментарием
publish-date=04302014