第5章 简单网络管理协议
SNMP是专门用来管理网络设备的一种标准应用层协议,有SNMPv1、SNMPv2、SNMPv3三个不同的版本和一系列RFC文件。SNMP使网络管理员能够维护网络运行,发现并解决网络问题以及规划网络发展。
本章首先介绍SNMP的演变,这是使用各种SNMP应用软件时必须了解的内容;然后介绍SNMP各部分主要内容:SNMP数据单元、SNMP支持的操作以及SNMP的安全机制。
SNMP的演变
1987年11月提出简单网关监控协议(SGMP)
简单网络管理协议第一版(SNMPv1) 公布在1990年和1991年的几个RFC文件中,即
RFC 1155(SMI) RFC 1157(SNMP) RFC 1212(MIB) RFC 1213(MIB-2)
双轨制策略:
SNMP满足当前的网络管理需要,并可平稳过渡到新的网络管理标准。
OSI网络管理(CMOT)作为长期解决办法,可提供更全面的管理功能,但需较长开发及接受过程。但OSI MIB采用面向对象模型,开发缓慢,SNMP无法顺利过渡。
SNMP的演变
SNMP简单易实现,但没有实质性的安全措施,无数据源认证功能,不能防止被偷听。为弥补SNMP的安全缺陷,1992年发布S-SNMP,该协议增强了以下安全方面的功能:用报文摘要算法MD5保证数据完整性和进行数据源认证;用时间戳对报文排序;用DES算法提供数据加密功能。
但S-SNMP没有改进SNMP功能和效率方面的缺点。于是又提出SMP协议,该协议在使用范围、复杂程度、速度和效率、安全措施、兼容性等方面对SNMP进行了扩充。1996年1月发布SNMPv2C,它以SMP为基础,放弃了S-SNMP,SNMPv2和SNMPv2C的RFC如表5-1。
表5-1 有关SNMPv2和SNMPv2C的RFC文件
1908
SNMPv2第1版和第2版网络管理框架共存
1452
管理进程间的管理信息库
1451
1907
SNMPv2管理信息库
1450
1906
SNMPv2传输层映射
1449
1905
SNMPv2协议操作
1448
SNMPv2参加者MIB
1447
SNMPv2安全协议
1446
SNMPv2高层安全模型
1445
1904
SNMPv2一致性声明
1444
1903
SNMPv2文本结构约定
1443
1902
SNMPv2管理信息结构
1442
1901
SNMPv2简介
1441
SNMPv2()
名 称
SNMPv2()
SNMP的演变
由于SNMPv2不能提供数据源标识、报文完整性认证、防止重放、报文机密性、授权和访问控制、远程配置和高层管理能力等,因此后来在此基础上又进行了修订,1999年4月公布了SNMPv3的新标准草案。增加了安全和高层管理功能,且能和以前的标准(SNMPv1和SNMPv2)兼容,以便于以后扩充新的模块,从而形成了统一的SNMP新标准。另外,对SNMPv2的管理信息结构的有关文件也进行了修订,作为正式标准公布。
SNMP v1
SNMPv1是一种简单的请求/响应协议,使用管理者-代理模型,仅支持对管理对象值的检索和修改等简单操作。网络管理系统发出一个请求,管理器则返回一个响应。该过程通过SNMP操作实现。但SNMP不支持管理站改变管理信息库的结构,即不能增加和删除管理信息库中的管理对象实例;管理站也不能向管理对象发出执行一个动作的命令。管理站只能逐个访问管理信息库中的叶节点,不能一次性访问一个子树,这些限制简化了SNMP的实现,但是也限制了网络管理的功能。
SNMP v1协议数据单元
RFC 1157使用 定义SNMPv1。图5-1为其报文格式。在SNMPv1管理中,管理站和代理之间交换的管理信息构成了SNMPv1报文。报文由版本号、团体名和协议数据单元三部分组成。版本号是SNMP版本,RFC 1157为第1版。团体名用于身份认证。SNMP v1共有5种管理操作,但只有4种PDU格式。管理站发出的3种请求报文,其采用的格式是一样的,GetRequest GetNextRequest SetRequest
代理的应答报文格式只有GetResponsePDU,从而简少了PDU的种类。
SNMP v1协议数据单元
除Trap PDU之外的四种PDU格式是相同的,共有五个字段:
PDU类型:GetRequestPDU GetNextRequestPDU SetRequestPDU GetResponsePDU TrapPDU五种类型。
请求标识(request-id):赋予每个请求报文唯一的整数,用于区分不同的请求。由于在具体实现中请求多是在后台执行的,因而当应答报文返回时要根据其中的请求标识与请求报文配对。请求标识的另一个作用是检测由不可靠的传输服务产生的重复报文。
错误状态(error-status):表示代理在处理管理站的请求时可能出现的各种错误,共有6种错误状态,包括noError(0) tooBig (l) noSuchName(2) badValue (3) readOuly(4) genError(5)。对不同的操作,这些错误状态的含义不同。
错误索引(error-index):当错误状态非0时指向出错的变量。
变量绑定表(variable-binding):变量名和对应值的表,说明要检索或设置的所有变量及其值。在检索请求报文中,变量的值应为0。
SNMP v1协议数据单元
图5-1 SNMP报文格式
TrapPDV报文的格式与其他报文不同,有下列字段
制造商ID(enterprise):表示设备制造商标识,与MIB-2对象sysObjectID的值相同。
代理地址(agent-addr):产生陷入的代理的IP地址。
一般陷入(genenric-trap):SNMP定义的陷入类型,共分7类:coldStart(0) wannStart(1) linkDown(2) linkUp(3) authenticationFailure(4) egpNeighborLoss(5) enterpriseSpecific(6) 。
SNMP v1协议数据单元
特殊陷入(specific-trap):与设备有关的特殊陷入代码。
时间戳(time-stamp):代理发出陷入的时间,与MIB-2中的对象sysUpTime的值相同。
SNMP v1协议数据单元
报文发送与接收
SNMP报文在管理站和代理之间传送,包含GetRequest GetNextRequest SetRequest的报文由管理站发出,代理以GetResponse响应。Trap报文由代理发给管理站,不需应答。管理站可连续发出多个请求报文,然后等待代理返回应答报文。如果在规定的时间内收到应答,则按照请求标识进行配对,亦即应答报文必须与请求报文有相同的请求标识。
图5-2 SNMP报文发送与应答序列
报文发送与接收
一个SNMP实体(PE)发送报文时执行下面的过程:首先按照的格式构造PDU,交给认证进程;认证进程检查源和目标之间是否可以通信,如果通过这个检查则把有关信息(版本号、团体名和PDU)组装成报文;最后经过BER编码,将报文交传输实体发送出去,如图5-3所示。
图5-3 生成和发送SNMP报文
报文发送与接收
一个SNMP实体(PE)接收到报文时执行下面的过程:首先按照BER编码恢复报文,然后对报文进行语法分析,验证版本号和认证信息等。如果通过分析和验证,则分离出协议数据单元并进行语法分析,必要时经过适当处理后返回应答报文。在认证检验失败时可以生成一个陷入报文,向发送站报告通信异常情况。无论何种检验失败,都丢弃报文。接收处理过程如图5-4。
图5-4 接收和处理SNMP报文
报文发送与接收
SNMP操作访问对象实例,只能访问对象标识树的叶节点。为了减少通信负载,用户希望一次检索多个管理对象,则可以把多个变量的值装入一个PDU,这时要用到变量绑定表。RFC1157建议在Get和GetNext协议数据单元中发送实体把变量置为的NULL值,接收实体处理时忽略它,在返回的应答协议数据单元中设置为变量的实际值。
SNMPv1操作
SNMP实体可以对MIB-2中的对象执行以下操作。
Get:管理站检索管理信息库中标量对象的值。
Set:管理站设置管理信息库中标量对象的值。
Trap:代理向管理站报告管理对象的状态变化。
通过综合使用这些操作,可以实现以下管理功能。
1.检索简单对象
检索简单标量对象值可用Get操作。如果变量绑定表中包含多个变量,则一次还可以检索多个标量对象的值。接收GetRequest的SNMP实体以请求标识相同的GetResponse响应。
SNMPv1操作
SNMPv1操作
GetResponse 操作具有原子性,如果所有请求的对象值可以得到,则给予应答;只要有一个对象的值得不到,则可能返回下列错误条件:
变量绑定表中的一个对象无法与MIB 中的任何对象标识符匹配,或者要检索的对象是一个数据块(子树或表),没有对象实例生成。在此情况下,响应实体返回GetResponsePDU中错误状态为noSuchName,错误索引设置为一个数,指明有问题的变量。变量绑定表中不返回任何值。
SNMPv1操作
响应实体可以提供所有要检索的值,但是变量太多,一个响应PDU 装不下,这往往是由下层协议数据单元大小限制的。这时响应实体返回一个应答PDU,错误状态字段置为响应实体可以提供所有要检索的值,但是变量太多,一个响应PDU 装不下,这往往是由下层协议数据单元大小限制的。这时响应实体返回一个应答PDU,错误状态字段置为tooBig。
SNMPv1操作
响应实体如不能提供至少一个对象的值,则返回的PDU中错误状态字段置为genError,错误索引置一个数,指明有问题的变量。变量绑定表中不返回任何值。
SNMPv1操作
GetNextRequest的作用与GetRequest基本相同,PDU格式也相同,唯一的差别是GetRequest检索变量名是对象实例,而GetNextRequest是“下一个”对象实例。根据对象标识树的词典顺序,对于标量对象,对象标识符所指的下一实例就是对象的值。
SNMPv1操作
2.检索未知对象
GetNext命令检索变量名指示的下一个对象实例,但并不要求变量名是对象标识符或者是实例标识符。
3.检索表对象
GetNext可用于有效的搜索表对象。
SNMPv1操作
4.表的更新和删除
Set命令用于设置或更新变量的值。其PDU与Get相同,但在变量绑定表中必须包含要设置的变量名和值。对于Set命令的应答也是GetResponse,同样是原子性的。如果所有的变量都可以设置,则更新所有变量的值,并在应答的GetResponse 中确认变量的新值;如果至少有一个变量的值不能设置,则所有变量的值都保持不变,并在错误状态中指明出错的原因。
Set出错原因与Get类似(tooBig、noSuchName和genError),然而若有一个变量的名字和要设置的值在类型、长度或实际值方面不匹配,则返回错误条件badValue。
SNMPv1操作
SNMP功能组
SNMP组共有30 个对象。在只支持SNMP站管理功能或只支持SNMP代理功能的实现中,有些对象没有值。除最后一个对象,这一组其他对象都是只读计数器。对象snmpEnableAuthenTrap可以由管理站设置,它指示是否允许代理产生“认证失效”陷入,这种设置优先于代理自己的配置,这样就提供了一种可以排除所有认证失效陷入的手段。
SNMPv1的局限性
(1)由于轮询性能限制,不适合管理大网络。
(2)不适合检索大量数据。
(3)陷入报文是没有应答的,管理站是否收到陷 入报文,代理不得而知。这样可能丢掉重要的管理信息。
(4)只提供简单团体名认证,安全措施不够。
(5)不能直接向被管理设备发送命令。
(6)管理信息库MIB-2支持的管理对象有限,不足以完成复杂的管理功能。
(7)不支持管理站之间的通信。
SNMPv2
SNMPv2 SMI对SNMPv1 SMI进行了扩充,提供了更严格的规范,规定了新管理对象和MIB文件,是SNMPvl SMI的超集。SNMPv2 SMI引入了4个关键的概念:对象的定义、概念表、通知的定义和信息模块。
SNMPv2管理信息结构
1.对象的定义
与SNMPvl一样,SNMPv2也是用宏定义OBJECT-TYPE 表示管理对象的语法和语义,但是SNMPv2的OBJECT-TYPE 增加了新的内容。
SNMPv2管理信息结构
OBJECT-TYPE MACRO::=BEGIN
TYPE NOTATION::= "SYNTAX" Syntax
UnitsPart
"MAX-ACCESS" Access
"STATUS" Status
"DESCRIPTION" Text
ReferPart
IndexPart
DefValPart
VALUE NOTATION::=value(VALUE ObjectName)
END
图5-10 SNMPv2对象宏定义
SNMPv2管理信息结构
图5-10所示列出了SNMPv2宏定义的主要部分,与SNMPvl 的宏定义有以下差别:
(1)数据类型。SNMPv2增加了两种新的数据类型Unsigned32和Counter64。Unsigned32与Gauge32在中是无区别的,都是32位的整数,但在SNMPv2中语义不一样。Counter64与Counter32一样,都表示计数器,只能增加,不能减少,当增加到264−1或232−1时回零,从头再增加。
SNMPv2规定,计数器没有定义的初始值,因此计数器的单个值是没有意义的,只有连续两次读取计数器得到的增加值才是有意义的。
SNMPv2规范澄清了原来标准中Gauge32一些含糊不清的地方。首先SNMPv2 中规定Gauge32的最大值可以设置为小于232的任意正数MAX,如见图5-11。
SNMPv2管理信息结构
图5-11 SNMPv1计量器和SNMPv2计量器的比较
(2)UNITS子句。在SNMPv2的OBJECT-TYPE宏定义中增加了UNITS子句。这个子句用文字说明与对象有关的度量单位。当管理对象表示一种度量手段(如时间)时这个子句是有用的。
SNMPv2管理信息结构
(3)MAX-ACCESS子句。类似于SNMP vl的ACCESS子句,说明最大的访问级别,与授权策略无关。SNMPv2定义的访问类型中去掉了write-only类,增加了一个与概念行有关的访问类型read-create,表示可读、可写和可生成。还增加了aceessible-for-notify访问类,这种访问方式与陷入有关。例如,下面是SNMPv2 MIB中关于陷入的定义,其中用到了accessible-for-notify。
SNMPv2管理信息结构
snmpTrapOID OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS accessible-for-notify
STATUS current
DESCRIPTION
"The authoritative identification of the trap currently
Being variable occurs as the second varbind in
Every SNMPv2-Trap-PDU and InformRequest-PDU."
:={snmpTrap 1}
SNMPv2的5种访问级别由小到大排列如下:
not-accessible;accessible-for-notify;
read-only;read-write;read-create。
SNMPv2管理信息结构
(4)STATUS子句。这个子句指明对象状态。SNMPv2标准去掉了SNMPvl中的optional和mandatory,只有3种可选状态。如果说明管理对象的状态是current,则表示在当前的标准中是有效的。如果管理对象的状态是obsolete,则表示不必实现这种对象,状态deprecated表示对象已经过时了,但是为了兼容旧版本实现互操作,实现时还要支持这种对象。
SNMPv2管理信息结构
2.表的定义
与SNMPv1一样,SNMPv2的管理操作只能作用于标量对象,复杂的信息要用表来表示。按照SNMPv2规范,表是行的序列,而行是列对象的序列。SNMPv2把表分为以下两类。
SNMPv2管理信息结构
(1)禁止删除和生成行的表。这种表的最高的访问级别是read-write。在很多情况下这种表由代理控制,表中只包含read-ouly型的对象。
(2)允许删除和生成行的表。这种表开始时可能没有行,由管理站生成和删除行。行数可由管理站或代理改变。
SNMPv2管理信息结构
在SNMPv2表的定义中必含有INDEX或AUGMENTS子句,但是只能有两者其中之一。INDEX子句定义了一个基本概念行,而INDEX子句中的索引对象确定了一个概念行实例。与SNMPvl不同,SNMPv2 INDEX子句中增加了任选的IMPLIED修饰符,从下面的解释中能够了解到这个修饰符的作用。假定一个对象的标识符为y,索引对象为il,i2,…,in,则对象y的一个实例标识符为y.(i1) .(i2).… .(in)
SNMPv2管理信息结构
每个索引对象i 的类型可以是如下类型:
整数,每个整数作为一个子标识符(仅对非负整数有效);
固定长度字符串,每个字节编码为一个子标识符;
有修饰符IMPLIED的变长度字符串,每个字节编码为一个子标识符,共n个子标识符;
SNMPv2管理信息结构
无修饰符IMPLIED的变长度字符串,第一个子标识符是n,然后是n个字节编码的子标识符,共n + l个子标识符;
有修饰符IMPLIED的对象标识符,对象标识符的n个子串;
无修饰符IMPLIED的对象标识符,第一个子标识符是n,然后是对象标识符的n个子串;
IP地址,由4个子标识符组成。
SNMPv2管理信息结构
AUGMENTS子句的作用是代替INDEX子句,表示概念行的扩展。
作为索引的列对象叫做辅助对象,是不可访问的。这个限制意味以下了解情况。
(1)读—SNMPv2规定,读任何列对象的实例,都必须知道该对象实例所在行的索引对象的值,然而在己经知道辅助对象变量值的情况下读辅助变量的内容就是多余的了。
SNMPv2管理信息结构
(2)写—如果管理程序改变了辅助对象实例的值,则行的标识也改变了,然而这是不允许的。
(3)生成—行实例生成时必须同时给一个列对象实例赋值,在SNMPv2中这个操作是由代理而不是由管理站完成的。
与RMON一样,SNMPv2允许使用不属于概念行的外部对象作为概念行的索引,在这种情况下不能把索引对象限制为不可访问的。
SNMPv2管理信息结构
3.表的操作
允许生成和删除行的表必须有一个列对象,其SYNTAX子句的值为Rowstatus,MAX-ACCESS子句的值为read-write,这种列叫做概念行的状态列。状态列可取以下6种值。
Active(可读写):被管理设备可以使用概念行。
NotInService(可读写):概念行存在,但由于其他原因(下面解释)而不能使用。
SNMPv2管理信息结构
NotReady(只读):概念行存在,但因没有信息而不能使用。
CreateAndGo(只写不读):管理站生成一个概念行实例时先设置成这种状态,生成过程结束时自动变为active,被管理设备就可以使用了。
CreateAndWait(只写不读):管理站生成一个概念行实例时先设置成这种状态,但不会自动变成active。
Destroy(只写不读):管理站需删除所有的概念行实例时设置成这种状态。
SNMPv2管理信息结构
这6种状态中的5种状态(除notReady)是管理站可以用Set 操作设置的状态,前3种可以是响应管理站的查询而返回的状态。图5-15所示显示了一个允许管理站生成和删除行的表,可以作为下面讨论的参考。
(1)概念行的生成。生成概念行可以使用两种不同的方法,分为4个步骤,下面介绍具体的生成的过程。
SNMPv2管理信息结构
① 选择实例标识符。针对不同的索引对象可考虑用不同的方法选择实例标识符。
如果标识符语义明确,则管理站根据语义选择标识符,如选择目标路由器地址。
如果标识符仅用于区分概念行,则管理站扫描整个表,选择一个没有使用的标识符。
SNMPv2管理信息结构
由MIB模块提供一个或一组对象,辅助管理站确定一个未用的标识符。管理站选择一个随机数作为标识符。
MIB设计者可在后两种方法中选择。列对象多的大表,可考虑第3种,小表则可考虑第4种方法。
选择好索引对象的实例标识符以后,管理站可以用两种方法产生概念行:一种是管理站通过事务处理一次性地产生和激活概念行;另一种是管理站通过与代理协商,合作生成概念行。
SNMPv2管理信息结构
② 产生概念行。产生概念行主要有两种方法。
第一种,管理站通过事务处理产生和激活概念行。首先管理站必须知道表中的哪些列需要提供值,哪些列不能或不必要提供值。如果管理站对表的列对象知之甚少,则可以用Get 操作检查要生成的概念行的所有列,其返回值可能是如下几种情况。
SNMPv2管理信息结构
返回一个值,则说明其他管理站己经产生该行。
返回nosuchlnstanee,则说明代理实现了该列的对象类型,而且该列在管理站的MIB视图中是可访问的。如果该列的访问特性是“read-write”,则管理站必须用Set操作提供这个列对象的值。
SNMPv2管理信息结构
返回“nosuchobject”,说明代理未实现该列的对象类型,或该列在管理站MIB视图中不可访问,则管理站不能用Set操作生成该列对象的实例。
确定列要求后,管理站发出相应的Set操作,并且置状态列为“createAndGo”。代理根据Set提供的信息以及实现专用的信息设置列对象的值,正常时返回noError响应,并且置状态列为“active”。如果代理不能完成必要的操作,则返回“inconsistentValue”,管理站根据返回信息确定是否重发Set操作。
SNMPv2管理信息结构
第二种方法,管理站与代理协商生成概念行。管理站用Set操作置状态列为“createAndWait”,如果代理不接受这种操作,则返回wrongValue,管理站必须以单个Set操作(事务处理)为所有列对象提供值;如果代理执行这种操作,则生成概念行,返回noError,状态列被置为notReady(代理没有足够的信息使得概念行可用)或notInService(代理有足够的信息使得概念行可用),然后进行下一步。
SNMPv2管理信息结构
③ 初始化非默认值对象。管理站用Get操作查询所有列,以确定是否能够或需要设置列对象的值,返回值情况如下。 代理返回一个值,则表示代理实现了该列的对象类型,而且能够提供默认值。如果该列的访问特性是read-write,则管理站可用Set操作改变该列的值。
SNMPv2管理信息结构
代理返回noSuchInstanee,说明代理实现了该列的对象类型,该列也是管理站可访问的,但代理不提供默认值。如果列访问特性是“read-write”,则管理站必须以Set操作设置这个列对象的值。
代理返回noSuchObject,说明代理没有实现该列的对象类型,或者该列是管理站不可访问的,则管理站不能设置该对象的值。
SNMPv2管理信息结构
如果状态列的值是notReady,则管理站应该首先处理其值为noSuchInstanee的列,这一步完成后,状态列变成notInService,再进行下一步。
④ 激活概念行。管理站对所有列对象实例满意后,用Set 操作置状态列对象为active。如果代理有足够的信息使得概念行可用,则返回noError;如果代理没有足够的信息使得概念行可用,则返回noInService。
SNMPv2管理信息结构
至此,行的生成过程完成了,在具体实现时采用哪种方法,如何设计行的生成算法,要考虑很多因素。首先要解决的几个主要问题如下。
表可能很大,一个set PDU不能容纳行中的所有变量。代理可能不支持表定义中的某些对象。
SNMPv2管理信息结构
管理站不能访问表中的某些对象。
可能有多个管理站同时访问一个表。
生成操作不能被任意改变。
代理在行生成之前要检查是否出现tooBig错误
(单个响应PDU不能容纳所有列变量的值)。
概念行中可能同时有read-only和read-create对象。
SNMPv2管理信息结构
解决这些问题的方法不同,就会有不同的行生成方案。另外希望实现的系统具有下列有用的特点。应该允许在简单的代理系统上实现。代理在生成行的过程中不必考虑行之间的语义关系。不应为了生成行而增加新的PDU。生成操作应在一个事务处理中完成。
SNMPv2管理信息结构
管理站可以盲目地接受列对象的默认值。
应该允许管理站查询列对象的默认值,并自主决定是否重写列对象的值。
有些表的索引可取唯一的任意值,对于这种表应该容许代理自主选择索引的值。
在行的生成过程中应容许代理自主选择索引值,这样可以减少管理站的负担,而由管理站寻找一个未用的索引值可能效率更低。
SNMPv2管理信息结构
createAndWait方法把主要的负担放在代理上,要求代理必须维持概念行在notInService状态。但是比起createAndGo方法,它能处理任意行的生成,因此功能更强大。另一方面,ereateAndGo方法在行生成过程中只涉及一两次PDU交换,因此能更有效地节约通信资源和管理站时间,能减少代理系统的复杂性,但是它不能处理任意行的生成。采用哪一种方法主要取决于代理系统如何实现。
SNMPv2管理信息结构
(2)概念行的挂起。当概念行处于active状态时,如果管理站希望概念行脱离服务,以便进行修改,则可以发出Set命令,把状态列由active置为notInService。这时有两种可能的情况。
若代理不执行该操作,则返回wrongValue。
若代理可执行该操作,则返回noError。
表定义中的DESCRIPTION 子句需指明在何种情况下可以把状态列置为noInService。
SNMPv2管理信息结构
(3)概念行的删除。管理站发出Set命令,把状态列置为destroy,如果这个操作成功,则概念行立即被删除。
4.通知和信息模块
SNMPv2提供了通知类型的宏定义NOTIFICATION-TYPE,用于定义异常条件出现时SNMPv2实体发送的信息。
SNMPv2管理信息结构
NOTIFICATION-TYPE 宏定义表示如图5-16所示。任选的OBJECT 子句定义了包含在通知实例中的MIB对象序列。当SNMPv2实体发送通知时这些对象的值被传送给管理站。DESCRIPTION子句说明了通知的语义。任选的REFERENCE子句包含对其他MIB模块的引用。
SNMPv2管理信息结构
SNMPv2管理信息库
SNMPv2 MIB扩展和细化了MIB-2中定义的管理对象,又增加了新的管理对象。下面介绍SNMPv2定义的各个功能组。
1.系统组
SNMPv2的系统组是MIB-2系统组的扩展,图5-17所示这个组的管理对象。
SNMPv2管理信息库
2.Snmp组
Snmp组是由MIB-2的对应组改造而成的,有些对象被删除,同时又增加了一些新对象,如图5-18所示。可以看出,新的Snmp组对象少了,去掉了许多对排错作用不大的变量。
SNMPv2管理信息库
SNMPv2管理信息库
3.Mib对象组
这个新组包含的对象与管理对象的控制有关,分为两个子组,如图5-19所示。
SNMPv2管理信息库
4.接口组
MIB-2定义的接口组经过一段时间的使用,发现有很多缺陷。RFC1573分析了原来的接口组没有提供的功能和其他不足之处。
(1)接口扩展表。
(2)接口堆栈表。
(3)接口测试表。
(4)接口地址表。
SNMPv2协议数据单元
SNMPv2提供了3种访问管理信息的方法:
(1)管理站和代理之间的请求/响应通信,这与SNMPvl一致。
(2)管理站和管理站之间的请求/响应通信,这是SNMPv2特有的,可以由一个管理站把有关管理信息告诉给另外一个管理站。
(3)代理系统到管理站的非确认通信,即由代理向管理站发送陷入报文,报告出现的异常情况,SNMPvl中也有对应的通信方式。
SNMPv2协议数据单元
1.SNMPv2报文
SNMPv2 PDU封装在报文中传送,报文头提供了简单的认证功能,而PDU可以完成上面提到的各种操作。这里首先介绍报文头的格式和作用,然后讨论协议数据单元的结构。SNMPv2报文的结构分为3部分:版本号、团体名和作为数据传送的PDU。这个格式与SNMPvl一样。版本号取值0代表SNMPvl,取值1代表SNMPv2。团体名提供简单的认证功能,与SNMPvl的用法一样。
SNMPv2协议数据单元
SNMPv2实体发送报文一般要经过下面4个步骤。
(1)根据要实现的协议操作构造PDU。
(2)把PDU、源和目标端口地址以及团体名传送给认证服务,认证服务产生认证码或对数据进行加密,返回结果。
(3)加入版本号和团体名,构造报文。
(4)进行BER 编码,产生0/1比特串,发送出去。
SNMPv2协议数据单元
SNMPv2实体接收到一个报文后要完成下列动作。
(1)对报文进行语法检查,丢弃出错的报文。
(2)把PDU部分、源和目标端口号交给认证服务。如果认证失败,发送一个陷入,丢弃报文。
(3)如果认证通过,则PDU转换成 形式。
(4)协议实体对PDU做句法检查,如果通过,根据团体名和适当的访问策略作相应的处理。
SNMPv2协议数据单元
2.SNMPV2 PDU
SNMPv2共有6种协议数据单元,分为3种PDU格式。GetRequest、GetNextRequest、SetRequest、InformRequest和Trap等5种PDU与Response PDU有相同的格式,只是它们的错误状态和错误索引字段被置为0,这样就减少了PDU格式的种类。
SNMPv2协议数据单元
SNMPv2协议数据单元
这些协议数据单元在管理站和代理系统之间或者是两个管理站之间交换,以完成需要的协议操作。
SNMPv2协议数据单元
管理站和代理系统对这些PDU的处理和应答过程:
(1)GetRequest PDU:SNMPv2对该操作的响应方式与SNMPvl不同,SNMPvl的响应是原子性的,即只要有一个变量的值检索不到,就不返回任何值;而SNMPv2的响应不是原子性的,允许部分响应,按照以下规则对变量绑定表中的各个变量进行处理。
SNMPv2协议数据单元
① 如果该变量的对象标识符前缀不能与这一请求可访问的任何变量的对象标识符前缀匹配,则返回一个错误值noSuchoObject。
② 如果变量名不能与这一请求可访问的任何变量名完全匹配,则返回一个错误值noSuchInstanee。这种情况可能出现在表访问中,即访问了不存在的行或正在生成中的表行等。
SNMPv2协议数据单元
③ 如果不属于以上情况,则在变量绑定表中返回被访问的值。
④ 如果由于任何其他原因而处理失败,则返回一个错误状态genErr,对应的错误索引指向有问题的变量。
⑤ 如果生成的响应PDU太大,超过了本地或请求方的最大报文限制,则放弃这个PDU,构造一个新的响应PDU,其错误状态为tooBig,错误索引为0,变量绑定表为空。
SNMPv2协议数据单元
改变Get响应的原子性为可以部分响应是一个重大进步。在SNMPvl中,如果Get操作的一个或多个变量不存在,代理就返回错误noSuchName。剩下的事情完全由管理站处理,要么不向上层返回值,要么去掉不存在的变量,重发检索请求,然后向上层返回部分结果。由于生成部分检索算法的复杂性,很多管理站并不实现这一功能,因而就不可能与实现部分管理对象的代理系统互操作。
SNMPv2协议数据单元
(2)GetNextRequest PDU:在SNMPv2中,这种检索请求的格式和语义与SNMPvl基本相同,唯一的差别就是改变了响应的原子性。SNMPv2实体按照下面的规则处理GetNext PDU变量绑定表中的每一个变量,构造响应PDU。
SNMPv2协议数据单元
① 对变量绑定表中指定的变量在MIB中查找按照词典顺序排列的后继变量,如果找到则返回该变量(对象实例)的名字和值。
② 如果找不到按照词典顺序排列的后继变量,则返回请求PDU中的变量名和错误值endOfMibView。
③ 如果出现其他情况使得构造响应PDU失败,则以与GetRequest类似的方式返回错误值。
SNMPv2协议数据单元
(3)GetBulkRequest PDU:这是SNMPv2对原标准的主要增强,目的是以最少的交换次数检索大量的管理信息,或者说管理站要求尽可能大的响应报文。对这个操作的响应,在选择MIB变量值时采用与GetNextRequest同样的原理,即按照词典顺序选择后继对象实例,但是这个操作可以说明多种不同的后继。
SNMPv2协议数据单元
(4)SetRequest PDU:这个请求的格式和语义与SNMPvl的相同,差别是处理响应的方式小同。SNMPv2实体分两个阶段处理这个请求的变量绑定表,首先是检验操作的合法性,然后再更新变量,如果至少有一个变量绑定对的合法性检验没有通过,则不进行下一阶段的更新操作。因此这个操作与SNMPvl一样,是原子性的。合法性检验包括以下内容。
SNMPv2协议数据单元
① 如果有一个变量不可访问,则返回错误状态noAccess。
② 如果与绑定表中变量共享对象标识符的任何MIB 变量都不能生成、不能修改,也不接受指定的值,则返回错误状态notWritable。
③ 如果要设置的值的类型不适合被访问的变量,则返回错误状态wrongType。
SNMPv2协议数据单元
④ 如果要设置的值的长度与变量的长度限制不同,则返回错误状态wrongLength。
⑤ 如果要设置的值的编码不适合变量的标签,则返回错误状态wrong Encoding。
⑥ 如果指定的值在任何情况下都不能赋予变量,则返回错误状态wrongValue。
SNMPv2协议数据单元
⑦ 如果变量不存在,也不能生成,则返回错误状态noCreation。
⑧ 如果变量不存在,只是在当前的情况下不能生成,则返回错误状态inconsistantName。
⑨ 如果变量存在,但不能修改,则返回错误状态notwritable。
⑩ 如果变量在其他情况下可以赋予指定的值,但当前不行,则返回错误状态inconsistantValue。
SNMPv2协议数据单元
⑾ 如果为了给变量赋值而缺乏需要的资源,则返回错误状态resourceUnavailable。
⑿ 如果由于其他原因而处理变量绑定对失败,则返回错误状态genErr。如果对任何变量检查出上述任何一种错误,则在响应PDU 变量绑定表中设置对应的错误状态,错误索引设置为问题变量的序号。使用如此之多的错误代码也是SNMPv2的一大进步,这使得管理站能了解详细的错误信息,以便采取纠正措施。
SNMPv2协议数据单元
如果没有检查出错误,就可以给所有指定变量赋予新值。若有至少一个赋值操作失败,则所有赋值被撤销,并返回错误状态为commitFailed的PDU,错误索引指向问题变量的序号;但是若不能全部撤销所赋的值,则返回错误状态undoFailed,错误索引字段置0。
SNMPv2协议数据单元
(5)Trap PDU:陷入是由代理发给管理站的非确认性消息,SNMPv2的陷入采用与Get等操作相同的PDU格式,这一点也是与原标准不同的。TrapPDU的变量绑定表中应报告下面的内容。
① 的值,即发出陷入的时间。
② 的值,这是SNMPv2 MIB对象组定义的陷入对象的标识符。
③ 有关通知宏定义中包含的各个变量及其值。
④ 代理系统选择的其他变量的值。
SNMPv2协议数据单元
(6)InformRequest PDU:
这是管理站发送给管理站的消息,PDU格式与Get等操作相同,变量绑定表的内容与陷入报文一样。但是与陷入不同,这个消息是需要应答的。因此,管理站收到通知请求后首先要决定应答报文的大小,如果应答报文的大小超过本地或对方的限制,则返回错误状态tooBig。
SNMPv2协议数据单元
如果接收的请求报文不是太大,则把有关信息传送给本地的应用实体,返回一个错误状态为加Err的响应报文,其变量绑定表与收到的请求PDU相同。
管理站之间的通信
SNMPv2增加的管理站之间的通信机制是分布式网络管理所需要的功能特征,为此引入了通知报文InformRequest和管理站数据库(manager-to-manager MIB)。管理站数据库主要由3 个表组成。
管理站之间的通信
(1)snmpAlarmTable:报警表提供被监视的变量的有关情况,类似于RMON 警报组的功能,但这个表记录的是管理站之间的报警信息。
(2)snmpEventTable:事件表记录SNMPv2实体产生的重要事件,或者是报警事件,或者是通知类型宏定义的事件。
(3)snmpEventNotifyTable:事件通知表定义了发送通知的目标和通知的类型。
管理站之间的通信
由这3个表以及其他有关标量对象共同组成了snmpM2M 模块,该模块表示了管理站之间交换的主要信息。下面介绍以上3个表的内容。
snmpAlarmSampleType (4)采样类型,可取absoluteValue(l)和deltaValue(2)两个值。
snmpAlarmStartUpAlarm(6)报警方式,可取risingAlarm(1)、fallingAlarm(2)和risingOrFalling Alarm (3) 3个值。
管理站之间的通信
snmpAlarmRisingEventIndex(9)事件表索引,当被采样的变量超过上升门限时产生该事件。
snmpAlarmFallingEventIndex(10)事件表索引,当被采样的变量低于下降门限时产生该事件。
snmpAlarmUnavailableEventIndex(n)事件表索引,当被采样的变量不可用时产生该事件。
事件表共有6个变量;事件通知表有4个变量,图中的变量己经做了解释。
SNMPv3
SNMPv3管理框架
在RFC 2571描述的管理框架中,以前称做管理站和代理的实体现在统一称做SNMP实体(SNMP Entity)。实体是体系结构的一种实现,由一个SNMP引擎(SNMP Engine)和一个或多个有关的SNMP应用(SNMP Application)组成。
SNMPv3管理框架
1.SNMP引擎
SNMP引擎提供三项服务:发送和接收报文;认证和加密报文;控制对管理对象的访问。
SNMP引擎有唯一的标识snmpEngineID,这个标识在一个上层管理域中是无二义性的。由于SNMP引擎和SNMP实体具有一一对应的关系,因而snmpEngineID 也是对应的SNMP 实体的唯一标识。SNMP 引擎具有复杂的结构,它包含一个调度器、一个报文处理子系统、一个安全子系统以及一个访问控制子系统。
SNMPv3管理框架
(1)调度器。一个SNMP引擎只有一个调度器,它可以并发地处理多个版本的SNMP 报文。调度器的功能包括以下内容。
① 向/从网络中发送/接收SNMP报文。
② 确定SNMP报文的版本,并交给相应的报文处理模块处理。
③ 为接收PDU的SNMP 应用提供一个抽象的接口。
④ 为发送PDU的SNMP 应用提供一个抽象的接口。
SNMPv3管理框架
(2)报文处理子系统。报文处理子系统由一个或多个报文处理模块组成,每一个报文处理模块定义了一种特殊的SNMP报文格式,它的功能是按照预定的格式准备要发送的报文,或者从接收的报文中提取数据。
SNMPv3管理框架
这种体系结构允许扩充其他的报文处理模块,扩充的处理模块可以是企业专用的,也可以是以后的标准增添的。每一个报文处理模块都定义了一种特殊的SNMP 报文格式,以便能够按照这种格式生成报文或从报文中提取数据。
SNMPv3管理框架
(3)安全子系统。安全子系统提供安全服务,例如,报文的认证和加密。一个安全子系统可以有多个安全模块,以便提供各种不同的安全服务,如图5-34所示。安全子系统由安全模型和安全协议组成。每一个安全模块定义了一种具体的安全模型,说明它可以防护的安全威胁、它提供安全服务的目标和使用的安全协议。而安全协议则说明了用于提供安全服务(如认证和加密)的机制、过程以及MIB对象。目前的标准提供了基于用户的安全模型(UBM)。
SNMPv3管理框架
(4)访问控制子系统。访问控制子系统通过访问控制模块(Access Control Medel)提供授权服务,即确定是否允许访问一个管理对象,或者是否可以对某个管理对象实施特殊的管理操作。每个访问控制模块定义了一个具体的访问决策功能,用以支持对访问权限的决策。在应用程序的处理过程中,访问控制模块还可以通过已定义的MIB模块进行远程配置访问控制策略。SNMPv3定义了基于视图的访问控制模型(View-Based Access Control Model)。
SNMPv3管理框架
2.应用程序
SNMPv3的应用程序分为5种,具体功能如下。
(1)命令生成器(Command Generator):
建立SNMP Read/Write请求,并且处理这些请求的响应。
(2)命令响应器(Command Responder):
接收SNMP Read/Write请求,对管理数据进行访问,并按照协议规定的操作产生响应报文,返回给读/写命令的发送者。
SNMPv3管理框架
(3)通知发送器(Notification originator):监控系统中出现的特殊事件,产生通知类报文,并且要有一种机制,以决定向何处发送报文,使用什么SNMP版本和安全参数等。
(4)通知接收器(Notification Receiver):监听通知报文,并对确认型通知产生响应。
(5)代理转发器(Proxy Forwarder):在SNMP实体之间转发报文。
SNMPv3管理框架
在SNMP的历史上使用的“proxy”一词有多种含义,但是在RFC 2573中则专指转发 SNMP报文,而不考虑报文中包含何种对象,也不处理SNMP请求,因此它与传统的SNMP代理(agent)是不同的。
这5种应用程序的抽象接口和操作过程不再详述,读者可参考有关文件。为了与以前版本对照,下面介绍管理站和代理的组成。
SNMP管理站和代理
一个SNMP实体包含一个或多个命令生成器以及通知接收器,这种实体传统上称做SNMP管理站,如图5-36所示。
一个SNMP实体包含一个或多个命令响应器以及通知发送器,这种实体传统上称做SNMP代理,如图5-37所示。
SNMP管理站和代理
1.基于用户的安全模型(USM)
SNMPv3把对网络协议的安全威胁分为主要的和次要的两类。标准规定安全模块必须提供防护的4种主要威胁如下:修改信息、假冒、修改报文流、消息泄露。 2种次要威胁如下:拒绝服务、通信分析。
SNMP管理站和代理
因此,RFC 2574把安全协议分为以下3个模块:时间序列模块,提供对报文延迟和重放的防护;认证模块,提供完整性和数据源认证;加密模块,防止报文内容的泄露。
SNMP管理站和代理
(1)时间序列模块。
(2)认证和加密模块。
① HMAC-MD5-96协议。
② HMAC-SHA-96认证协议。
③ CBC-DES对称加密协议。
④ 密钥的局部化。
⑤ 密钥的更新。
SNMP管理站和代理
2.基于视图的访问控制(VACM)模型
当一个SNMP实体处理检索(Get或Getnext等)或修改(Set)请求时,都要检查是否允许访问指定的管理对象,以及是否允许执行请求的操作。另外,当SNMP实体生成通知报文时,也要用到访问控制机制,以决定把消息发送给谁。在VACM模型中要用到以下概念。
SNMP管理站和代理
SNMP上下文(Context):简称上下文,是 SNMP 实体可以访问的管理信息的集合。一个管理信息可以存在于多个上下文中,而一个 SNMP 实体也可以访问多个上下文。在一个管理域中,SNMP上下文由唯一的名字contextName标识。
组(Group):由二元组<securityMedel,securityName>的集合构成。属于同一组的所有安全名securityName在指定的安全模型securityModel下的访问权限相同。组的名字用groupName表示。
SNMP管理站和代理
安全模型(Security Model):表示访问控制中使用的安全模型。
安全级别(Security Level):在同一组中的成员可以有不同的安全级别,即 noAuthNoPriv(无认证不保密)、authNoPriv(有认证不保密)和authPriv(有认证要保密)。任何一个访问请求都有相应的安全级别。
操作(Operation):指对管理信息执行的操作,例如读、写和发送通知等。
SNMP管理站和代理
(1)视图和视图系列。
(2)VACM MIB的组成,VACM MIB由以下4个表组成。
① vacmContextTable。
② vacmSecurityToGroupTable。
③ vacmAccessTable。
④ vacmViewTreeFamilyTable。
(3)访问控制决策过程。访问控制决策过程如图5-41所示,对这个过程解释如下。
小结
SNMP是目前TCP/IP网络中应用最广泛的网络管理协议,使网络管理事实上的标准。它不仅包括网络管理协议本身,而且代表采用SNMP的网络管理框架。SNMP经历了从v1到v3的发展历程。
本章从协议数据单元、支持操作、报文发送接收、功能组、安全性、局限性等几个方面分别分析了3个版本SNMP,对管理框架和通信过程给出了详细描述。SNMPv1管理模型包括4个关键元素:管理端、管理代理、管理信息库、管理协议。与SNMPv1单纯的集中式管理模式不同,SNMPv2支持分布式/分层式的网络管理结构,
在SNMPv2管理模型中有些系统可以同时具有管理点和管理代理的功能,SNMPv2定义了两个MIB,一个相当于SNMPv1的MIB-2,另一个是管理端到管理端的MIB库,提供对分布式管理结构的支持。SNMPv3可运用于多种操作环境,具有多种安全处理模块,有极好的安全性和管理功能,弥补了前两个版本在安全方面的不足。