Вопрос или проблема
Я хочу создать свой собственный MIB. Я занимаюсь этим уже несколько недель. Я следовал этому туториалу и использую net-snmp 5.7.3. Вот что я делаю:
Моя настройка: у меня есть две виртуальные машины, обе на
Ubuntu 16
, одна — это snmp-сервер с IP:192.168.5.20, другая — snmp-агент с IP:192.168.5.21. Я написал MIB, который компилируется без ошибок (Эта компиляция выполняется только на системе агента, не на сервере). Я уже сделал следующее:
root@snmp-agent:# MIBS=+MAJOR-MIB
root@snmp-agent:# MIBS=+DEPENDENT-MIB
root@snmp-agent:# export MIBS
root@snmp-agent:# MIBS=ALL
Мои MIB-файлы находятся по этому пути: /usr/share/snmp/mibs
, который является путем поиска по умолчанию. Я уже скомпилировал их и успешно сгенерировал .c и .h файлы с помощью команды: mib2c -c mib2c.int_watch.conf objectName
. Затем настроил snmp следующим образом:
root@snmp-agent:# ./configure --with-mib-modules="objectName"
root@snmp-agent:# make
root@snmp-agent:# make install
Все работало хорошо. После этого, когда я выполняю (на агенте) snmptranslate
, я получаю следующий вывод:
root@snmp-agent:snmptranslate -IR objectName.0
MAJOR-MIB::objectName.0
А с командой snmptranslate -On objectName.0
я получаю вывод как:
root@snmp-agent:# snmptranslate -On MAJOR-MIB::objectName.0
.1.3.6.1.4.1.4331.2.1.0
Итак, я получаю ожидаемые результаты на системе агента. Теперь моя проблема заключается в том, что я не знаю, как получить такие же значения с моего сервера!
Когда я запускаю snmpget
с сервера, я получаю такую ошибку:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 MAJOR-MIB::objectName.0
MAJOR-MIB::objectName.0 = No Such Instance currently exists at this OID
Вывод при указании OID:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 .1.3.6.1.4.1.4331.2.1
SNMPv2-SMI::enterprises.4331.2.1 = No Such Instance currently exists at this OID
Вывод, когда я делаю следующее:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux snmp-agent 4.10.0-33-generic #37~16.04.1-Ubuntu SMP Fri Aug 11 14:07:24 UTC 2017 x86_64
root@snmp-server:# snmpwalk -v2c -c public 192.168.5.21 .1.3.6.1.4.1.4331.2.1
SNMPv2-SMI::enterprises.4331.2.1 = No more variables left in this MIB View (It is past the end of the MIB tree)
Я это искал и все еще ищу, но безуспешно. Что мне делать? Как я должен использовать snmpget
с моего сервера на моих собственных MIB’ах? Я имею в виду что-то вроде sysDescr.0
с моего сервера.
Я хочу сделать следующее: snmpget 192.168.5.21 myObjectName.0
и получить значения.
ИЗМ.Я уже видел эти ответы, но они не работают. snmp extend not working и snmp no such object…
ОБНОВЛЕНИЕ 2:
Когда я выполняю snmpwalk
на сервере:
snmp-server:# snmpwalk -v 2c -c ncs -m DISMAN-PING-MIB 192.168.5.21 .1.3.6.1.2.1.80
DISMAN-PING-MIB::pingObjects.0 = INTEGER: 1
DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = STRING: "/bin/echo"
DISMAN-PING-MIB::pingMinimumCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingCompliances.4.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingCompliances.5.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 5
DISMAN-PING-MIB::pingCompliances.6.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingCompliances.7.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingCompliances.20.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 4
DISMAN-PING-MIB::pingCompliances.21.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingIcmpEcho.1.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingIcmpEcho.2.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingIcmpEcho.3.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingIcmpEcho.4.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 0
DISMAN-PING-MIB::pingMIB.4.1.2.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48.1 = ""
Когда я выполняю snmpget с pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48
:
root@snmp-server:# snmpget 192.168.5.21 DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48
DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = Wrong Type (should be INTEGER): STRING: "/bin/echo"
Итак, где я ошибаюсь? И что такое pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48? Почему такой длинный OID?
Где я ошибаюсь? Может кто-то указать мне в правильном направлении? Любые предложения приветствуются.
У меня была точно такая же проблема,
Она не работала с 5.6.2.
Как я её решил:
Я обновил до 5.7.3, и она заработала.
Нужно позаботиться о следующем:
-
настроить пакет (на этапе сборки) на поддержку agentx) с –with-mib-modules=agentx
вот моя конфигурация:./configure --prefix=/usr --build=i386-linux --host=arm-linux --target=arm-linux --with-ar=arm-arago-linux-gnueabi-ar --with-cc=arm-arago-linux-gnueabi-gcc --with-ld=arm-arago-linux-gnueabi-ld --with-cflags="-O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp" --with-endianness=big --with-ldflags=-Bstatic --enable-mini-agent --with-mib-modules="mibII ip-mib if-mib tcp-mib udp-mib ucd_snmp target agent_mibs notification-log-mib snmpv3mibs notification agentx" --without-openssl --without-perl-modules --disable-embedded-perl --disable-shared --with-default-snmp-version="2" --with-sys-contact="root" --with-sys-location="unknown" --with-logfile="/var/log/snmpd.log" --with-persistent-directory="/var/net-snmp" --disable-manuals
-
добавить agentx в snmpd.conf
Вот моя конфигурация snmpd.configmaster agentx rocommunity public rwcommunity private com2sec readonly default public com2sec readwrite default private
-
запустить snmpd с отладкой, чтобы получить больше информации:
snmpd -f -Lo: -Dagentx
-
Затем запустить приложение agentx
Следующий урок тоже помог:
http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Subagent
Именной поиск в MIB работает нормально, запрос работает нормально, но агент отвечает, что такого объекта не существует. Поэтому проблема на стороне агента.
Как предлагает @ransh в другом ответе, это может быть проблема неверной настройки agentx — главный агент должен запросить ваш субагент для объекта, который запрашивается, и для этого ему нужно сопоставление от поддерева OID к субагенту.
Для скалярных значений, таких как sysDescr.0
, таблица имеет только одну строку и один столбец, и ключ — это фиктивное значение 0
, но для других объектов нужно указывать конкретный столбец и строку. Номер столбца фиксирован, так как он определен в MIB, но строки не пронумерованы, так как они не были бы постоянными, и вместо этого используется уникальный первичный ключ.
Например, таблица маршрутизации IPv4 может содержать произвольное количество записей, но две записи не могут иметь одинаковый адрес назначения и маску сети, поэтому это используется в качестве уникального индекса (и первичного ключа) для поиска в таблице, а адреса строк генерируются из них, например:
.0.0.0.0.0.0.0.0 маршрут по умолчанию (назначение 0.0.0.0/0)
.192.168.0.0.255.255.255.0 внутренняя сеть (назначение 192.168.0.0/24)
DISMAN-PING-MIB
использует строку в качестве индекса здесь, которая кодируется как длина и значение — сначала длина, чтобы более короткая строка случайно не стала префиксом более длинной строки. Вы можете заметить, что первым элементом идет 15, а затем следуют еще 15 элементов.
Чтобы таблица отображалась в виде таблицы, используйте команду snmptable
.
Ответ или решение
Ваша проблема заключается в том, что вы пытаетесь получить доступ к объекту MIB, который не существует или не настроен должным образом на вашем SNMP-агенте. Сообщение об ошибке "No Such Object available on this agent at this OID" указывает на то, что SNMP-агент не может найти объект по указанному OID.
Теория
SNMP (Simple Network Management Protocol) — это протокол для управления сетевыми устройствами, а MIB (Management Information Base) — это базовая структура данных, используемая для управления устройствами в сети с помощью SNMP. Каждый объект в MIB имеет свой уникальный идентификатор (OID), который используется для доступа к данному объекту.
Когда вы запускаете snmpget
с вашего SNMP-сервера и получаете сообщение "No Such Object available on this agent at this OID", это обычно указывает на проблему с настройкой агента SNMP:
- Объект MIB может быть неправильно зарегистрирован на агенте.
- Объект может не существовать в указанный момент, т.е. нет данных по данному OID.
- Агент может не быть правильно настроен для поддержки нужных MIB-модулей.
Пример
Рассмотрим ваш пример:
- Вы создали свой собственный MIB и установили его на SNMP-агент.
- Вы успешно скомпилировали MIB и сгенерировали соответствующие
.c
и.h
файлы с помощьюmib2c
. - При выполнении команды
snmptranslate
вы получили правильное отображение вашего объекта в текстовый и числовой формат OID, что подтверждает корректную регистрацию MIB на агенте.
Однако при попытке доступа к этому объекту с сервера через snmpget
вы столкнулись с ошибкой.
Применение
-
Проверка конфигурации агента SNMP:
Убедитесь, что ваш
snmpd.conf
на агенте содержит все необходимые настройки для вашего собственного MIB:- Добавьте поддержку необходимых MIB-модулей в строку конфигурации, например,
master agentx
. - Проверьте, что права доступа (например,
rocommunity
иrwcommunity
) корректно заданы для необходимого диапазона IP-адресов.
- Добавьте поддержку необходимых MIB-модулей в строку конфигурации, например,
-
Проверка загрузки MIB:
- Проверьте, что ваш агент SNMP действительно загружает ваш MIB-модуль при старте. Запустите агент в режиме отладки, чтобы убедиться, что ваш MIB правильно загружен.
-
Отладка с помощью AgentX:
- Используйте
agentx
для подключения подагентов, если вы разрабатываете дополнительный агент для управления вашим MIB. - Убедитесь в корректности работы
agentx
путем запуска с отладочными флагами:snmpd -f -Lo: -Dagentx
. Это даст вам более подробную информацию и поможет найти возможные точки сбоя.
- Используйте
-
Тестирование доступности объекта:
- Используйте утилиты вроде
snmptable
, чтобы проверить, корректно ли возвращаются данные из таблиц MIB. Это поможет определить, видит ли агент запрашиваемые объекты. - Проверьте, может ли объект быть динамическим, а его наличие — зависеть от каких-либо условий на агенте.
- Используйте утилиты вроде
-
Исправление структуры индексов:
Если ваш объект является частью таблицы, убедитесь, что вы корректно указываете индексы, особенно если они имеют сложную структуру. OID для табличного объекта мог быть неправильно сформирован.
С учетом сказанного, основным направлением для дальнейших шагов будет сосредоточение на проверке правильности конфигурации агента SNMP и правильной настройки MIB для постоянного и корректного представления данных. Если после всех шагов проблема сохраняется, может потребоваться более глубинная отладка создаваемого вами C-кода, который обслуживает ваш MIB-модуль.