SNMP概要
SNMP(Simple Network Management Protocol)是CCITT制订的网络管理协议,总共有三个版本:SNMPv1,SNMPv2,SNMPv3).目前, SNMPv1已经被广泛使用了,几乎所有的网络产品都提供对SNMPv1的支持, SNMPv2完全兼容SNMPv1,具有远程管理能力,它使管理人员可以将整个子网进行管理,而不是对整个子网内的设备进行管理,此外安全性方面也有重大提高。下面基于SNMPv1,介绍一下SNMP的基本知识.
首先,郑重声明:下面的介绍都是基于我的理解,如有错误和不妥之处请指正.
一些基本概念
SNMP,Simple Network Management Protocol:简单网络管理协议
它是一个标准的用于管理IP网络上结点的协议。此协议包括了监视和控制变量集以及用于监视设备的两个数据格式:SMI和MIB。
MIB,Management Information Base:管理信息库
由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。
SMI,Structure of Management Information:管理信息结构
用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。
ASN.1,Abstract Syntax Notation One:抽象语法定义
用于定义语法的正式语言,在SNMP中它用于定义SNMP协议数据单元和对象的格式。
PDU,Protocol Data Unit:协议数据单元
在网络中传送的数据包。
BER,basic encoding rules:基本编码规则
由CCITT (X.209)和ISO (ISO 8825)指定的编码规则,它描述了如何ASN.1类型表示为字符串。
1.1 MIB介绍
简单的说.MIB就是一个按照SMI定义的一个树型结构.如下所示:
SMI就是告诉你这颗树怎么定义的一个规范.大家都用adventNet Web NMS,在代理端和管理站端可以加载很多MIB文件.那么这么多MIB文件和这个树结构是如何对应的呢?这些MIB文件之间主要有两种关系:一种是扩展关系;一种是添加子树.比如说,RFC 1213-MIB是RFC 1158-MIB的扩展,也就是说RFC 1213-MIB定义的树包含了RFC 1158-MIB.一般来讲,你加载了RFC 1213-MIB,就不用加载RFC 1158-MIB.可以认为RFC XXXX-MIB定义了一棵基本树.而其他的MIB就是在基本树的某个节点下定义的一颗子树,比如在adventNet Web NMS加载Print-MIB就是在节点mib-2下添加了一棵子树.
1.2 SNMPv1的格式.
SNMP有五种操作:Get,GetNext,Set,GetResoponse,Trap. SNMP是一个简单的请求-响应协议。管理站发出请求,网元返回应答。其中:Get,GetNext,Set是管理站发给代理的请求, GetResoponse是代理发给管理站的. Get操作用于NMS从一个代理检索一个或多个MIB变量。GetNext操作用于管理站在一个代理中检索表中下一个变量的值。Set操作用于管理站在一个代理中设置MIB变量的值。如果代理可以提供一个Get和GetNext操作中所有变量的值,或者可以设置Set操作中所有变量的值,它就返回一个GetResonse,通报管理站所有请求变量的值;否则, GetResonse返回请求变量的值为NULL,也就是说不返回值。此外代理可以通过Trap操作向管理站异步地通知发生的重要事件。
SNMPv1 PDU格式如下:
(a) SNMP消息
(b)Get PDU,GetNext PDU,Set PDU,Response PDU
(c)Get PDU
(d) GetNext PDU
(e)Get Response PDU
(f)Set PDU
(g)Trap PDU
(h)variable-bindings
注:以上的SNMP PDU格式为SNMPv1 PDU格式.
如上所示,SNMPv1消息分为头部和PDU单元.
SNMP头部包括两个字段:版本号和团体名.
Version:标识使用的SNMP版本(0表示SNMPv1,1表示SNMPv2,2表示SNMPv3),代理直接抛弃与自己版本不同的SNMP消息.
Community:使用的团体名.
团体名用于代理认证管理站是否具有相应的操作权限.一个代理上保存有多个团体名,每个团体对应着不同的操作权限.比如, 可能团体althy只允许对该代理进行Get和GetNext操作,不允许进行Set操作,而团体tangtiboy既允许进行Get和GetNext操作, 也允许进行Set操作.此外,不同的团体的MIB视域也可能不同,团体的MIB视域是代理本地MIB视域的一个子集,每个团体只允许对该团体的MIB视域内的对象进行操作.代理存储每个团体对应的所有管理站的IP地址,代理收到管理站的请求,判断团体名是否合法,如果合法,接下来核对发送请求的管理站的IP地址是否属于该团体..不同的管理站可以属于不同的团体.
PDU只有两种格式. Get PDU, GetNext PDU, Set PDU, GetResponse PDU的格式相同,只是Get PDU, GetNext PDU, Set PDU的error-status字段和error-index字段固定为零,这样做也体现了SNMP的simple.又是另外一种格式.
PDU type:标识PDU类型,0代表Get PDU,1代表GetNext PDU,2代表Set PDU,3代表GetResponse PDU,4代表Trap PDU.
error-status: 在GetResponse消息中指示在处理一个请求时发生了一个意外情况.其值可取:noError(0),tooBig(1),noSuchNane(2),badValue(3),readonly(4),genErro(5). Get PDU, GetNext PDU, Set PDU中此字段固定为零.
error-index:在GetResponse消息中, 当error-status非零时,由error-index指出是variable-bindings列表的哪个变量引起的错误,error-status为零时, error-index也为零. Get PDU, GetNext PDU, Set PDU中此字段固定为零.
variable-bindings:一列变量名(即请求的对象实例)和相应的值.在Get 消息和GetNext 消息中,变量值应该设为NULL(事实上代理收到Get 消息和GetNext 消息时,会忽略值). Set消息中,变量值填入管理站设定的值. 在GetResponse消息中,在error-status为零的情况下,返回所有请求变量的值,如果error-status不为零,返回变量值为空.
这里要说明的是Get,GetNext,Set操作都是原子的.对于Get,GetNext操作,如果variable-bindings列表中的一个变量的值无法成功获取,则代理返回的GetResponse消息variable-bindings列表中所有的值返回为NULL. .对于Set操作,如果variable-bindings列表中的一个变量的值无法成功设置, 则代理中所有相应的值都不改变,并且代理回应的GetResponse消息variable-bindings列表中所有的值返回为NULL.也就是说代理要么返回variable-bindings列表中所有的值,要么一个值也不返回.我最开始对这里有个疑问,就是要是Get,GetNext,Set操作有多个变量值不能成功获取或设置怎么办,那么GetResponse消息中error-index返回哪个变量的索引呢?这种情况是不会出现的,因为Get,GetNext,Set操作在遇到变量值不能成功获取或设置时就会停止,根本不会再去读取或设置variable-bindings列表中在它之后的变量值.
这里说明Trap PDU.
Enterprise:一个与网管系统有关的一个对象实例的值,指出产生陷阱的子系统.(???)
Agent-addr:产生陷阱的代理的IP地址.
Generic-Trap:预定义的陷阱类型.可能取值有如下7个:
coldStart(0):异常重启,代理的配置和协议实体的实现改变(恢复默认值?).
warmStart(1):正常重启, 代理的配置和协议实体的实现不改变.
LinkDown(2):告知代理的一个通信连接失败.在variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.
Linkup(3): 告知代理的一个通信连接已经正常.在variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.
AuthenticationFailure(4):告知管理站收到一个认证失败的请求.
EgpNeighborLoss(5):告知管理站一个EGP邻居被标志为down.
EnterpriseSpecific(6):告知管理站发生了厂商自定义的特定陷阱,指出陷阱类型.
Specific-trap:更具体的指出厂商自定义的特定陷阱性质的代码.
Time-stamp:sysUptime
下面的流程图说明了代理收到管理站发送的请求消息后采取的相关操作.
下面用etheral抓GetNextRequest消息为例来分析SNMP PDU的格式(可以参考ASN.1):
1.3 SNMP消息的协议分析
注:红色字体为SNMP 消息,黑体是etheral的分析结果,下面是我给出的进一步分析.
其中,30 是Identifier octets,表示SNMP 消息是ASN.1的SEQUENCE类型;
26是Length octets,表示SNMP 消息的长度是0X26;
020100表示版本号为SNMPv1(0):
02是Identifier octets,表示version字段是ASN.1的INTEGER类型;
01是 Length octets,表示version字段的长度是1个octet;
00是Content octets,表示version字段的内容是0.
04067075626c 6963表示团体名为public:
04是Identifier octets,表示community字段是ASN.1的OCTET STRING类型;
06是 Length octets,表示community字段的长度是6个octet;
7075626c 6963 是Content octets,是”public”.的ASCII值.
a119表示PDU type为GetNextRequest(1):
a1是Identifier octets,表示SNMP PDU的标签类型是Contect-specific,标签值为1(这里用标签值代表PDU type);
19是 Length octets,表示SNMP PDU的长度是0X19个octet;
02020099表示Request id为0x00000099:
02是Identifier octets,表示Request id字段是ASN.1的INTEGER类型;
02是 Length octets,表示Request id字段的长度是2个octet;
0099是Content octets,表示Request id字段的内容是0x00000099.
020100表示error-statue为0:
02是Identifier octets,表示error-statue字段是ASN.1的INTEGER类型;
01是 Length octets,表示error-statue字段的长度是1个octet;
00是Content octets,表示error-statue字段的内容是0.
020100表示error-index为0:
02是Identifier octets,表示error-index字段是ASN.1的INTEGER类型;
01是 Length octets,表示error-index字段的长度是1个octet;
00是Content octets,表示error-index字段的内容是0.
30 0d 30 0b 06 07 2b 06 01 02 01 01 01表示variable-bindings的第一个变量的object identifier 1: 1.3.6 .1.2.1.1.1:
30 是Identifier octets,表示variable-bindings列表是ASN.1的SEQUENCE类型;
0d是Length octets,表示variable-bindings列表的长度是0X0d;
30 是Identifier octets,表示variable-name1 |variable-value1对是ASN.1的SEQUENCE类型;
0b是Length octets,表示variable-name1 |variable-value1对的长度是0X0b;
06是Identifier octets,表示variable-name1字段是ASN.1的OBJECT IDENTIFIER类型;
07是 Length octets,表示variable-name1字段的长度是7个octet;
2b 06 01 02 01 01 01代表 1.3.6 .1.2.1.1.1:
2b代表1+3:1*40+3=0X2b;
06 01 02 01 01 01对应关系很明显.
0500 表示variable-value1的值为NULL:
05是Identifier octets,表示variable-value1是ASN.1的NULL类型;
00是 Length octets,表示v variable-value1字段的长度是0个octet;
0000 50 78 4c 70 c 3 e3 00 0d 87 cb d9 d8 08 00 45 00 PxLp..........E.
0010 00 44 a 7 4a 00 00 80 11 5e 8d 0a 0a 10 0f 0a 0a .D.J....^.......
0020 10 af 0a ed 00 a 1 00 30 5c 8c 30 26 02 01 00 04 .......0/.0&....
0030 06 70 75 62 6c 69 63 a 1 19 02 02 00 99 02 01 00 .public.........
0040 02 01 00 30 0d 30 0b 06 07 2b 06 01 02 01 01 01 ...0.0...+......
0050 05 00 ..
其他4种消息的协议分析类似,不再细述.