对象名称/描述符在 SNMP MIB 模块中必须是唯一的吗?



>我有一个供应商提供的MIB文件,其中相同的对象名称/描述符在同一MIB的两个不同表中定义。不幸的是,我认为MIB是专有的,不能在这里完整发布。所以我创建了一个类似的示例 Foobar.mib 文件,我已经包含在这篇文章的末尾。

我的问题是:这样的MIB是否有任何合法或可以被认为是有效的?

Net::SNMP 可以打印它的树,它看起来像这样:

+--foobar(12345678)
|
+--foo(1)
|  |
|  +--fooTable(1)
|     |
|     +--fooEntry(1)
|        |  Index: fooIndex
|        |
|        +-- -R-- INTEGER   fooIndex(1)
|        +-- -R-- String    commonName(2)
|
+--bar(2)
|
+--barTable(1)
|
+--barEntry(1)
|  Index: barIndex
|
+-- -R-- INTEGER   barIndex(1)
+-- -R-- String    commonName(2)

注意 现在commonNamefooTablebarTable下定义非常相同的MIB(见下面我的示例Foobar.mib(。

这混淆了Net::SNMP,因为FooBarMib::commonName现在可以表示两个不同的OID。

在供应商的错误报告中包含指向 RFC 的链接将是一件大事。

我发现RFC 1155 - 基于TCP/IP的互联网的管理信息的结构和标识说:

每个对象描述符对应于 互联网标准的MIB应是唯一但可记忆的可打印 字符串。 这促进了人类在以下情况下使用的共同语言 讨论 MIB,也有助于简单的表映射 用户界面。

这是否只适用于"互联网标准MIB",因此不适用于供应商MIB?

我还发现 RFC 2578 - 管理信息结构版本 2 (SMIv2( 说:

对于信息模块中出现的所有描述符,描述符应是唯一且助记符,长度不得超过 64 个字符。

但是,SNMP v1 代理的 MIB 是否也必须遵守 RFC 2578?SNMP 代理 无论出于何种原因,实现 MIB 仅支持 SNMP v1。和 RFC 标题中有2578SMIv22让我有点担心。但是,MIB本身确实从FWIW导入SMIv2

我发现了两个互联网参考,它们说对象名称/描述符在 MIB 中必须是唯一的,但没有源引用:

Andrew Komiagin在SO上的"SNMP OID与非唯一节点名称"中说:

MIB 对象名称在整个 MIB 文件中必须是唯一的

和戴夫·希尔德在网上::SNMP 邮件列表 说:

在给定的 MIB 模块中,所有对象名称都必须是唯一的。 在该 MIB 中定义的对象和显式对象 洋。不能有两个同名的对象, 两者都在同一 MIB 中引用。

我很想为这两个等效语句中的任何一个获得标准/RFC参考。

样品 Foobar.mib

这将commonName定义为::={ fooEntry 2 },并进一步向下定义为::={ barEntry 2 }

-- I've changed the MIB module name.
FooBarMib DEFINITIONS ::= BEGIN
IMPORTS sysName, sysLocation FROM SNMPv2-MIB;
IMPORTS enterprises, OBJECT-TYPE FROM SNMPv2-SMI;
-- I've provided a fake name and enterprise ID here
foobar OBJECT IDENTIFIER::= {enterprises 12345678}
foo OBJECT IDENTIFIER::={ foobar 1 }
fooTable OBJECT-TYPE
SYNTAX SEQUENCE OF FooEntry
MAX-ACCESS not-accessible
STATUS current
::={ foo 1 }
fooEntry OBJECT-TYPE
SYNTAX FooEntry
MAX-ACCESS not-accessible
STATUS current
INDEX { fooIndex }
::={ fooTable 1 }
FooEntry ::= SEQUENCE{
fooIndex INTEGER,
commonName OCTET STRING,
-- other leaves omitted
}
fooIndex OBJECT-TYPE
SYNTAX INTEGER
MAX-ACCESS read-only
STATUS current
::={ fooEntry 1 }
commonName OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Label for the commonEntry"
::={ fooEntry 2 }
bar OBJECT IDENTIFIER::={ foobar 2 }
barTable OBJECT-TYPE
SYNTAX SEQUENCE OF BarEntry
MAX-ACCESS not-accessible
STATUS current
::={ bar 1 }
barEntry OBJECT-TYPE
SYNTAX BarEntry
MAX-ACCESS not-accessible
STATUS current
INDEX { barIndex }
::={ barTable 1 }
BarEntry ::= SEQUENCE{
barIndex INTEGER,
commonName OCTET STRING,
-- other leaves omitted
}
barIndex OBJECT-TYPE
SYNTAX INTEGER
MAX-ACCESS read-only
STATUS current
::={ barEntry 1 }
commonName OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Label for the commonEntry"
::={ barEntry 2 }
END

不幸的是,企业可以为所欲为。如果他们想玩得好,建议他们遵守规则。详情请见 https://www.rfc-editor.org/rfc/rfc2578#section-3

最新更新