Snmp агент своими руками

Snmp агент своими руками

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.

Для того, чтобы agent++ правильно искал библиотеки необходимо в lib64 делать ссылки:

Для gentoo я сделал ebuild’ы. Надо бы и для RHEL/CentOS rpm-ы написать.

Код примера расположен на github. Агент должен ответить на Get запрос. Его можно послать с помощью утилиты snmpget пакета net-snmp-utils :

Источник

SNMP-агент

Необходимо в программу добавить поддержку протокола snmp, чтобы подключаясь каким-либо snmp менеджером можно было считывать/записывать некоторые данные из структур. Подскажите в каком направлении копать? Операционная система XP.

Добавлено через 1 час 2 минуты
Нашел два способа, поправьте, если не прав

использовать набор программного обеспечения для развёртывания и использования протокола SNMP — Net-SNMP

Читайте также:  Как сделать своими руками обувницу для обуви

либо использовать API функции win — SnmpExtensionInit, SnmpExtensionQuery, SnmpExtensionTrap

Нашел статью на хабре «Создание агента расширения SNMP». В ней описывается как создать dll, которая вызывается при запросе на службу snmp винды.

Как организовать связь между такой dll и моей программой?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

SNMP Агент
Здравствуйте уважаемый форумчане, уже несколько недель ищу не могу найти ничего путного/рабочего.

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

Java-агент Vs Ls-агент — кто быстрее?
Бэк-агента можно написать как на лс, так и на яве. Кто-нибудь обладает достоверной информацией.

Go + SNMP
Добрый день возникла необходимость написать сервер на go который сможет обращаться по протоколу.

Хотелось уточнить у Вас, mib2c.iterate.conf используется для генерации кода, чтобы держать миб дерево в коде программы. Я правильно понимаю? В моем случае в программе, к которой нужно прикрутить снмп, очень много структур в которых куча переменных. Если вставлять в код программы клиента-снмп миб-описание каждой переменной, исходный код разрастется до приличных размеров. Можно ли организовать это по другому?

У меня была идея запрограммировать TCPServer в основной программе и организовать в клиенте-снмп поток, который бы считывал сразу все нужные переменные с TCPServer’а. Но тогда получится, что ресурсы компьютера будут потрачены впустую, в случае когда запросов к snmp не будет (snmp клиент в потоке будет постоянно запрашивать данные с TCPServer’а).

Источник

Расширение возможностей SNMP агента в Windows

Протокол SNMP (англ. Simple Network Management Protocol — простой протокол управления сетями) давно зарекомендовал себя как простое и удобное средство сбора информации о работе различных устройств и систем. Агенты SNMP реализованы для множества операционных систем что даёт возможность строить масштабируемые системы мониторинга функционирования инфраструктуры.

К сожалению, штатный агент Windows, несмотря на кажущуюся информативность, ограничен в вариантах доступной информации о работе системы и в особенности сторонних приложений, работающих на сервере. В этой статье описано как получать по SNMP больше данных о работе сервера, в частности значения счётчиков производительности ОС и любые другие данные, которые могут предоставлять приложения работающие на сервере, например количество подключённых пользователей к серверу приложений 1С 8 или любую другую информацию, которую Вы захотите получить.

SNMP Агент Windows позволяет расширить охват данных при помощи подключения дополнительных библиотек, что дает возможность получить доступ к нужным данным. Информацию по написанию таких расширений можно найти в MSDN, но мы воспользуемся одним из готовых, а именно — snmptools. Эта библиотека позволяет передавать информацию полученную из счетчиков произовдительности Windows или результат выполнения консольной программы/скрипта в ответах SNMP агента.

snmptools поддерживает все современные версии Windows, начиная с XP и заканчивая 2008R2 и имеет функционал, достаточный для решения большинства задач по мониторингу.

Качаем архив с библиотекой.В нем лежат:

  • snmptools.dll и snmptools64.dll — собственно библиотеки расширения SNMP Агента. 32-х и 64-х битная версии соответственно
  • counters.sample и traps.sample — файлы с примерами конфигурации
  • .reg файлы с примерами регистрации расширения в системном реестре
  • .reg файлы с примерами регистрации расширения в системном реестре
  • perf32.exe — программка для доступа к значениям счетчиков производительности из командной строки
  • папки с примерами скриптов

Для установки копируем библиотеку нужной архитектуры в системную папку Windows. Рядом создаем ini файл с конфигурацией (по умолчанию предлагается его ложить в корень диска С:). После чего изменяем путь к библиотеке и конфигурации в .reg файле и импортируем ключи в реестр. Вуаля — после перезапуска службы SNMP библиотека будет загружена, и будет возвращать данные описанные в файле конфигурации.

Файл конфигурации представляет собой ini-файл с простой структурой. Заголовок раздела задает обрабатываемый oid. Параметры которых всего 2 — type и counter — указывают какую информацию возвращать.

