SNMP协议学习

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

1. 网络管理

  基于T C P / I P的网络管理包含两个部分:网络管理站(也叫管理进程, m a n a g e r Station)和被管的网络单元(也叫被管设备 Network Element)。被管设备种类繁多,例如:路由器、X 终端、终端服务器和打印机等。这些被管设备的共同点就是都运行T C P / I P协议。被管设备端和管理相关的软件叫做代理程序( a g e n t )或代理进程。管理站一般都是带有彩色监视器的工作站,可以显示所有被管设备的状态(例如连接是否掉线、各种连接上的流量状况等)。

管理进程和代理进程之间的通信可以有两种方式。一种是管理进程向代理进程发出请求,询问一个具体的参数值(例如:你产生了多少个不可达的I C M P端口?)。另外一种方式是代理进程主动向管理进程报告有某些重要的事件发生(例如:一个连接口掉线了)。当然,管理进程除了可以向代理进程询问某些参数值以外,它还可以按要求改变代理进程的参数值(例如:把默认的IP TTL值改为6 4)。

基于T C P / I P的网络管理包含3个组成部分:

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

2) 关于M I B的一套公用的结构和表示符号。叫做管理信息结构S M I( Structure of

Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990] 中定义。例如:S M I定义计数器是一个非负整数,它的计数范围是0~4 294 967 295,当达到最大值时,又从0开始计数。

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

2、SNMP体系

SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。下图是SNMP协议的实现模型。

3、NMP报文种类

SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。 SNMP规定了5种协议消息(也就是SNMP报文),用来在管理进程和代理之间的交换。
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)}

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

Trap
SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生。

前面的Request操作是由管理进程向代理进程发出的,后面的Response和Trap操作是代理进程发给管理进程的,为了简化起见,前面3个操作今后叫做get、get-next和set操作。下图描述了SNMP的这5种报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。


4、SNMP报文格式

SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。

版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。
团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息(见后);
协议数据单元(PDU):其中PDU指明了SNMP的消息类型及其相关参数。
下图是封装成UDP数据报的5种操作的SNMP报文格式。可见一个SNMP报文共有三个部分组成,即公共SNMP首部、get/set首部trap首部、变量绑定。

1)  公共SNMP首部

共三个字段:

版本l 写入版本字段的是版本号减1,对于SNMP(即SNMPV1)则应写入0。共同体(community) 共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是6个字符“public”。

PDU类型  根据PDU的类型,填入0~4中的一个数字,其对应关系如表2所示意图。

表2 PDU类型

PDU类型
 名称
 
0
 get-request
 
1
 get-next-request
 
2
 get-response
 
3
 set-request
 
4
 Trap

2)  get/set首部
l 请求标识符(request ID)  这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文

差错状态(error status) 由代理进程回答时填入0~5中的一个数字,


差错索引(errorl index) 当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。
3)trap首部

企业(enterprise) 填入trap报文的网络设备的对象标识符。此对象标识符肯定是在图3的对象命名树上的enterprise结点{1.3.6.1.4.1}下面的一棵子树上。

 trap类型 此字段正式的名称是generic-trap,共分为表4中的7种。

当使用上述类型2、3、5时,在报文后面变量部分的第一个变量应标识响应的接口。
特定代码(specific-code)   指明代理自定义的时间(若trap类型为6),否则为0。

时间戳(timestamp)   指明自代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms。例如时间戳为1908表明在代理初始化后1908ms发生了该时间。

4)变量绑定(variable-bindings)

指明一个或多个变量的名和对应的值。在get或get-next报文中,变量的值应忽略。

5. 管理信息库MIB

管理信息库MIB,就是所有代理进程包含的,能够被管理进程进行查询和设置的信息的结构。IETF规定的管理信息库MIB(其中定义了可访问的网络设备及其属性,由对象标识符――OID:Object Identifier唯一指定)的一套公用的结构与表示符号称之为SMI。

对象标识是一种数据类型,它指明一种“授权”命名的对象。“授权”的意思就是这些标识不是随便分配的,它是由一些权威机构进行管理和分配的。对象标识是一个整数序列,以点(“.”)分隔。这些整数构成一个树型结构,对象标识从树的顶部开始,顶部没有标识,以r o o t表示。下图显示了在S N M P中用到的这种树型结构。所有的M I B变量都从1 . 3 . 6 . 1 . 2 . 1这个标识开始。树上的每个结点同时还有一个文字名。例如标识1 . 3 . 6 . 1 . 2 . 1就和i s o . o r g . d o d .i n t e r n e t . m e m t . m i b对应。这主要是为了人们阅读方便。在实际应用中,也就是说在管理进程和代理进程进行数据报交互时,M I B变量名是以对象标识来标识的,当然都是以1 . 3 . 6 . 1 . 2 . 1开头的。

在图2 5 - 6中,我们除了给出了m i b对象标识外,还给出了i s o . o r g . d o d . i n t e r n e t .p r i v a t e . e n t e r p r i s e s(1 . 3 . 6 . 1 . 4 . 1)这个标识。这是给厂家自定义而预留的。在A s s i g n e d Number RFC中列出了在该结点下大约4 0 0个标识。

MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。

  下图给出了NMS系统中SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构。

  下图给出了对一个DS1线路状态进行查询的OID设置例子。

