基于TCP/IP的网络管理包含3个组成部分:
1) 一个管理信息库MIB(Management Information Base)。管理信息库包含所有代理进程的所有可被查询和修改的参数。RFC 1213[McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II。
2) 关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMI(Structure of Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990] 中定义。例如:SMI定义计数器是一个非负整数,它的计数范围是 0~4294967295,当达到最大值时,又从0开始计数。
3) 管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定义。SNMP包括数据报交换的格式等。尽管可以在传输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。
一、SNMP协议概述
简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。 虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。 二、SNMP的发展史
SNMP经过了一个相对较长的发展过程,到目前为止一共经历了三个版本。当下使用最广泛是SNMPv2。
1989年发布了第一个版本的SNMP,称为SNMPv1。
1991年发布SNMP的一个补充---RMON(Remote Network Monitoring,远程网络监视)。RMON扩充了SNMP的功能,包括对LAN的管理以及对依附于这些网络设备的管理。注:RMON没有修改和增加SNMP协议本身以及SMI,只是增加了SNMP监视子网的能力,把整个子网当成一个个体来监视,提供了新的MIB库及相关的MIB行为。
1993年SNMPv1的升级版被提出,SNMPv2。
1995年SNMPv2正式发布,v2增加了SNMPv1的功能,并规定了如何在基于OSI的网络中使用SNMP。同时RMON于本年度扩展为RMONv2
1998年SNMPv3发布,一系列文档定义了SNMP的安全性,并定义了将来改进的总体结构。SNMPv3可以和v2、v1一起使用。 三、SNMP的工作原理
SNMP采用特殊的客户机/服务器模式,即代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。
SNMP的应用场景如图1所示:
管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。 四、SNMP的报文类型
SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap 。
(1)Get-Request 、Get-Next-Request与Get-Response
SNMP 管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next- Request用于和Get-Request组合起来查询特定的表对象中的列元素。
(2)Set-Request
SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。
(3)Trap
SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生,如接口UP/DOWN,IP地址更改等。
上面五种消息中Get-Request、Get-Next-Request和Set-Request是由管理站发送到代理侧的161端口的;后面两种Get-Response和Trap 是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。SNMP工作流程如图2:
五、SNMP的报文格式
SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。
在实际网络传输环境下,SNMP报文的长度取决于其所采用的编码方式。SNMP统一采用BER(Basic Encoding Rule)的编码规则,同时在正式SNMP规范中使用的是ASN.1语法,Abastract Syntax Notation v1,即抽象语法描述语言。这两个概念在后面实践环节再做进一步介绍,这里只要稍微了解一下即可,不妨碍我们对协议本身的分析。这里我们简单解释一下BER编码规则:
BER作为ANS.1的基本编码规则,描述具体的ANS.1对象如何编码为比特流在网络上进行传输。BER编码规则由三部分组成:
SNMP中定义了几种基本的数据类型,其中v1和v2版有些改动,具体参见相应的RFC文档。这里我们只介绍几种最常见的类型:
l INTEGER:一个整数
l OCTER STRING: 0或多个8bit字节,每个字节在0~255之间取值
l DisplayString:0或多个8bit字节,每个字节必须是ASCII码。在MIB-II中,所有该类型变量不能超过255个字符(0个字符可以)
l NULL:代表相关的变量没有值
l IpAddress:4字节长的OCTER STRING,以网络字节序表示IP地址
l PhyAddress:6字节长的OCTER STRING,代表物理地址
l Counter:非负整数,可以从0递增到232-1()。达到最大值后归0
l TimeTicks:时间计数器,以0.01秒为单位递增,不同的变量可以有不同的递增幅度。所以在定义这种类型的变量时需要制定递增幅度
l SEQUENCE:与C语言中的结构体类似
l SEQUENCE OF:一个向量,参见后面ANS.1语法详细介绍章节
SNMP报文在传输层是封装在UDP报文中的,而UDP又是基于IP网络的,因此,我们可以得到完整的报文描述结构,如下图所示:
PDU类型其实包含两个字节,第一个字节表示真实的PDU的类型;第二个字节表示后面报文所占的字节总数。针对SNMPv1,这个字段取值如下:
表1 PDU类型
PDU类型 名称代理进程对自己初始化
1warmStart一个接口已从工作状态变为故障状态(报文中的第一个变量标识此接口)
3linkUp从SNMP管理进程收到无效共同体的报文
5egpNeighborLoss地址)
6enterpriseSpecific《span times=“” new=“” roman“;=”“ mso-hansi-font-family:”times=“” roman“;mso-bidi-font-family:”times=“” mso-font-kerning:0pt“=”“ style=”word-wrap: break-word; font-size: 9pt; font-family: 宋体;“》在这个特定的代码段中查找trap信息
通过wireshark抓包工具,捕获一条如下的SNMP报文,接下来对其进行仔细分析。
其余部分都为SNMP报文,接下来我们对照前面的报文结构体来逐个分析一下。
SNMPv2 Trap报文
SNMPv2的Trap报文格式如图8所示:
同样的,这里除了trap类型和报文长度是标准网络字节序之外,其余协议字段也均为BER编码方式。可以看到v2版的trap报文正在向统一的报文格式发展,已经非常类似普通的SNMP请求、响应报文了。
SNMPv2原始报文内容:
余下部分全为SNMP报文内容,这里我们做一下简单的约定:
xx 标注类型;xx 标注长度;xx 标注真正的数据。
这样一来上面这串原始数据就好分析多了J
|