;Значение счетчика производительности
[1.3.6.1.4.1.15.2]
counter = LogicalDisk\Free Megabytes\_Total

Читайте также:  Как сделать манекена своими руками дома

;Результат выполнения консольной команды.
[1.3.6.1.4.1.15.3]
type = exec
counter = cmd /c ver

;Результат выполнения VB скрипта
[1.3.6.1.4.1.15.4]
type = exec
counter = cscript /nologo c:\1c_sessions.vbs

; Описательные поля
[1.3.6.1.4.1.15.10.1]
type = string
counter = 2
[1.3.6.1.4.1.15.10.1.1]
type = string
counter = Available Bytes
[1.3.6.1.4.1.15.10.1.2]
type = string
counter = Committed Bytes

; Информационные поля
[1.3.6.1.4.1.15.10.2]
type = string
counter = 2
[1.3.6.1.4.1.15.10.2.1]
counter = memory\Available Bytes
[1.3.6.1.4.1.15.10.2.2]
counter = memory\Committed Bytes

;Необходимо указывать конец для корректной работы последовательного обхода с помощью snmp_get_next
[1.3.6.1.4.1.15.9999]
type = string
counter = EOF

И проверим работу:

> snmpwalk v 2c c public O a 192 . 168 . 1 . 1 1 . 3 . 6 . 1 . 4 . 1 . 15
SNMPv2 SMI :: enterprises . 15 . 1 = STRING: «this is a test»
SNMPv2 SMI :: enterprises . 15 . 2 = INTEGER: 160922
SNMPv2 SMI :: enterprises . 15 . 3 = STRING: «Microsoft Windows [. 5.2.3790]»
SNMPv2 SMI :: enterprises . 15 . 4 = INTEGER: 4
SNMPv2 SMI :: enterprises . 15 . 10 = INTEGER: 2
SNMPv2 SMI :: enterprises . 15 . 10 . 2 = INTEGER: 2
SNMPv2 SMI :: enterprises . 15 . 10 . 2 . 1 = STRING: «Available Bytes»
SNMPv2 SMI :: enterprises . 15 . 10 . 2 . 2 = STRING: «Committed Bytes»
SNMPv2 SMI :: enterprises . 15 . 10 . 3 = INTEGER: 2
SNMPv2 SMI :: enterprises . 15 . 10 . 3 . 1 = INTEGER: 427024384
SNMPv2 SMI :: enterprises . 15 . 10 . 3 . 2 = INTEGER: 522661888
SNMPv2 SMI :: enterprises . 15 . 9999 = STRING: «EOF»
End of MIB

Если что-то не заладилось можно включить отладку работы библиотеки установив в единицу параметр HKEY_LOCAL_MACHINE\SOFTWARE\snmptools\currentversion\debug. При этом отладочные сообщения будут сохранятся в файл c:\log.txt

Также можно настроить отправку трапов. Для этого нужно в настройках SNMP Агента Windows указать адрес получателя трапов, и в реестре в ветке HKEY_LOCAL_MACHINE\SOFTWARE\snmptools\currentversion создать строковой параметр traps с путем к файлу конфигурации трапов. Опционально можно добавить параметр trap_delay типа DWord для указания периодичности отправки трапов в миллисекундах.

Как видим snmptools это простой и удобный инструмент который может немного помочь в контроле увеличения энтропии вселенной и селекции зеленых хомячков.;-)

Если же Вам недостаточно функциональности предоставляемой snmptools, например требуются расширенные возможности протокола SNMP, типа управления сервером — можете попробовать использовать более продвинутые аналоги например, SNMPInformant

И в дополнение пример скрипта на VBScript для получения количества подключенных пользователей к серверу приложений 1Сv82.

Источник

How to create snmp agent from net-snmp

I want to implement SNMP-agent for PowerPC board using net-snmp. Previously it was implemented using SMASH. SMASH has a parser which could read MIB and generate C code (blank function imlementation)

How do I get started?

3 Answers 3

Try to look at mib2c tool from net-snmp. It will generate the snmp agent C code from the MIB. Then you have to only fulfill the return values to SNMP requests. Skeleton of responding to SNMP requests (get, set, get-next) are automatically done by generating.

I took a different approach to this. In order to better integrate with my C++ ecosystem, and to obtain greater flexibility (particularly at scale), I:

  • Had a pre-build step parse the result of snmptranslate (that is, the MIB tree) into a bunch of C++ maps and other containers for use in code
  • Borrowed Net-SNMP’s transport and PDU building functions
  • But serviced requests myself upon receipt, using my C++ maps and the data already available to my application

This made notification generation trivial (I just needed some variant types to generate varbinds, a bit of PDU construction and then left the rest to Net-SNMP’s transport feature), although for requests I did then have to implement table walking myself (and GetNext/GetBulk/Set are not trivial unless you avoid all tables, or at least avoid composite-index tables).

