Ошибка snmpget: «Такой объект недоступен на этом агенте по этому OID»

Вопрос или проблема

Я хочу создать свой собственный 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, и она заработала.
Нужно позаботиться о следующем:

  1. настроить пакет (на этапе сборки) на поддержку 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
    
  2. добавить agentx в snmpd.conf
    Вот моя конфигурация snmpd.config

    master  agentx
    
    rocommunity public rwcommunity private
    
    com2sec readonly  default         public 
    com2sec readwrite default     private
    
  3. запустить snmpd с отладкой, чтобы получить больше информации:

    snmpd -f -Lo: -Dagentx
    
  4. Затем запустить приложение 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:

  1. Объект MIB может быть неправильно зарегистрирован на агенте.
  2. Объект может не существовать в указанный момент, т.е. нет данных по данному OID.
  3. Агент может не быть правильно настроен для поддержки нужных MIB-модулей.

Пример

Рассмотрим ваш пример:

  1. Вы создали свой собственный MIB и установили его на SNMP-агент.
  2. Вы успешно скомпилировали MIB и сгенерировали соответствующие .c и .h файлы с помощью mib2c.
  3. При выполнении команды snmptranslate вы получили правильное отображение вашего объекта в текстовый и числовой формат OID, что подтверждает корректную регистрацию MIB на агенте.

Однако при попытке доступа к этому объекту с сервера через snmpget вы столкнулись с ошибкой.

Применение

  1. Проверка конфигурации агента SNMP:

    Убедитесь, что ваш snmpd.conf на агенте содержит все необходимые настройки для вашего собственного MIB:

    • Добавьте поддержку необходимых MIB-модулей в строку конфигурации, например, master agentx.
    • Проверьте, что права доступа (например, rocommunity и rwcommunity) корректно заданы для необходимого диапазона IP-адресов.
  2. Проверка загрузки MIB:

    • Проверьте, что ваш агент SNMP действительно загружает ваш MIB-модуль при старте. Запустите агент в режиме отладки, чтобы убедиться, что ваш MIB правильно загружен.
  3. Отладка с помощью AgentX:

    • Используйте agentx для подключения подагентов, если вы разрабатываете дополнительный агент для управления вашим MIB.
    • Убедитесь в корректности работы agentx путем запуска с отладочными флагами: snmpd -f -Lo: -Dagentx. Это даст вам более подробную информацию и поможет найти возможные точки сбоя.
  4. Тестирование доступности объекта:

    • Используйте утилиты вроде snmptable, чтобы проверить, корректно ли возвращаются данные из таблиц MIB. Это поможет определить, видит ли агент запрашиваемые объекты.
    • Проверьте, может ли объект быть динамическим, а его наличие — зависеть от каких-либо условий на агенте.
  5. Исправление структуры индексов:

    Если ваш объект является частью таблицы, убедитесь, что вы корректно указываете индексы, особенно если они имеют сложную структуру. OID для табличного объекта мог быть неправильно сформирован.

С учетом сказанного, основным направлением для дальнейших шагов будет сосредоточение на проверке правильности конфигурации агента SNMP и правильной настройки MIB для постоянного и корректного представления данных. Если после всех шагов проблема сохраняется, может потребоваться более глубинная отладка создаваемого вами C-кода, который обслуживает ваш MIB-модуль.

Оцените материал
Добавить комментарий

Капча загружается...