SNMP简单网络管理协议
SNMP协议详解
简单网络管理协议(SNMP:Simple Network Management Protocol)是由Internet组织IETF(互联网工程任务组,IETF:Internet Engineering Task Force )定义的一套用来管理Internet的网络协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。
随着Internet所使用的TCP/IP协议族成为事实上的网间网互连协议标准,SNMP也成为计算机网络管理方面大家实际遵循的标准。几乎所有的Internet网络设备的生产厂家都在开发与SNMP有关的产品并投放市场。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。
管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定义。SNMP包括数据报交换的格式等。尽管可以在传输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。
应当指出,SNMP MIB的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含SNMP代理软件,并保证在定义新的MIB项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的MIB的多个路由器。当然,一个没有新的MIB项目的路由器不能提供这些项目的信息。
SNMP具有以下优势:
自动化网络管理。网络管理员可以利用SNMP平台在网络上的节点检索信息、修改信息、发现故障、完成故障诊断、进行容量规划和生成报告。
屏蔽不同设备的物理差异,实现对不同厂商产品的自动化管理。SNMP只提供最基本的功能集,使得管理任务分别与被管设备的物理特性和下层的联网技术相对独立,从而实现对不同厂商设备的管理,特别适合在小型、快速和低成本的环境中使用。
作为一个完备的系统,必须有一套反馈机制来调整系统的运行。简单网络管理协议产生的目的,就是为了使松散的网络更加有效地运行。它广泛的应用于监测网络的状态、网络设备的运行情况、各种电脑设备以及一些辅助的外围设备,使得网络管理员通过对节点的查询和设置,发现并定位故障,进而采取相应措施维护网络。网络管理的研究已经发展了许多年,对于日益纷繁的需求,简捷性和扩展性仍是研究的主题。
SNMP的体系结构是围绕着以下四个概念和目标进行设计的:保持管理代理(agent)的软件成本尽可能低;最大限度地保持远程管理的功能,以便充分利用Internet的网络资源;体系结构必须有扩充的余地;保持SNMP的独立性,不依赖于具体的计算机、网关和网络传输协议。在最近的改进中,又加入了保证SNMP体系本身安全性的目标。
SNMP的发展史
SNMP的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB:体系结构,改进后的协议就是著名的SNMP。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。现在SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。
SNMP经过了一个相对较长的发展过程,到目前为止一共经历了三个版本。当下使用最广泛是SNMPv2。目前SNMP有三个版本snmpV1、snmpV2、snmpV3。针对原始的V1版,93版的v2加入了安全机制,但用户对其并不感兴趣,在96版的v2中又删除了安全机制,99年开始酝酿的v3版开始提出一个snmp的统一架构,采用User-based安全模型和View-based访问控制模型提供SNMP网络管理的安全性。安全机制是SNMPv3的最具特色的内容。
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的网络管理模型包括以下关键元素:管理端、代理端、管理信息库、网络管理协议。它基于tcp/ip协议,属于应用层协议,通过udp协议通信。管理端与代理端的通信原语包括:Get,Getnext,Set,Trap。在udp数据包中,发送信息是按ASN.1自解释方式编码的。但对于许多小型被监管设备,可能会运行不同协议,或者运行完整代理花费很大,于是产生了代管设备,主代理和子代理的概念。在小型设备上运行子代理,把数据发给主代理来完成snmp协议的通信。
在SNMP管理模型中有三个基本组成部分:管理者(Manager),被管代理(Agent)和管理信息库(MIB)。管理站一般是一个单机设备或一个共享网络中的一员,它是网络管理员和网络管理系统的接口,能将网络管理员的命令转换成对远程网络元素的监视和控制,同时从网上所有被管实体的MIB (管理信息库) 中提取出信息数据。作为管理站,它还必须拥有能进行数据分析、故障发现等管理应用软件。整个管理站的管理工作是通过轮询代理来完成的。管理者可以通过 SNMP 操作直接与管理代理通信,获得即时的设备信息,对网络设备进行远程配置管理或者操作也可以通过对数据库的访问获得网络设备的历史信息,以决定网络配置变化等操作。SNMP管理代理指的是用于跟踪监测被管理设备状态的特殊软件或硬件,每个代理都拥有自己本地的MIB。实际上,SNMP 的管理任务是移交给管理代理来执行的。代理翻译来自管理站的请求,验证操作的可执行性,通过直接与相应的功能实体通信来执行信息处理任务, 同时向管理站返回响应信息。
SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站NMS(Network Management Station,网络管理站)与SNMP代理Agent间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于SNMP MIB定义信息的各种查询。
Agent是驻留在设备上的一个进程,负责接收、处理来自NMS的请求报文。在一些紧急情况下,如接口状态发生改变等,Agent也会主动通知NMS。 NMS是SNMP网络的管理者,Agent是SNMP网络的被管理者。NMS和Agent之间通过SNMP协议来交互管理信息。
管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。
SNMP的实现模型实例
网管基本模型:
嵌入式Agent软件结构:
下图是NMS公司网络产品中SNMP协议的实现模型。
SNMP协议的实现模型
SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作(不保证报文是否正确到达)。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。数据报结构如下图:
数据报结构
版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息。协议数据单元(PDU):其中PDU指明了SNMP的消息类型及其相关参数。
版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息。协议数据单元(PDU):其中PDU指明了SNMP的消息类型及其相关参数。
管理信息库MIB
一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。
管理信息库MIB(Management Information Base)包含所有代理进程的所有可被查询和修改的参数。RFC 1213[McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II。
MIB信息为网管中被管资源,而网络管理中的资源是以对象表示的,每个对象表示被管资源的某方面属性,这些对象形成了SNMP管理信息库MIB。每个MIB变量记录了每个相连网络的状态、通信量统计数据、发生差错的次数以及内部数据结构的当前内容等。网络管理者通过对MIB库的存取访问,来实现五大管理功能。MIB也可以看作是NMS(网管系统)和Agent之间的沟通桥梁。
MIB对象定义格式
在实际网络传输环境下,SNMP报文的长度取决于其所采用的编码方式。SNMP统一采用BER(Basic Encoding Rule)的编码规则,同时在正式SNMP规范中使用的是ASN.1语法,Abastract Syntax Notation v1,即抽象语法描述语言。
BER作为ANS.1的基本编码规则,描述具体的ANS.1对象如何编码为比特流在网络上进行传输。BER编码规则由三部分组成:
SNMP中定义了几种基本的数据类型,其中v1和v2版有些改动,具体参见相应的RFC文档。这里我们只介绍几种最常见的类型:
INTEGER:一个整数
OCTER STRING: 0或多个8bit字节,每个字节在0~255之间取值
DisplayString:0或多个8bit字节,每个字节必须是ASCII码。在MIB-II中,所有该类型变量不能超过255个字符(0个字符可以)
NULL:代表相关的变量没有值
IpAddress:4字节长的OCTER STRING,以网络字节序表示IP地址
PhyAddress:6字节长的OCTER STRING,代表物理地址
Counter:非负整数,可以从0递增到232-1()。达到最大值后归0
TimeTicks:时间计数器,以0.01秒为单位递增,不同的变量可以有不同的递增幅度。所以在定义这种类型的变量时需要制定递增幅度
SEQUENCE:与C语言中的结构体类似
SEQUENCE OF:一个向量,参见后面ANS.1语法详细介绍章节
SNMP报文在传输层是封装在UDP报文中的,而UDP又是基于IP网络的,因此,我们可以得到完整的报文描述结构,如下图所示:
PDU类型其实包含两个字节,第一个字节表示真实的PDU的类型;第二个字节表示后面报文所占的字节总数。针对SNMPv1,这个字段取值如下:
表1 PDU类型
PDU类型 |
名称 |
0 |
get-request |
1 |
get-next-request |
2 |
get-response |
3 |
set-request |
4 |
trap |
也就是说,trap的类型是4。但是在数据报文中,该字段一般表示为ax,其中x取[0,4],即a0~a3表示相应的get、set等操作,a4表示trap报文。这里除了类型字段意外,其他字段均采用BER编码方式:
ASN.1是一种用于描述结构化客体的结构和内容的语言,基于编码规则BER(Basic Encoding Rules)是ASN.1标准定义的一种传送文法。每个MIB变量格式是SMI规定的,用ASN.1描述如下:
OBJECTNAME BOJECT-TYPE
DESCRIPTION:(description)
SYNTAX: (syntax)
ACCESS: (access)
STATUS: (status)
::={(Parent)number}
OBJECTNAME 是被管对象的名字,ASN.1要求所有对象的名字在MIB中必须是唯一的;BOJECT-TYPE 是每一个节点对象所必需的关键字;SYNTAX是被管对象类型的关键字,随后跟着的是一个类型(syntax);ACCESS是被管对象的访问方式关键字,在SNMP 第二版中为MAX-ACCESS 关键字,(access)是被管对象的访问方式,可为如下列举值之一: read-only、read-write、no-accessible, SNMP 第2 版中又增加了read-create;STATUS是被管对象关键字,(status)是被管对象的状态,如必备的、可选的或废弃 的;DESCRIPTION是对被管对象的功能、特征等进行描述的关键字,(description)是被管对象的文本描述,在:::= {(Parent)number }中,Parent表示位于MIB树中的父节点,number表示是第几个子节点。
关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMI(Structure of Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990] 中定义。例如:SMI定义计数器是一个非负整数,它的计数范围是 0~4294967295,当达到最大值时,又从0开始计数。
SMI定义了SNMP框架所用信息的组织、组成和标识,它还为描述MIB对象和描述协议怎样交换信息奠定了基础。
MIB对象标识符(OID)
每个MIB对象都用对象标识符(OID)来唯一的标识,这是用定义在ASN.1语法中的树型结构来组织的可用信息,其中每个可用信息是一个带标号的节点,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点通向它的路径,它命名节点并指示它在ASN.1树中的准确位置。一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。下图是带有ASN.1编号的MIB 树实例:可以看出MIB-Ⅱ的OID是:1.3.6.1.2.1或者iso.org.dod.internet.mgmt.mib2。在SNMP中,实现应用到的MIB对象都是MIB-Ⅱ的子树节点。
MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP的管理信息库采用和域名系统DNS相似的树型结构,它的根在最上面,根没有名字。下图画的是管理信息库的一部分,它又称为对象命名(objectnamingtree)。
对象命名(objectnamingtree)
MIB 对象及变量
对象命名树的顶级对象有三个,即ISO、ITU-T和这两个组织的联合体。在ISO的下面有4个结点,其中的饿一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是Internet(标号是1)。在只讨论Internet中的对象时,可只画出Internet以下的子树(图中带阴影的虚线方框),并在Internet结点旁边标注上{1.3.6.1}即可。 在Internet结点下面的第二个结点是mgmt(管理),标号是2。再下面是管理信息库,原先的结点名是mib。1991年定义了新的版本MIB-II,故结点名现改为mib-2,其标识为{1.3.6.1.2.1},或{Internet(1) .2.1}。这种标识为对象标识符。
最初的结点mib将其所管理的信息分为8个类别,见表1。现在de mib-2所包含的信息类别已超过40个。
表1 最初的结点mib管理的信息类别
Internet MIB是一树形结构的数据库, MIB-I定义了8个管理信息类别,MIB-Ⅱ是在MIB-I基础上的扩展,增加了SNMP和CMOT两项。MIB-Ⅱ类别说明见下表。
类别 | 标号 | 所包含的信息 |
System |
(1) | 关于实体所在系统的数据 |
Interface |
(2) | 用于管理的网络接口信息 |
AT |
(3) | 地址转换信息 |
IP |
(4) | 网络协议 |
ICMP |
(5) | 为IP设备携带错误和控制的协议 |
TCP |
(6) | 传输控制协议 |
UDP |
(7) | 用户数据报协议 |
EGP |
(8) | 外部网关协议 |
CMOT |
公共管理信息与服务协议 |
|
SNMP |
简单网络管理协议 |
表1 MIB类别表
MIB 库中每一个变量都符合ASN.1语法规则,MIB库中只使用了ASN.1诸多类型中的INTEGER,OCTET STRING,OBJECT IDENTIFIER,NULL作为基本类型,同时定义了IpAddress,Counter,Gauge,TimeTicks,Opaque类型,大体上说,MIB中变量可分为两大部分,简单变量(Simple variable)和表格(Table)。简单变量是常见的整型及字符串,也包括一些数据集合,通过在变量的对象标识符末尾附加.0来引用。表格对应一组数组,可包含变量的多个实例,表格中的每个表项可以用多个字段,这些字段本身可能是简单变量也可能是表格,表格不能直接进行存取。
OID实例
IETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历SNMP MIB树形目录中的节点来访问网络中的设备。下图给出了NMS系统中SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构。给出了对一个DS1线路状态进行查询的OID设置例子。
SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构
这里要提一下SNMP MIB中的对象{1.3.6.1.4.1},即enterprises(企业),其所属结点数已超过3000。例如IBM为11.3.6.1.4.1.2},Cisco为{1.3.6.1.4.1.9},Novell为{1.3.6.1.4.1.23}等。世界上任何一个公司、学校只要用电子邮件发往iana-mib@isi.edu进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用SNMP进行管理。
如名字空间ip结点下一个名字为ipInReceives的MIB变量被指派数字值3,因而该变量的名字为:
iso.org.dod.internet.mgmt.mib.ip.ipInReceives
相应的数字表示(对象标识符OID,唯一标识一个MIB对象)为:
1.3.6.1.2.1.4.3
当网络管理协议在报文中使用MIB变量时,每个变量名后还要加一个后缀,以作为该变量的一个实例。如ipInReceives的实例数字表示为:1.3.6.1.2.1.4.3.0.
需要注意的是,MIB中的管理对象的OID有些需要动态确定,如IP路由表,为了指明地址202.120.86.71的下一站路由(next hop),我们可以引用这样的实例:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71, 相应的数字表示为:1.3.6.1.2.1.4.21.1.7.202.120.86.71
对于这种动态对象标识的实例,由于无法转换为预先指定的Readkey名称,与飞邻的产品架构冲突(需要动态生成可变Readkey),暂不考虑支持。
MIB访问流程及原理
首先根据自变量接收一个要访问的被管理对象主机名,并接收要查询的对象标识符的简略定义形式. 过程首先生成SNMP 报文,一旦报文生成,再把报文简单反转过来,发送出去. 这其中要将请求标识符段内容及标识符长度保存起来,留待以后进行匹配检查. 生成SNMP 报文后,建立代理地址,创建套接字连接,以便代理能将响应发回. 然后,启动警告信号处理器,将SNMP 请求报文发给代理 ,等待一个响应的到来.因为SNMP 是工作在UDP 之上的,所以在SNMP 应用实体间通信时,无需先建立连接,这样虽降低了系统开销,但UDP 传输是不可靠的,为此,网络管理站采取了相应的超时和重发策略. 本系统在发出请求报文之后,启动超时计数器,等待响应的到来,并设置重发次数为3. 若3 次之后仍没有收到响应,则关闭套接字,并返回一个“接收失败”错误代码. 反之,若确定收到一个响应,则调用一过程来把响应转换成为内部表示形式, 即对SNMP 报文进行译码. 再用已保存的Request-id与响应Request-id段进行比较,来验证这个报文是否是刚才发出的请求报文的响应. 若是,就调用另一个过程,把每段对象标识符的ASN.1 表示形式转换成自己的内部形式,并显示其值. 由于SNMP 报文对各个段都使用可变长度编码,这就使得即便是从SNMP 报文中提取一简单整数段,也要进行许多计算,因而,所开发的系统原码程序中包含了一个语言较长、结构复杂的特殊句法分析程序,用于提取报文的各个段并进行 译码,此句法分析软件必须把一指针移遍报文中所有各段,以找出各段长度并提取其数值.
SNMP的五种消息类型
另外,SNMP中提供了四类管理操作:get操作用来提取特定的网络管理信息;get-next操作通过遍历活动来提供强大的管理信息提取能力;set操作用来对管理信息进行控制(修改、设置);trap操作用来报告重要的事件。
与其他网络管理协议不同的是,SNMP 使用一种称作“取—存”的范例来实现各种操作。主要有以下3种信息:
(1) Get :由管理站去获取代理管理信息库的值,通过发送Get - Request , Get - Next – Request两种消息来实现。管理站通过发送Get - Request 报文从拥有SNMP 管理代理的网络设备中获取指定对象的信息,而管理代理用Get - Response 报文来响应Get - Request 报文。Get - Next - Request 是获取一个表中指定对象的下一个对象,因此通常用它来获取一个表中的所有对象信息。
(2) Set :由管理站设置代理的管理信息库的对象值,通过发送Set - request 来实现,它可以对一个网络设备进行远程参数配置。
(3) Trap :使得代理能够向管理站通告重要事件,是属于非请求的消息,这些消息通知管理站发生了特定事件。Trap 消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。一个SNMP 实体在接收SNMP 报文时,一般要进行基本的语法检查、版本号的验证、认证(若成功就以ASN. 1 的形式返回一个PDU) 、对返回的PDU 再进行语法检查。当所有的验证和语法解析成功以后,实体就选择适当的访问策略,对该PDU 进行相应的处理。管理系统工作时,管理站周期性地发送Get - Request/ Get-Next-Request 报文来轮询各个代理,获取各个MIB 中的管理信息,同时,管理站也接收代理发来的Trap 报文,并记录在一个数据库中。网络管理员可以通过专用的应用软件从管理站上查看每个代理提供的管理信息。各个节点的代理程序驻留在工作站内存中,负责收集 被管对象的网络状态信息。当代理接收到管理站的Get 报文后,代理将根据请求的内容从本地MIB 中提取所需信息,并以Get - Response 报文方式将结果回送给管理站。代理一方面在161 端口上(SNMP 的默认端口) 循环侦听来自管理站的Get-Request/ Get-Next-Request 报文,并做出相应的响应,读取或修改MIB 中的变量值,将结果返回给管理站,另一方面,它也不断地检查本地的状态,适当地发送Trap 报文。
Version |
Community |
SNMP PDU |
PDU type |
Request-id |
0 |
0 |
Variable-bindings |
PDU type |
Request-id |
Error-status |
Error-status |
Variable-bindings |
PDU type |
Enterprise |
Agent-addr |
Generic-trap |
Specific-trap |
Time-stamp |
Variable-bindings |
Name1 |
Value1 |
Name2 |
Value2 |
…….. |
Name n |
Value n |
图4 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组合起来查询特定的表对象中的列元素。如:首先通过下面的原语获得所要查询的设备的接口数:
{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifNumber(2)}
后再通过下面的原语,进行查询(其中第一次用Get-Request,其后用Get-Next-Request):
{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifTable(2)}
(2)Set-Request
SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。
(3)Trap
SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生。如接口UP/DOWN,IP地址更改等。
SNMP工作流程
上面五种消息中Get-Request、Get-Next-Request和Set-Request是由管理站发送到代理侧的161端口的;后面两种Get-Response和Trap 是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。SNMP工作流程如图: