(前言)最近在工作中遇到了大量的互联网协议开发,我将对其中一些互联网协议的基础知识进行整理。 本文参考一些大神的整理,后面贴链接。 例如入侵删除) )。
简单网络管理协议(SNMP)是TCP/IP协议群集的APP应用层协议。 成立于1988年,被互联网架构委员会(IAB )采用为短期网络管理解决方案。 SNMP的简单性使其在互联网时代蓬勃发展,并于1992年推出了SNMPv2版本,以增强SNMPv1的安全性和功能。 目前有SNMPv3版本。 (我要是知道有几个版本就好了。 之前在公司使用的版本是SNMPv2。
一套完整的SNMP系统主要包括3358www.Sina.com/、管理信息库(MIB)和管理信息结构(SMI)。
首先,让我们来看看SNMP消息传递协议。
SNMP报文协议
一、SNMP协议概述是由互联网工程任务组(IETF )定义的一组网络管理协议。 该协议基于simplegatewaymonitorprotocol、sgmp:simplegatewaymonitorprotocol。 33558www.Sina.com/SNMP开始了基于IP的网络管理,但作为行业标准也成功地进行了电话网络管理。
简单网络管理协议(SNMP:Simple Network Management Protocol)
SNMP采用一种特殊的客户端/服务器模式,即代理/管理工作站模式。 网络的管理和维护是通过管理站和SNMP代理之间的交互进行的。 每个SNMP从代理都会回答有关SNMP管理工作站(主代理)的MIB定义信息的各种查询。
SNMP的应用场景如图所示:
管理工作站和代理端使用MIB统一接口,MIB定义设备中的托管对象。 管理站和代理实现各自的MIB对象,使双方能够识别对方的数据并实现通信。 管理站向代理请求MIB定义的数据,代理方识别后,将管理设备提供的相关状态和参数等数据转换为MIB定义的格式,最后将该信息返回管理站,完成管理操作一次。
利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。
SNMP定义了五种消息类型:获取请求、获取响应、获取下一请求、设置请求和捕获。
二、SNMP的工作原理
SNMP管理工作站通过Get-Request消息从具有SNMP代理的网络设备获取信息,SNMP代理通过Get-Response消息进行响应。 Get-Next- Request与Get-Request结合使用,用于查询特定表对象中的列元素。
三、SNMP的报文类型
(1)Get-Request 、Get-Next-Request与Get-Response(监视网络状态)SNMP管理工作站可以使用Set-Request远程配置网络设备,包括设备名称、设备属性、删除设备或启用/禁用设备属性
(3)捕获(接收网络事件警告) ) ) ) )。
SNMP代理使用Trap向SNMP管理工作站发送非请求消息。 通常用于说明接口UP/DOWN、IP地址变更等事件的发生。
在上述五条消息中,Get-Request、Get-Next-Request和Set-Request从管理工作站发送到代理端的161个端口。 以下两种类型的获取响应和捕获由代理进程发送到管理进程,其中捕获消息发送到管理进程的162个端口,所有数据都进行UDP封装: SNMP工作流程图
(2)Set-Request (修改网络设备配置)
下图是封装在UDP数据报中的5个操作的SNMP消息格式。 可以看到,一条SNMP消息包含三个部分:公共SNMP标头、get/set标头、trap标头和变量绑定。
总共三个字段:
四、SNMP报文格式
写入版本字段的是版本号减去1,对于SNMP (SNMP v1 ),必须写入0。
1、公共SNMP首部
共同体是一个字符串,常用于管理进程和代理进程之间的明文密码
是6个字符“public”。
c — PDU类型
根据PDU的类型,填入0~4中的一个数字,其对应关系如下图
2、get/set首部
a — 请求标识符(request ID)
这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文
b — 差错状态(error status)
由代理进程回答时填入0~5中的一个数字,见下图描述
c — 差错索引(error index)
当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。
3、trap首部
a — 企业(enterprise)
填入trap报文的网络设备的对象标识符。此对象标识符肯定是在图3的对象命名树上的enterprise结点{1.3.6.1.4.1}下面的一棵子树上。
b — trap类型
此字段正式的名称是generic-trap,共分为表4中的7种
当使用上述类型2、3、5时,在报文后面变量部分的第一个变量应标识响应的接口。
c — 特定代码(specific-code)
指明代理自定义的时间(若trap类型为6),否则为0。
d — 时间戳(timestamp)
指明自代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms。例如时间戳为1908表明在代理初始化后1908ms发生了该时间。
4、变量绑定(variable-bindings)
指明一个或多个变量的名和对应的值。在get或get-next报文中,变量的值应忽略。
管理变量的表示
管理变量表示管理对象类型在某一时刻的值(或称该类型的实例),SNMP以管理变量作为操作对象。
管理变量的表示方法是这样规定的:形如x.y,其中x是管理对象的object identifer。y是能唯一确定对象类型值的一组数字,在非表型变量中为0,在表型变量中是这个表的索引,比如接口表中的接口号,或路由表中的目的网络地址等等 。如:在MIB文件里定义了ipAdEntNetMask这一管理对象,其object identifier为1.3.6.1.1.5.6.1.3它是个路由表中的一项,它的一个实例就是路由表中某一行的子网掩码,如果这行的索引、目的网络地址为129.102.1.0。则这个变量名是:1.3.6.1.1.5.6.1.3.129.102.1.0。在以后的说明中,为了方便,把唯一确定管理变量的一组数字,也就是x.y中的y称作实例。
五、SNMP的运行过程
驻留在被管设备上的AGENT从UDP端口161接受来自网管站的串行化报文,经解码、团体名验证、分析得到管理变量在MIB树中对应的节点,从相应的模块中得到管理变量的值,再形成响应报文,编码发送回网管站。网管站得到响应报文后,再经同样的处理,最终显示结果
下面根据RFC1157详细介绍Agent接受到报文后采取的动作:
首先解码生成用内部数据结构表示的报文,解码依据ASN.1的基本编码规则,如果在此过程中出现错误导致解码失败则丢弃该报文,不做进一步处理。
第二步:将报文中的版本号取出,如果与本Agent支持的SNMP版本不一致,则丢弃该报文,不做进一步处理。当前北研的数据通信产品只支持SNMP版本1。
第三步:将报文中的团体名取出,此团体名由发出请求的网管站填写。如与本设备认可的团体名不符,则丢弃该报文,不做进一步处理,同时产生一个陷阱报文。SNMPv1只提供了较弱的安全措施,在版本3中这一功能将大大加强。
第四步:从通过验证的ASN.1对象中提出协议数据单元PDU,如果失败,丢弃报文,不做进一不处理。否则处理PDU,结果将产生一个报文,该报文的发送目的地址应同收到报文的源地址一致。
根据不同的PDU,SNMP协议实体将做不同的处理:
1、GetRequest PDU
第一种情况:如果PDU中的变量名在本地维护的MIB树中不存在,则接受到这个PDU的协议实体将向发出者发送一个GetResponse报文,其中的PDU与源PDU只有一点不同:将ERROR-STATUS置为noSuchName,并在ERROR-INDEX中指出产生该变量在变量LIST中的位置。
第二种情况:如果本地协议实体将产生的响应报文的长度大于本地长度限制,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为tooBig,ERROR-INDEX置为0以外,与源PDU相同。
第三种情况:如果本地协议实体因为其他原因不能产生正确的响应报文,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为genErr,ERROR-INDEX置为出错变量在变量LIST中的位置,其余与源PDU相同。
第四种情况:如果上面的情况都没有发生,则本地协议实体向该PDU的发出者发送一个GetResponse报文,该PDU中将包含变量名和相应值的对偶表,ERROR-STATUS为noError,ERROR-INDEX为0,request-id域的值应与收到PDU的request-id相同。
2、GetNextRequest PDU
GetNextRequest PDU的最重要的功能是表的遍历,这种操作受到了前面所说的管理变量的表示方法的支持,从而可以访问一组相关的变量,就好象他们在一个表内。
下面通过一个例子解释表遍历的过程:
被管设备维护如下路由表:
Destination NextHop Metric
10.0.0.99 89.1.1.42 5
9.1.2.3 99.0.0.3 3
10.0.0.51 89.1.1.42 5
假设网管站欲取得这张路由表的信息,该表的索引是目的网络地址。网管站向被管设备发送一个GetNextRequest PDU,其中的受管对象的标识如下
GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
SNMP agent响应如下
GetResponse PDU:
GetResponse (( ipRouteDest.9.1.2.3 = “9.1.2.3” ),
( ipRouteNextHop.9.1.2.3 = “99.0.0.3” ),
( ipRouteMetric1.9.1.2.3 = 3 ))
网管站继续:
GetNextRequest ( ipRouteDest.9.1.2.3,
ipRouteNextHop.9.1.2.3,
ipRouteMetric1.9.1.2.3 )
agent响应:
GetResponse (( ipRouteDest.10.0.0.51 = “10.0.0.51” ),
( ipRouteNextHop.10.0.0.51 = “89.1.1.42” ),
( ipRouteMetric1.10.0.0.51 = 5 ))
值得注意的是agent必须能够确定下一个管理变量名,以保证所有变量能被取到且只被取到一次。
网管站继续:
GetNextRequest ( ipRouteDest.10.0.0.51,
ipRouteNextHop.10.0.0.51,
ipRouteMetric1.10.0.0.51 )
agent 响应:
GetResponse (( ipRouteDest.10.0.0.99 = “10.0.0.99” ),
( ipRouteNextHop.10.0.0.99 = “89.1.1.42” ),
( ipRouteMetric1.10.0.0.99 = 5 ))
网管站继续
GetNextRequest ( ipRouteDest.10.0.0.99,
ipRouteNextHop.10.0.0.99,
ipRouteMetric1.10.0.0.99 )
这时因为路由表中所有的行都被取遍,agent因返回路由表对象的下一字典后继即该管理对象在MIB树中的后序遍历的直接后继。这里应是nettoMediaIndex,管理对象的OBJECT IDENTIFIER。这个响应通知网管站对表的遍历已经完成。
3、GetResponse PDU
GetResponse PDU只有当受到getRequest GetNextRequest SetRequest才由协议实体产生,网管站收到这个PDU后,应显示其结果。
4、SetRequest PDU
SetRequest PDU除了PDU类型标识以外,和GetRequest相同,当需要对被管变量进行写操作时,网管站侧的协议实体将生成该PDU。
对SetRequest的响应将根据下面情况分别处理:
如果是关于一个只读变量的设置请求,则收到该PDU的协议实体产生一个GetReponse报文,并置error status为noSuchName, error index的值是错误变量在变量list中的位置。
如果被管设备上的协议实体收到的PDU中的变量对偶中的值,类型、长度不符和要求,则收到该PDU的协议实体产生一个GetReponse报文,并置error status为badValue, error index的值是错误变量在变量list中的位置。
如果需要产生的GetReponse报文长度超过了本地限制,则收到该PDU的协议实体产生一个GetReponse报文,并置error status为tooBig, error index的值是0。
如果是其他原因导致SET失败,则收到该PDU的协议实体产生一个GetReponse报文,并置error status为genErr, error index的值是错误变量在变量list中的位置。
如果不符合上面任何情况,则agent将把管理变量设置收到的PDU中的相应值,这往往可以改变被管设备的运行状态。同时产生一个GetResponse PDU,其中error status置为noError,error index的值为0。
5、Trap PDU
Trap PDU的有如下的形式
Trap是被管设备遇到紧急情况时主动向网管站发送的消息。网管站收到trap PDU后要将起变量对偶表中的内容显示出来。一些常用的trap类型有冷、热启动,链路状态发生变化等。