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
Примеры:
Источник