据我了解,网络管理站使用 SNMP 管理信息库数据库将来自 SNMP 代理的数据转换为可理解的形式。例如,如果系统启动时间实例:
$ snmpwalk -v 2c -c public 10.10.10.1 sysUpTimeInstance
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (28267576) 3 days, 6:31:15.76
$
..我想这要归功于MIB,28267576被转换成3天6小时31分钟15.76秒?现在我搜索了正确的 MIB 文件来查看此翻译:
$ grep -ir sysUpTimeInstance /usr/local/share/smi/mibs/
/usr/local/share/smi/mibs/ietf/DISMAN-EVENT-MIB:sysUpTimeInstance OBJECT IDENTIFIER ::= { sysUpTime 0 }
/usr/local/share/smi/mibs/ietf/DISMAN-EVENT-MIB: DEFVAL { sysUpTimeInstance }
/usr/local/share/smi/mibs/ietf/DISMAN-EXPRESSION-MIB:sysUpTimeInstance OBJECT IDENTIFIER ::= { sysUpTime 0 }
/usr/local/share/smi/mibs/ietf/DISMAN-EXPRESSION-MIB: DEFVAL { sysUpTimeInstance }
$
..看起来它是在/usr/local/share/smi/mibs/ietf/DISMAN-EVENT-MIB
文件中定义的。我该如何理解这一点sysUpTimeInstance OBJECT IDENTIFIER ::= { sysUpTime 0 }
?
答案1
手动将其链接回去可能非常乏味。有一些工具可以snmptranslate
为您做这类事情。尝试snmptranslate -M /path/to/mibs -m ALL -Pu -Tso|grep -B1 sysUpTimeInstance
。要查看 sysUpTime 的完整详细信息,请使用snmptranslate -Td -OS .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime
这将显示它是以 TimeTicks 为单位测量的。
但为了回答您的问题,MIB 文件是用 ASN.1 编写的,其中每个对象都可以构建在所有先前的对象上。除其他外,例如描述和对象类型等,它还构建 OID,又名对象标识符,将 OID 映射到名称,例如.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
对于此条目,sysUpTimeInstance OBJECT IDENTIFIER ::= { sysUpTime 0 }
大致翻译为“sysUpTimeInstance 的 OID 等于 sysUpTime 的 OID 加 '.0',MIB 等于 sysUpTime 的 MIB 加 '.sysUpTimeInstance'
要查看 sysUpTime 的 OID 和 MIB 的其余部分是什么,您必须查看文件的前面部分。请记住,它可能是从另一个文件导入的。在本例中,确实如此,因此如果您查看 IMPORTS 部分,您将看到 sysUpTime 是从 SNMPv2-MIB 导入的。如果您随后检查该文件,您将看到 sysUpTime 已定义,并且在该定义中您将找到::= { system 3 }
.
到目前为止,我们已经有了.3.0
和system.sysUpTime.sysUpTimeInstance
,它只是 OID 和完整 MIB 名称的最后一部分。然后我们可以追溯到system
它的定义等等。通过沿着这个链回溯文件,您最终将获得整个 OID 和完整的 MIB。
当然,您可以使用snmptranslate
如第一段所示的 来为您完成所有这些操作。它会显示 MIB 和 OID。对于我们大多数人来说,这通常就是我们需要做的。
欲了解更多信息,请参阅:
(产品小册子,还包含一个很好的 MIB 摘要) https://scadahacker.com/library/Documents/ICS_Protocols/Demystifying%20the%20SNMP%20MIB.pdf