1、 SNMP培训手册第 1 页 共 39SNMP 协议详解SNMP培训手册第 2 页 共 39目 录一 SNMP 协议概述 .21 什么是 SNMP 协议 .22 SNMP 版本 .33 SNMP 的基本操作 .44 网管站和代理 .45 ASN.1 和 SMI.56 SNMP 报文 .66.1 SNMP的 5种协议数据单元 .67 管理变量的表示 .98 SNMP 的运行过程 .108.1 GETREQUEST PDU.108.2 GETNEXTREQUEST PDU .118.3 GETRESPONSE PDU.128.4 SETREQUEST PDU.128.5 TRAP PDU .13一
2、 SNMP 协议概述1 什么是 SNMP协议SNMP(Simple Network Management Protocol)是被广泛接受并投入使用的工业标准,它的目标是保证管理信息在任意两点中传送,便于网络管理员在网络上的任何节点检索信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成。它采用轮询机制,提供最基本的功能集。最适合小型、快速、低价格的环境使用。它只要求无证实的传输层协议 UDP,受到许多产品的广泛支持。SNMP 在 TCP/IP 协议族中的地位如下图:SNMP (用到 ASN.1 抽象语法记法)UDPIP链路层协议硬件SNMP培训手册第 3 页 共 392 SNMP版本SN
3、MPv1:简单网络管理协议,是第一个正式协议版本,在 RFC1157 中定义;SNMPv2C:基于共同体(Community-based)的 SNMPv2 管理架构, 在 RFC1901 中定义的一个实验性协议;SNMPv3 :通过对数据进行鉴别和加密,提供了以下的安全特性:1) 确保数据在传输过程中不被篡改;2) 确保数据从合法的数据源发出;3) 加密报文,确保数据的机密性;SNMPv1 和 SNMPv2C 都采用基于共同体(Community-based)的安全架构。通过定义主机地址以及认证名(Commumity string)来限定能够对代理的 MIB 进行操作的管理者。SNMPv2C
4、包含 GetBulk 的机制并且能够对管理工作站返回更加详细的错误信息类型。GetBulk 能够一次性的获取表格中的所有信息或者获取大批量的数据,从而减少请求-响应的次数。SNMPv2C 错误处理能力的提高包括扩充错误代码以区分不同类型的错误,在 SNMPv1 中这些错误仅有一种错误代码。现在通过错误代码可以区分错误类型。由于网络上可能同时存在支持 SNMPv1 和SNMPv2C 的管理工作站,因此 SNMP 代理必须能够识别 SNMPv1 和 SNMPv2C 报文,并且能返回相应版本的报文。在SNMPv2 的基础上, SNMPv通过安全模型以及安全级别来确定对数据采用哪种安全机制进行处理;目
5、前可用的安全模型有三种类别:SNMPv1,SNMPv2C,SNMPv3。下表为目前可用的安全模型以及安全级别安全模型 安全级别 鉴别 加密 说明SNMPv1 noAuthNoPriv 认证名 无 通过认证名确认数据的合法性SNMPv2c noAuthNoPriv 认证名 无 通过认证名确认数据的合法性SNMPv3 noAuthNoPriv 用户名 无 通过用户名确认数据的合法性SNMPv3 authNoPriv MD5 或者 SHA 无 提供基于 HMAC-MD5 或者 HMAC-SHA 的数据鉴别机制SNMPv3 authPriv MD5 或者 SHA DES 提供基于 HMAC-MD5 或
6、者 HMAC-SNMP培训手册第 4 页 共 39SHA 的数据鉴别机制提供基于 CBC-DES的数据加密机制3 SNMP的基本操作操作 操作含义Get-request 从某变量中取值Get-next-request 在表格中取下一项值Get-response 响应取操作Set-request 把一数值存入具体变量trap 报告事件信息SNMP 以 GET-SET 方式替代了复杂的命令集,利用基本操作演绎出全部操作。用户可以采用管理信息库标准或按标准的方式来定义自己的管理信息库(MIB) 。这样做的好处是:通过降低占网管系统中大多数的代理部件的成本来降低整个网管系统的成本。4 网管站和代理网管
7、站(NMS)对网络设备发送各种查询报文,并接收来自被管设备的响应及陷阱(trap)报文,将结果显示出来。代理(agent)是驻留在被管设备上的一个进程,负责接受、处理来自网管站的请求报文,然后从设备上其他协议模块中取得管理变量的数值,形成响应报文,反送给 NMS。在一些紧急情况下,如接口状态发生改变,呼叫成功等时候,主动通知 NMS(发送陷阱 TRAP 报文) 。他们的关系如下图:SNMP培训手册第 5 页 共 39SNMP 就是用来规定 NMS 和 Agent 之间是如何传递管理信息的应用层协议。5 ASN.1和 SMISNMP 是应用层协议,它要求两端的协议实体交换各种报文,而低层要求用户
8、数据都是 BYTE 序列,这就产生了一个问题: SNMP 协议实体如何从接受到的一个 BYTE 序列中识别出报文又如何把一个用内部数据结构表示的报文转换成一个可供发送的 BYTE 序列, 也就是编解码问题。解决这个问题,就需要一个定义从实际的软件数据结构中抽象出来的数据类型的表示方法,称为抽象句法。ASN.1 就是用来描述抽象记法的语言,事实上可应用与任何协议层,在它的基础上,通过规定编码规则,就可以确定数据在传送中的八比特组的值。SMI(Struct of Management Imformation) ,通过定义一个宏 OBJECT-TYPE,规定了管理对象的表示方法,从这个意义上说,它是
9、 ASN.1 的一个子集。另外它还定义了几个 SNMP 常用的基本类型和值。MIB (Management Imformation Base), 是所监控网络设备的标准变量定义的集合。SNMP 用层次结构命名方案来识别管理对象,就象一棵树,树的节点表示管理对象,它可以用从根开始的一条路径来无二义的识别。见下图:NMS UDP port 162UDP port 16 AGENT Request Response TrapSNMP培训手册第 6 页 共 39A 2 615 2 1 12 1B管理对象 B 可以用一串数字唯一确定1.2.1.1 这串数字是管理对象的 object identifier
10、(客体标识符) 。通过 object identifier 可确定从根到 B 的一条路径。管理对象 A 的 object identifier 是1.2.1.1.5,或B 5,后一种表示方法表明 A 是 B 的第 5 棵孩子。在 agent 中这棵树是用较复杂的数据结构来实现的,幸运的是,建树这个工作可由 MIB 编译器完成。在树的叶节点中,存放有访问函数的指针,Agent 就是通过调用这些函数来从相关模块取得管理变量的值的。6 SNMP报文SNMP 报文结构如下:(编码之前)版本号团体名协议数据单元 PDUSNMP 共有 5 种报文,所以其 PDU 也有 5 中,第七点会详细介绍 SNMP
11、的 5 种协议数据单元。6.1 SNMP的 5种协议数据单元SNMP 规定了 5 种协议数据单元 PDU(也就是 SNMP 报文) ,用来在管理进程和代理之间的交换。get-request 操作:从代理进程处提取一个或多个参数值。get-next-request 操作:从代理进程处提取紧跟当前参数值的下一个参数值。set-request 操作:设置代理进程的一个或多个参数值。get-response 操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。trap 操作:代理进程主动发出的报文,通知管理进程有某些事情发生。前面的 3 种操作是由管理进程向代理进程发
12、出的,后面的 2 个操作是代理进程发给管理进程的,为了简化起见,前面 3 个操作今后叫做 get、get-next 和 set 操作。图 1 描述了 SNMP 的这 5 种报文操作。请注意,在代理进程SNMP培训手册第 7 页 共 39端是用熟知端口 161 俩接收 get 或 set 报文,而在管理进程端是用熟知端口 162 来接收 trap 报文。图 1 SNMP 的 5 种报文操作图 2 是封装成 UDP 数据报的 5 种操作的 SNMP 报文格式。可见一个 SNMP 报文共有三个部分组成,即公共 SNMP 首部、get/set 首部、trap 首部、变量绑定。(1)公共 SNMP 首部
13、共三个字段: 版本 写入版本字段的是版本号减 1,对于 SNMP(即 SNMPV1)则应写入 0。 共同体(community)共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是 6 个字符“public” 。 PDU 类型根据 PDU 的类型,填入 04 中的一个数字,其对应关系如表 2 所示意图。SNMP培训手册第 8 页 共 39表 2 PDU 类型PDU 类型 名称0 get-request1 get-next-request2 get-response3 set-request4 trap(2)get/set 首部 请求标识符(request ID)这是由管理进程设
14、置的一个整数值。代理进程在发送 get-response 报文时也要返回此请求标识符。管理进程可同时向许多代理发出 get 报文,这些报文都使用 UDP 传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文 差错状态(error status)由代理进程回答时填入 05 中的一个数字,见表 3 的描述 表 3 差错状态描述差错状态 名字 说明0 noError 一切正常1 tooBig代理无法将回答装入到一个 SNMP 报文之中2 noSuchName 操作指明了一个不存在的变量3 badValue一个 set 操作指明了一个无效值或无效语法4 re
15、adOnly 管理进程试图修改一个只读变量5 genErr 某些其他的差错 差错索引(error index)当出现 noSuchName、badValue 或 readOnly 的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。(3)trap 首部 企业(enterprise)SNMP培训手册第 9 页 共 39填入 trap 报文的网络设备的对象标识符。此对象标识符肯定是在图 3 的对象命名树上的 enterprise 结点1.3.6.1.4.1下面的一棵子树上。 trap 类型此字段正式的名称是 generic-trap,共分为表 4 中的 7 种。 当使
16、用上述类型 2、3、5 时,在报文后面变量部分的第一个变量应标识响应的接口。 特定代码(specific-code)指明代理自定义的时间(若 trap 类型为 6) ,否则为 0。 时间戳(timestamp)指明自代理进程初始化到 trap 报告的事件发生所经历的时间,单位为 10ms。例如时间戳为 1908 表明在代理初始化后 1908ms 发生了该时间。(4)变量绑定(variable-bindings)指明一个或多个变量的名和对应的值。在 get 或 get-next 报文中,变量的值应忽略。7 管理变量的表示管理变量表示管理对象类型在某一时刻的值(或称该类型的实例) ,SNMP 以管
17、理变量作为操作对象。管理变量的表示方法是这样规定的:形如 x.y,其中 x 是管理对象的 object identifer。y 是能唯一确定对象类型值的一组数字,在非表型变量中为 0,在表型变量中是这个表的索引,比如接口表中的接口号,或路由表中的目的网络地址等等 。如:在 MIB 文件里定义了 ipAdEntNetMask 这一管理对象,其 object identifier 为trap 类型 名字 说明0 coldStart 代理进行了初始化1 warmStart 代理进行了重新初始化2 linkDown 一个接口从工作状态变为故障状态3 linkUp 一个接口从故障状态变为工作状态4 au
18、thenticationFailure 从 SNMP 管理进程接收到具有一个无效共同体的报文5 egpNeighborLoss 一个 EGP 相邻路由器变为故障状态6 enterpriseSpecific 代理自定义的事件,需要用后面的“特定代码”来指明SNMP培训手册第 10 页 共 391.3.6.1.1.5.6.1.3 它是个路由表中的一项,它的一个实例就是路由表中某一行的子网掩码,如果这行的索引、目的网络地址为 129.102.1.0。则这个变量名是:1.3.6.1.1.5.6.1.3.129.102.1.0。在以后的说明中,为了方便,把唯一确定管理变量的一组数字,也就是 x.y 中的
19、 y 称作实例。8 SNMP的运行过程驻留在被管设备上的 AGENT 从 UDP 端口 161 接受来自网管站的串行化报文,经解码、团体名验证、分析得到管理变量在 MIB 树中对应的节点,从相应的模块中得到管理变量的值,再形成响应报文,编码发送回网管站。网管站得到响应报文后,再经同样的处理,最终显示结果。下面根据 RFC1157 详细介绍 Agent 接受到报文后采取的动作:首先解码生成用内部数据结构表示的报文,解码依据 ASN.1 的基本编码规则,如果在此过程中出现错误导致解码失败则丢弃该报文,不做进一步处理。第二步:将报文中的版本号取出,如果与本 Agent 支持的 SNMP 版本不一致,
20、则丢弃该报文,不做进一步处理。当前北研的数据通信产品只支持 SNMP 版本 1。第三步:将报文中的团体名取出,此团体名由发出请求的网管站填写。如与本设备认可的团体名不符,则丢弃该报文,不做进一步处理,同时产生一个陷阱报文。SNMPv1 只提供了较弱的安全措施,在版本 3 中这一功能将大大加强。第四步:从通过验证的 ASN.1 对象中提出协议数据单元 PDU,如果失败,丢弃报文,不做进一不处理。否则处理 PDU,结果将产生一个报文,该报文的发送目的地址应同收到报文的源地址一致。根据不同的 PDU,SNMP 协议实体将做不同的处理:8.1 GetRequest PDU第一种情况:如果 PDU 中的
21、变量名在本地维护的 MIB 树中不存在,则接受到这个 PDU 的协议实体将向发出者发送一个 GetResponse 报文,其中的 PDU 与源 PDU 只有一点不同:将 ERROR-STATUS 置为 noSuchName,并在ERROR-INDEX 中指出产生该变量在变量 LIST 中的位置。第二种情况:如果本地协议实体将产生的响应报文的长度大于本地长度限制,将向该 PDU 的发出者发送一个GetResponse 报文,该 PDU 除了 ERROR-STATUS 置为 tooBig,ERROR-INDEX 置为 0 以外,与源 PDU 相同。第三种情况:如果本地协议实体因为其他原因不能产生正确的响应报文,将向该 PDU 的发出者发送一个GetResponse 报文,该 PDU 除了 ERROR-STATUS 置为 genErr,ERROR-INDEX 置为出错变量在变量 LIST 中的位置,其余与源 PDU 相同。第四中情况:如果上面的情况都没有发生,则本地协议实体向该 PDU 的发出者发送一个 GetResponse 报文,该