SNMP - 在此 OID 的此代理上没有可用的此类对象

D V*_*nzi 3 linux centos snmp

我在 CentOS 7 最小安装中安装了一个 snmpd,用于系统参数搜索,例如:

snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.2.2.1.2
Run Code Online (Sandbox Code Playgroud)

对于上述命令,我得到以下结果:

IF-MIB::ifDescr = No Such Object available on this agent at this OID
Run Code Online (Sandbox Code Playgroud)

当我执行:

 snmpwalk -v 2c -c public 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

要检查 IF-MIB 是否由 snmpd 加载,我得到以下结果:

     SNMPv2-MIB::sysDescr.0 = STRING: Linux vm_test.whatever.com 3.10.0-862.6.3.el7.x86_64 #1 SMP Tue Jun 26 16:32:21 UTC 2018 x86_64
     SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
     DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (90641) 0:15:06.41
     SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
     SNMPv2-MIB::sysName.0 = STRING: vm_test.whatever.com
     SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
     SNMPv2-MIB::sysORLastChange.0 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
     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::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
     SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
     SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
     SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
     SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
     SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
     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::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
     SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
     SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
     SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
     SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
     SNMPv2-MIB::sysORUpTime.1 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.2 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.3 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.4 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.5 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.6 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.7 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.8 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.9 = Timeticks: (4) 0:00:00.04
     SNMPv2-MIB::sysORUpTime.10 = Timeticks: (4) 0:00:00.04
     HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (872972) 2:25:29.72
     HOST-RESOURCES-MIB::hrSystemUptime.0 = No more variables left in this MIB View (It is past the end of the MIB tree)
Run Code Online (Sandbox Code Playgroud)

输出告诉我 IF-MIB 没有被检查,但如果执行命令:

 snmptranslate -Dinit_mib .1.3.2>&1 | grep MIBDIR
Run Code Online (Sandbox Code Playgroud)

检查 mibdirs(目录)和 MIB 的发现(见 MIBS)我得到以下结果:

  registered debug token init_mib, 1
  init_mib: Seen MIBDIRS: Looking in '/root/.snmp/mibs:/usr/share/snmp/mibs' for mib dirs ...
  init_mib: Seen MIBS: Looking in ':HOST-RESOURCES-MIB:HOST-RESOURCES- 
  TYPES:UCD-DISKIO-MIB:TCP-MIB:UDP-MIB:MTA-MIB:NETWORK-SERVICES-MIB:SCTP- 
  MIB:RMON-MIB:EtherLike-MIB:LM-SENSORS-MIB:SNMPv2-MIB:IF-MIB:IP- 
  MIB:NOTIFICATION-LOG-MIB:DISMAN-EVENT-MIB:DISMAN-SCHEDULE-MIB:UCD-SNMP- 
  MIB:UCD-DEMO-MIB:SNMP-TARGET-MIB:NET-SNMP-AGENT-MIB:SNMP-MPD-MIB:SNMP- 
  USER-BASED-SM-MIB:SNMP-FRAMEWORK-MIB:SNMP-VIEW-BASED-ACM-MIB:SNMP- 
  COMMUNITY-MIB:IPV6-ICMP-MIB:IPV6-MIB:IPV6-TCP-MIB:IPV6-UDP-MIB:IP-FORWARD- 
  MIB:NET-SNMP-PASS-MIB:NET-SNMP-EXTEND-MIB:UCD-DLMOD-MIB:SNMP-NOTIFICATION- 
  MIB:SNMPv2-TM:NET-SNMP-VACM-MIB' for mib files ...
  init_mib: Seen PREFIX: Looking in '.1.3.6.1.2.1' for prefix ..
Run Code Online (Sandbox Code Playgroud)

如果您仔细观察,IF-MIB 在那里被标记为 Seen Mibs。为什么它没有出现在 snmpwalk 命令中?为什么此代理中不存在与 IF-MIB 相关的 OID?这与许可有关吗?操作系统相关?

Rui*_*iro 5

出于安全原因,在 CentOS 中安装时的 SNMP 守护程序默认配置为使用“公共”社区回答受限制的 MIB 树视图的查询。

默认情况下,默认的“公共”MIB(子)树允许视图只有 .1.3.6.1.2.1.1 和 .1.3.6.1.2.1.25.1.1 ;如果仔细观察,IF-MIB 地址空间是 .1.3.6.1.2.1.2。因此默认情况下不允许在该 MIB 地址空间上查询对象。它还解释了为什么snmpwalk你的命令只显示了一个非常有限的视图。

因此,要让 SNMP 守护程序/服务回答您的查询,您首先必须在配置文件上配置一个新视图(出于安全原因,最好也是一个新社区)/etc/snmp/snmpd.conf

然后我们将出于安全原因配置一个“私有”社区,并扩大可以查询的 MIB 树空间。

因此,添加到 /etc/snmp/snmpd.conf

rocommunity private 127.0.0.1 .1
Run Code Online (Sandbox Code Playgroud)

其中 127.0.0.1 是可以进行查询的 IP 地址,0.1 是整个 MIB 树。ro社区还证明您只能进行更安全的读取查询。

配置snmpd.conf文件后,您必须重新启动 SNMP 服务,如下所示:

sudo service snmpd restart
Run Code Online (Sandbox Code Playgroud)

或者

sudo systemctl restart snmpd
Run Code Online (Sandbox Code Playgroud)

现在进行查询。如果您不要求 MIB 叶节点,则不能使用snmpget. 您必须使用snmpwalk它来遍历 MIB 树,如下所示:

$ snmpwalk -v 2c -c private 127.0.0.1 .1.3.6.1.2.1.2.2.1.2
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifDescr.4 = STRING: eth2
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您需要查询 MIB 树的叶节点,例如系统中的第二个接口,您可以:

$ snmpget -v 2c -c private 127.0.0.1 .1.3.6.1.2.1.2.2.1.2.2
IF-MIB::ifDescr.2 = STRING: eth0
Run Code Online (Sandbox Code Playgroud)

PS 显然,在生产系统中,您将社区名称称为私有名称以外的名称。

PS2。您安装 MIB 文件的事实是,您正在安装将数字转换为人类和脚本/网络监控软件等可读文本的字典。如果访问该 SNMP 社区的安全上下文允许,则未安装 MIB 不会阻止以数字形式查询特定 MIB 子树