6、实例标识

   当对M I B变量进行操作,如查询和设置变量的值时,必须对M I B的每个变量进行标识。首先,只有叶子结点是可操作的。S N M P没法处理表格的一整行或一整列。

6.1 简单变量

对于简单变量的处理方法是通过在其对象标识后面添加“. 0”来处理的。例如前图中的计数器u d p I n D a t a g r a m s,它的对象标识是1 . 3 . 6 . 1 . 2 . 1 . 7 . 1,它的实例标识是1 . 3 . 6 . 1 . 2 . 1 . 7 . 1 . 0,相对应的文字名称是i s o . o r g . d o d . i n t e r n e t . m g m t . m i b . u d p . u d p I n D a t a g r a m s . 0。虽然这个变量处理后通常可以缩写为u d p I n D a t a g r a m s . 0,同样在S N M P报文中,该变量的名称是其对象的标识1 . 3 . 6 . 1 . 2 . 1 . 7 . 1 . 0。

6.2 表格

表格的实例标识就要复杂得多。如图

6.3 字典式排序

M I B中按照对象标识进行排序时有一个隐含的排序规则―――“先列后行”,不用加“.0”。M I B表格是根据其对象标识按照字典的顺序进行排序的。

7、Windows 2000上配置SNMP服

7.1 在Windows2000下安装SNMP
1)  打开Windows 2000控制面板

2)  双击“添加与删除程序”图标

3)  选择添加与删除Windows组件,组件面板显现。

4)  勾上管理和监控工具箱

5)  单击“详细”

6)  勾上简单网管协议并单击确定

7)  单击下一步继续直到完成。

7.2配置Windows2000的SNMP服务
1)      打开Windows 2000控制面板

2)      双击管理工具图标

3)      双击服务图标

4)      选择SNMP Service

5)      编辑属性,选择代理标签

6)      确认Contact和location被选中

7)      选择陷井标签

8)      敲入Community Name:public

9)      单击加入到列表

10)   在陷井目的地,单击Add,并填入Ip address.

11)   单击确定

12)   选择安全标签

13)   高亮public并单击编辑,将Community Rightes改为Read Create

14)   单击确定

15)   停止SNMP 服务,并重起

16)   双击SNMP Trap Service,选择起动方式“自动”

17)   单击确定

18)   停止SNMP Trap Service并重启

8、未解问题

a)        SNMPv2未看,不知道其中区别有多大?

b)        对象标识树是分层,从左到右进行编码的吗?

c)        是不是所有要查的信息都在这个对象树上?别的地方有吗?

d)        如果返回来的是一个错误,怎么能确定是网络的问题还是自已命令的语法问题?

e)        以表格式形式存入的SNMP变量,表格的栏目一般固定,但是行数并不确定,因此查找时好像也不好确定是找哪一行?

f)         Trap时候,在MANAGER方是不是要发一个确认收到错误,还是不管?

g)        一般开始对某一个路由器设备进行管理时,比喻要发一个命名给它,基本的步骤是什么?

h)        实例标识每个设备在出厂就确定了吗?不能通过命名来增加,是吧?

i)          SNMPV1是否只能在TCP/IP协议网上使用?

j)          每一种设备里面的MIB格式都一样吗?

k)        使用get,getNext能不能一次性提取多个变量?

l)          为何操作时要用在对象标识前加.

SNMP点滴积累
一:我该如何创建自己的MIB?
首先:要定义自己的MIB,要先熟悉ASN.1的语法,其中有个老外的一本MIB书很好,MIB的RFC文档就是它定义的好像。
其次:多看其他的MIB,其实定义比较简单,就是TYPE,标量,表三个主要的东西。

二:我实现一个代理进程,如果捕获SNMP的端口信息那同一机器上另外的代理进程不就没办法捕获管理信息了吗?我的代理进程只对特定的OID进行服务,如果不属于我的OID,我如何将其交给系统中存在的其他代理进程处理?

这个问题就是扩展代理了,就是扩展Agent,在windows下面的SNMP系统服务,你可以直接用扩展来做的,这样就可以吧你新加的OID添加到系统的snmp服务中,这些编程相对很简单,在MSDN中有介绍,好像是snmpExtensionXXX,记不太清楚了!

三:在被管设备中究竟存不存在一个MIB?我的理解,是不是只在管理者进程中收集各个被管设备的信息形成一个MIB,而在被管设备中没有真正的MIB存在?

你的理解不对的,MIB是Management Information Base是受管的信息数据库,这些信息都是保存在Agent端的,Agent广义上的概念其实包括两个部分,一个是狭义的Agent,(就是接受网络SNMP协议,返回信息),另外一个就是MIB信息的组织了。

四:我要夸平台管理,代理进程和管理者进程分别用什么实现方便呢?

方便的方法:
有两个开放的SNMP开发库,也是现在用的最多的!一个net-snmp,一个是snmp++,都可以夸平台,但是net-snmp是基于c语言的,而snmp++是基于C++的,并且一般多用于Windows,反之net-snmp多用于Linux!
希望对你有所帮助,
书籍嘛!有一个《SNMP简单网络管理协议的原理和应用》不错!其他的么!我觉得看RFC文档就够了,RFC1213(MIB-II)等等!


作者:古梅飞动
公司:蜜团科技
出处:http://www.mitsofts.com/index.php
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/luhuan860/p/1736655.html