Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册
  • 博客访问: 7977
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-22 11:48
文章分类
文章存档

2017年(23)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题

分类: LINUX

原文地址:SNMP从入门到开发:基础篇 作者:wjlkoorey258

SNMP协议入门

1、引言

基于TCP/IP的网络管理包含3个组成部分:

1) 一个管理信息库MIBManagement Information Base)。管理信息库包含所有代理进程的所有可被查询和修改的参数。RFC 1213[McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II

2)  关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMIStructure of Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990] 中定义。例如:SMI定义计数器是一个非负整数,它的计数范围是 0~4294967295,当达到最大值时,又从0开始计数。

3) 管理进程代理进程之间的通信协议,叫做简单网络管理协议SNMPSimple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定义。SNMP包括数据报交换的格式等。尽管可以在传输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP

 

2SNMP协议概述

简单网络管理协议(SNMPSimple Network Management Protocol)是由互联网工程任务组(IETFInternet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMPSimple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。 虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

http://www.fjzzled.com/hzjdyyyyjs/95.html 

http://www.fjzzled.com/hzjdyyyyjs/94.html 

http://www.sjys365.com/smzl/2999.html 

http://www.sjys365.com/smzl/2998.html 

 

3SNMP的发展史

SNMP经过了一个相对较长的发展过程,到目前为止一共经历了三个版本。当下使用最广泛是SNMPv2

l  1989年发布了第一个版本的SNMP,称为SNMPv1

l  1991年发布SNMP的一个补充---RMON(Remote Network Monitoring,远程网络监视)RMON扩充了SNMP的功能,包括对LAN的管理以及对依附于这些网络设备的管理。注:RMON没有修改和增加SNMP协议本身以及SMI,只是增加了SNMP监视子网的能力,把整个子网当成一个个体来监视,提供了新的MIB库及相关的MIB行为。

l  1993SNMPv1的升级版被提出,SNMPv2

l  1995SNMPv2正式发布,v2增加了SNMPv1的功能,并规定了如何在基于OSI的网络中使用SNMP。同时RMON于本年度扩展为RMONv2

l  1998SNMPv3发布,一系列文档定义了SNMP的安全性,并定义了将来改进的总体结构。SNMPv3可以和v2v1一起使用。

 

4SNMP的工作原理

SNMP采用特殊的客户机/服务器模式,即代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。

SNMP的应用场景如图1所示:


 管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。

 

5SNMP的报文类型

SNMP中定义了五种消息类型:Get-RequestGet-ResponseGet-Next-RequestSet-RequestTrap 

(1)Get-Request Get-Next-RequestGet-Response

SNMP 管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next- Request用于和Get-Request组合起来查询特定的表对象中的列元素。

(2)Set-Request 

SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。

(3)Trap 

SNMP代理使用TrapSNMP管理站发送非请求消息,一般用于描述某一事件的发生,如接口UP/DOWNIP地址更改等。

上面五种消息中Get-RequestGet-Next-RequestSet-Request是由管理站发送到代理侧的161端口的;后面两种Get-ResponseTrap 是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。SNMP工作流程如图2


6SNMP的报文格式

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中定义了几种基本的数据类型,其中v1v2版有些改动,具体参见相应的RFC文档。这里我们只介绍几种最常见的类型:

l  INTEGER:一个整数

l  OCTER STRING 0或多个8bit字节,每个字节在0~255之间取值

l  DisplayString0或多个8bit字节,每个字节必须是ASCII码。在MIB-II中,所有该类型变量不能超过255个字符(0个字符可以)

l  NULL:代表相关的变量没有值

l  IpAddress4字节长的OCTER STRING,以网络字节序表示IP地址

l  PhyAddress6字节长的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类型

  

0

get-request

1

get-next-request

2

get-response

3

set-request

4

trap

    也就是说,trap的类型是4。但是在数据报文中,该字段一般表示为ax,其中x[0,4],即a0~a3表示相应的getset等操作,a4表示trap报文。这里除了类型字段意外,其他字段均采用BER编码方式:



实战演练之报文格式分析

    Trap报文格式和上述图5所展示的结构有些差别,这里我们只分析SNMPv1SNMPv2Trap报文格式。trap报文前面的部分都一样,区别在PDU协议数据单元部分。


SNMPv1 Trap报文

SNMPv1Trap报文格式如下所示:


注意:除了PDU类型和PDU长度字段外,后面的每个字段都是BER编码方式。

    trap类型”可以取以下值,其中0~6是已定义的特定trap7及其以后的类型由供应商自定义。

2 trap类型、名称及描述信息

trap类型

名称

描述信息

0

coldStart

代理进程对自己初始化

1

warmStart

代理进程对自己重新初始化

2

linkDown

一个接口已从工作状态变为故障状态(报文中的第一个变量标识此接口)

3

linkUp

一个接口已从故障状态变为工作状态(报文中的第一个变量标识此接口)

4

authenticationFailure

SNMP管理进程收到无效共同体的报文

5

egpNeighborLoss

一个EGP邻站已变为故障状态(报文中的第一个变量包含邻站IP地址)

6

enterpriseSpecific

在这个特定的代码段中查找trap信息

 

通过wireshark抓包工具,捕获一条如下的SNMP报文,接下来对其进行仔细分析。

SNMPv1原始报文内容:

00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8  0a 05 0c 00 00 a2 00 34 ff e0 30 2a 02 01 00 04 06 70 75 62 6c 69 63 a4 1d 06 0a 2b 06 01 04 01 bf 08 03 02 0a 40 04 c0 a8 0a 01 02 01 00 02 01 00 43 01 0e 30 00

 

目的MAC00 23 5a 9e 58 b9

MAC00 4c 41 49 50 55

协议类型:08 00 ,为IP数据报

IP头:45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8 0a 05 0c

UDP头:0c 00 00 a2 00 34 ff e0

其余部分都为SNMP报文,接下来我们对照前面的报文结构体来逐个分析一下。

n  30 表示SNMP消息是ASN.1SEQUENCE类型;

n  2a 表示该SNMP报文的总长度是42(0x2a)个字节,该字段所表示的报文长度起始于它后面的第一个字节直到报文结束;

n  02 01 00 表示版本号,可见其确实为BER编码方式。02表示该字段是INTEGER类型;01表示该字段占1个字节;00表示版本号,该值为“版本号-1

n  04 06 70 75 62 6c 69 63 表示团体名,04表示该字段为OCTET STRING类型;06表示该字段占6个字节;70 75 62 6c 69 63 表示团体名的ANSII码的十六进制形式,这里是“public”;

n  a4 1d 其中a4中的“4表示这是一个trap报文,a4又叫报文的标签标记;1d表示后面还有29(0x1d)个字节的数据;

n  06 0a 2b 06 01 04 01 bf 08 03 02 0a 企业OID标识。06表示该字段是个对象标识符,OBJECT IDENTIFIER0a表示该字段占10(0x0a)个字节;关于SNMPOID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为xy。编码时40*x+y,这里x=1y=3,因此结果为40*1+3=43,即表示十六进制的2b。因此,这里的企业OID编码即为1.3.6.1.4.1.8072.3.2.10

n  40 04 c0 a8 0a 01 同样40表示该字段为OCTET STRING 类型;04表示IP地址占4个字节;IP地址为192.168.10.1

n  02 01 00 其中00表示trap类型为coldStart

n  02 01 00 其中00表示我们指定的trapspecific-trap也为coldStart类型;

n  43 01 0e 43表示为TimeTicks类型;01表示该字段占1个字节;0e即十进制的14表示时间标签为0.14秒,这里时间计数器以0.01秒递增;

n  30 00 30表示“键-值”值对的编码类型为SEQUENCE00表示该字段占0个字节,即没有该字段。


SNMPv2 Trap报文 
SNMPv2Trap报文格式如图8所示:



同样的,这里除了trap类型和报文长度是标准网络字节序之外,其余协议字段也均为BER编码方式。可以看到v2版的trap报文正在向统一的报文格式发展,已经非常类似普通的SNMP请求、响应报文了。

SNMPv2原始报文内容:

00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a 01 c0 a8 0a 05 0c 01 00 a2 00 67 04 bb 30 5d 02 01 01 04 06 70 75 62 6c 69 63 a7 50 02 04 17 73 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 17 06 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 06 03 01 01 05 01 30 18 06 0a 2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a

 

目的MAC00 23 5a 9e 58 b9

MAC00 4c 41 49 50 55

协议类型:08 00IP报文

IP头:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a 01 c0 a8 0a 05

UDP头:0c 01 00 a2 00 67 04 bb

余下部分全为SNMP报文内容,这里我们做一下简单的约定:

xx 标注类型;xx 标注长度;xx 标注真正的数据。

这样一来上面这串原始数据就好分析多了J

n  30 5d 整个SNMP报文的编码方式为30,即SEQUENCE类型,报文长度93(0x5d)字节;

n  02 01 01 版本号01v2版本;

n  04 06 70 75 62 6c 69 63 团体名70 75 62 6c 69 63  即英文的“public”;

n  a7 50 a7表示trap类型为7,即厂商自定义trap50表示PDU区段占80(0x50)字节;

n  02 04 17 73 2c fb 请求ID17 73 2c fb 十进制的393424123

n  02 01 00 错误状态0

n  02 01 00 错误索引0

n  30 42 “变量名-值”对编码类型30 SEQUENCE类型;“变量名-值”所占总字节0x42,即66字节;

n  30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 第一个“名-值”对区段编码方式30 SEQUENCE类型;第一个“名-值”对总长度0x0d13字节;第一个变量名的编码类型0x06,时间标签;第一个变量名占0x08个字节;第一个变量名2b 06 01 02 01 01 03 00,为1.3.6.1.2.1.1.3.0;第一个变量值为0x0e,即14

n  30 17 06 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 06 03 01 01 05 01 第二个“名-值”对;变量名1.3.6.1.6.3.1.1.4.1.0;变量值1.3.6.1.6.3.1.1.5.1

n  30 18 06 0a 2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a 第三个“名-值”对;变量名1.3.6.1.6.3.1.1.4.3.0;变量值1.3.6.1.4.1.8072.3.2.10

今天我们简单对SNMP协议做个入门普及,包括它的原理,应用场景报文格式等。下面的章节,我们将以开源net-snmp为例来向大家阐述多种代理开发流程和原理,以及要注意的问题,其中每种扩展mib的方式都对应不同的开发需求。

未完,待续







阅读(95) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册