The result is a fast, robust and scalable SNMP agent with expressive code that’s easy to maintain and to extend.

You don’t say you’re using C++, but this does give an idea of how you can cherry-pick Net-SNMP functionality without necessarily buying into its entire ecosystem.

Читайте также:  Герои сказки для театра своими руками

Do note that I have no idea how SNMPv3 would fit into this model; I cleverly left the company before it became my problem. 🙂

Источник

SNMP MIBs и как их готовить

Доброго времени суток, читатель.

Предыстория

Установка MIBs

Стандартные

MIBs обычно распространяются в виде архива с пачкой файлов. Многие из них, составленные в iana и ietf, повторяются в каждом архиве, но передаются для совместимости.
Для работы в системе по умолчанию (конкретно для Debian) они должны лежать примерно в /usr/share/mibs
Для начала установим стандартные mibs в систему.

В файле конфигурации /etc/snmp/snmp.conf включить нужные. Пример:

mibs :ALL включает все, что не совсем хорошо. Рекомендую для каждого оборудования иметь папку с mib’ами, т.к. они могут отличаться из одной прошивки к другой.

Частный случай

После распаковки структура следующая:

Программное обеспечение

D-View
Net-SNMP

Возвращаюсь к тому, с чего начинал пост:
Мы скачали архив с MIBs и будем использовать утилиту snmptranslate из пакета Net-SNMP. Для удобства складываем все mibs в одну директорию, но это все равно не хватает:

Чтобы долго не мучатся скопируем недостающие файлы из mibs коммутатора des-3200 с опцией не перезаписывать существующие. И здесь мы уже получаем положительный результат:

UPD: Можно не копировать файлы, а указывать директории локальную и стандартные из системы -M ./:/usr/share/mibs/ietf:/usr/share/mibs/iana (для удобства можно делать alias в шелле)

О флагах:

  • -M Указывает на директорию, где искать mibs (можно перечислять, разделяя символом «:»)
    Таким образом можно было не складывать все MIBS в одну директорию, но тогда нужно с флагом -M указать все каталоги из первоначального архива.
  • -m Указывает какой модуль активируем (можно перечислять, разделяя символом «:»)
    Без указания модуля будут использоваться те, которые прописаны в /etc/snmp/snmp.conf
    % snmptranslate -m ./ -Ln 1.3.6.1.4.1.171.11.117.1.3.2.100.1.2.0.1
    RFC1155-SMI::enterprises.171.11.117.1.3.2.100.1.2.0.1
  • -Ln Избавляет нас от бесконечной портянки ошибок в иерархии mibs. Точнее -Ln отключает errors в stdout

Теперь, когда трансляция работает, можно вкусить всю прелесть иерархии OIDs. Для этого есть флаги:

Примеры использования

Можно просканировать все mibs и увидеть, что swL2macNotifyInfo есть и на других коммутаторах

Подводные камни D-Link

Еще есть особенность в mibs для 3200, что в них присутствует Object Name loop_detect. Символ «_» в net-snmp не поддерживается, так что для профилактики делаем: % sed -i ‘s/_/-/’ * в директории с mibs. Ошибку об этом символе можно увидеть, если вернуть вывод ошибок (убрать ключ -Ln):

Здесь мы видим, что иерархия не сложилась до конца.
После исправления становится так:

UPD: Можно использовать флаг -P u (-P MIBOPTS Toggle various defaults controlling mib parsing: u: allow the use of underlines in MIB symbols)

Нужно заметить, что я указал конкретный MIB, в котором искать (остальные «подтянутся» из директории ./). В этом случае не возникает ошибок, ну и скорость работы выше.

Если не указать конкретный MIB, то получим ошибки в других mibs

Еще пример

Здесь мы видим тот mib, который ранее использовали в ключе -m DES3200-10-L2MGMT-MIB
SNMPv2-MIB::sysORID.49 = OID: DES3200-10-L2MGMT-MIB::swL2MgmtMIB

Еще бонус в виде команды snmptable

Итого

В данный момент, я перевожу OID SNMP Traps с коммутаторов в понятный для оператора формат. Это послужит основой для системы регистрации событий на оборудовании. Использовать MIBs в приложении мы не собираемся по причине непереносимости и не универсальности. Думаю подавляющее большинство библиотек используют для трансляции OID системные базы MIBs и конфиг /etc/snmp/snmp.conf (их использует Net-SNMP, а библиотека обращется к последнему), а глобально включать эти модули MIBs мы не хотим. Эти данные можно использовать для экспериментов и добиться более универсального варианта по использованию MIBs, но для меня этого достаточно.

UPD:
Полезные ключи:
-TB ищет в MIBs Object Name по regexp
-On выводит Object ID
Примеры:

Источник

Оцените статью