第二章 简单网络管理协议(SNMP)
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。
简单网络管理协议(SNMP)将管理问题分为两个部分,并为每个部分定义了标准。第一部分是有关信息通信。协议定义管理系统主机上的客户软件如何与代理通信。协议定义客户机与服务器交换消息的格式和含义以及名字与地址的形式。第二部分有关被管理的数据。协议定义网络设备必须保存的数据项和每个数据项的名字以及用于表示名字的语法。
我们在这里主要讨论SNMPv1。主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP协议。
2.1 SNMPv1的管理信息库(MIB)
MIB是一个存放被管网络设备控制和状态信息的数据库,它定义了主机或网络设备必须保存的数据项和允许对每个数据项进行的操作。
用于TCP/IP的MIB将管理信息划分为八类,如图2.1所示。
图2.1 MIB中信息的分类
MIB变量使用的名字取自ISO和ITU管理的对象标识符(object identifier)名字空间。它是一种分级树的结构。如图2.2,第一级有三个节点:ccitt、iso、iso-ccitt。低级的对象ID分别由相关组织分配。一个特定对象的标识符可通过由根到该对象的路径获得。
让我们来举个例子,如名字空间ip结点下一个名字为ipInReceives的MIB变量被指派数字值3,因而该变量的名字为:
iso.org.dod.internet.mgmt.mib.ip.ipInReceives
相应的数字表示(对象标识符)为:
1.3.6.1.2.1.4.3
当网络管理协议在报文中使用MIB变量时,每个变量名后还要加一个后缀,以作为该变量的一个实例。
MIB中存在着两种管理对象:标量对象和表格对象。标量对象只定义了一个对象实例。上面提到的ipInReceives就是一个标量对象。当这个实例出现在一个发给网络管理代理的报文中时,ipInReceives的数字表示为:
1.3.6.1.2.1.4.3.0
图2.2 MIB树
对于表格对象,它定义了多个相关的对象实例集。我们考虑一个MIB变量ipRouteTable,它含有这个设备的路由表。变量的表示为:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable
数字表示为:
1.3.6.1.2.1.4.21
对于表格对象,我们可以把它看为一维数组,数组的每个元素都由一个结构(记录)组成。在本例中,ipRouteTable就是结构IpRouteEntry的一维数组,并以IpRouteEntry语法中所指定的Index作为数组访问的索引。在IpRouteEntry中,Index所指的是IpRouteDest。因此,为了指明地址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
当然,对于表格对象的访问,我们有更为强大的手段,那就是SNMP中的get-next-request命令。
2.2 SNMPv1的管理信息结构(SMI)
SMI定义了SNMP框架所用信息的组织、组成和标识,它还为描述MIB对象和描述协议怎样交换信息奠定了基础。
按照SMI定义的SNMP管理对象都具有3个属性:名字、语法和编码。名字即对象标识符,唯一标识一个MIB对象;语法定义了对象的数据结构,用抽象语法记法1(ASN.1)来定义;编码描述了一个管理对象的相关信息如何被格式化为适合网络传送的数据段。
下面我们主要介绍一下SMI的数据类型。SMI的数据类型主要有三种:
◆ 简单类型(simple)
◆ 简单结构类型(simple-constructed)
◆ 应用类型(application-wide)
1. 简单数据类型
简单数据类型通常被称为非聚合类型,在SNMP子集中有4种简单数据类型:
◇Integer: 整型是-2,147,483,648~2,147,483,647的有符号整数;
◇octet string: 字符串是0~65535个字节的有序序列;
◇OBJECT IDENTIFIER: 来自按照ASN.1规则分配的对象标识符集;
◇ NULL:占位符。目前还未在SNMP中使用。
2. 简单结构类型
简单结构类型指列表和表格,常被称作聚合类型。在SNMP子集中主要使用两种结构类型:
◇SEQUENCE 用于列表。这一数据类型与大多数程序设计语言中的“structure”类似。一个SEQUENCE包括0个或更多元素,每一个元素又是另一个ASN.1数据类型。
◇ SEQUENCE OF type 用于表格。这一数据类型与大多数程序设计语言中的“array”类似。一个表格包括0个或更多元素,每一个元素又是另一个ASN.1数据类型。
3. 应用数据类型
应用数据类型采用隐式定义,是引用SNMP的简单数据类型来定义的。主要有6种:
◇ IpAddress: 以网络序表示的IP地址。因为它是一个32位的值,所以定义为4个字节;
◇ network address:网络地址,表示从一个特定协议族中选定的网络地址, SNMPv1仅支持32位IP地址;所以与IpAddress等效;
◇ counter:计数器是一个非负的整数,它递增至最大值,而后归零。SNMPv1中定义的计数器是32位的,即最大值为4,294,967,295;
◇ Gauge :也是一个非负整数,它可以递增或递减,但达到最大值时保持在最大值,最大值为232-1;
◇ time ticks:是一个时间单位,表示以0.01秒为单位计算的时间;
◇ opaque:表示用于传递任意信息串的任意编码格式,它与SMI使用的严格数据输入格式不同。
2.3 SNMPv1的协议操作
网络管理协议指明了管理系统调用的网络管理客户端程序与主机或路由器上执行的网络管理代理程序之间的通信。除了定义交换报文的格式和含义以及这些报文中名字和值的表示以外,还提供了一定的授权管理。
SNMP主要采用“取-存”方式,这样具有稳定性、简单性和灵活性的特点。从概念上讲,SNMP只有两个命令,允许管理系统读取一个数据项,或把值存到一个数据项。而其它更为具体的操作,则可以通过读写一个具体的MIB变量来实现。SNMP是一种简单的请求-响应协议。
SNMPv1定义了五种操作,其含义如下:
1. get-request 从一个指明的变量读取值
2. set-request 将一个值存到一个指明的变量中
3. get-next-request 遍历表格变量的值
4. get-response 对一个读取操作的回答
5. trap 由一个事件触发的回答
操作get-request、set-request 、get-response提供了最基本的读写操作及对其的响应。get-next-request可以在不清楚表格变量的后缀的情况下,遍历整个表格。由于MIB使用后缀对表做索引,管理系统可以发送表格对应对象标识符的前缀,接受表格的第一元素名。管理系统再发送表中第一元素名接受第二元素名,以此类推,即可读取整个表格。Trap允许管理系统出错时由管理代理发送报错信息。
5个命令中,get-request、set-request 和get-next-request是用于管理系统的,get-response和 trap则由管理代理程序来实现。
2.4 SNMP的报文形式
一个SNMP报文由三个主要部分组成:一个协议版本(version),一个SNMP共同体(community)标识符,和一个数据区。数据区分成若干个协议数据单元PDU(Protocol Data Unit),每个PDU包括一个请求(由管理系统发送)或一个响应(由管理代理发送)。
SNMPv1的get-request、set-request 、get-response 和get-next-request操作具有相同的PDU格式,如图2.3所示。
图2.3 PDU的格式
· PDU Type:指明PDU类型(GetRequest、GetNextRequest、SetRequest、Trap);
· Request ID:SNMP请求标识;
· Error Status:表示错误和错误类型,只有响应操作才设置该字段,其他操作将该字段设为0;
· Error Index:错误索引号,与特定对象实例的错误相关,只有响应操作才设置该字段,其他操作将该字段设为0;
· Variable Bindings:SNMPv1 PDU的数据字段,携带特定对象实例的当前值(Get and GetNext请求的该字段被忽略,因为无须携带值)。
2.5 SNMP的发展(SNMPv2,SNMPv3)
SNMP最早出现在1988年的RFC1068,1990年5月,RFC1157提出了SNMPv1,并作为TCP/IP的正式标准。由于SNMPv1难以实现大量的数据传输,缺少身份验证(Authentication)和加密(Privacy)机制,以及其他缺点的暴露,因此,1993年发布了SNMPv2,具有以下特点:
支持分布式网络管理
扩展了数据类型
可以实现大量数据的同时传输,提高了效率和性能
丰富了故障处理能力
增加了集合处理功能
加强了数据定义语言
但是,SNMPv2并没有完全实现预期的目标,尤其是安全性能没有得到提高,如:身份验证(如用户初始接入时的身份验证、信息完整性的分析、重复操作的预防)、加密、授权和访问控制、适当的远程安全配置和管理能力等都没有实现。1996年发布的SNMPv2c是SNMPv2的修改版本,有些功能增强了,但是安全性仍没有得到改善,仍然是SNMPv1的基于明文密钥的身份验证方式。
IETF SNMPv3工作组于1998年元月提出了互联网建议RFC 2271-2275,正式形成SNMPv3。这一系列文件定义了包含SNMPv1、SNMPv2所有功能在内的体系框架和包含验证服务和加密服务在内的全新的安全机制,同时还规定了一套专门的网络安全和访问控制规则。
RFC 2271定义的SNMPv3体系结构,体现了模块化的设计思想,主要有三个模块:信息处理和控制模块、本地处理模块和用户安全模块。可以简单地实现功能的增加和修改。其特点是:
适应性强:适用于多种操作环境,既可以管理最简单的网络,实现基本的管理功能,又能够提供强大的网络管理功能,满足复杂网络的管理需求。
扩充性好:可以根据需要增加模块。
安全性好:具有多种安全处理模块。
SNMP正在逐渐扩充和发展,新的管理信息库还在不断增加,能够支持更多的网络应用。所以,它是建立网络管理系统的有力工具,也将推动互联网不断发展。