simple network manage pro 简单网络管理协议,利用网路管理网络
- 屏蔽了物理设备之间的差异,实现对不同设备的统一管理
- 设计简单
- 基于UDP协议
主要由四个部分组成
- NMS 网络管理系统
- 代理进程agent
- 被管理的对象MB
- 管理信息库MIB
NMS
- 发送给agent请求,查询或者修改具体的数值
- 接受设备agent发送的trap信息,获知管理设备的状态
Agent
- 被管理设备中的一个代理进程
- 接受nms的指令,根据mib进行执行指令,返回操作结果给nms
- 设备发生故障时,设备通过agent发送信息给nms
- 代理设备使用161端口来发送接受和发送响应数据
MB
被管理的对象,每一个设备包含多个被管理的对象,可以是某个硬件,软件(路由选择协议)配置的参数集
MIB
MIB库类似于一个数据库,存储着网络元素所维持的变量,这些变量可以被管理平台查询或者设置,MIB维持着网络中所有可能被管理对象的集合的数据结构,MIB利用树的结构保证每一个元素的唯一性
在这个树的上层结构中,树的根节点也就是root节点无实际的含义,仅作为起始的节点。
除此之外还有一些标准的概念 ASN.1 BER
ASN.1:
抽象语法定义(Abstract Syntax Notation One),用于定义语法的语言,定义了SNMP中PDU(协议数据单元)和管理对象MIB的格式,SNMP使用了ASN.1的一部分内容,并且使用语言的特性定义了一些自定义类型和类型宏,组成SMI
PDU是协议数据单元,是实际传输的数据包,一个PDU对应SNMP的一次具体的操作
BER:basic encoding rule基本编码规则,描述如何将ASN.1类型的编码值转换为字符串的方法,他是ASN.1的一部分,在这个规则中数据被分为三部分:TLV Tag是类型的标识,Length是标识类型的长度,Value是具体的内容,数据按照TLV的顺序进行编码,生成字节流,SNMP使用BER将SNMP的操作请求和应答编码后进行传送,并用于接收端进行解码
常用的操作
Get:获取单个或者多个参数的值
Set:设置代理进程的一个或者多个参数值
Getnext:获取当前参数的下一个参数的值
Walk:获取所有的参数值
GetBulk:获取多个参数值,一般会连续获取十个参数值
trap:代理进程主动向管理系统发送trap消息,一般是某个设置的错误或者故障发生时进行上报,trap上报的消息如下表:
trap类型 | 名称 | 描述信息 |
0 | coldStart | 代理进程对自己初始化 |
1 | warmStart | 代理进程对自己重新初始化 |
2 | linkDown | 一个接口已从工作状态变为故障状态(报文中的第一个变量标识此接口) |
3 | linkUp | 一个接口已从故障状态变为工作状态(报文中的第一个变量标识此接口) |
4 | authenticationFailure | 从SNMP管理进程收到无效共同体的报文 |
5 | egpNeighborLoss | 一个EGP邻站已变为故障状态(报文中的第一个变量包含邻站IP地址) |
6 | enterpriseSpecific | 在这个特定的代码段中查找trap信息 |
不同版本区别
snmp版本之间的区别:
Snmpv1支持GET,SET,GETNEXT,TRAP
Snmpv2是v1版本的演进版本,v2版本增加了GetBulk操作和Inform操作,
● GetBulk操作被用于NMS获取大量的块数据,要求agent尽量多的相应消息中的请求,但是不存在没有返回也不影响
● Inform允许一个NMS发送trap包给其他的NMS,再接受相应响应
Snmpv3增加了安全能力和远程配置的能力,snmpv3结构为消息安全和VACM引入了USM
有三个可能的安全级别:noauthnopriv:没有认证或私密性执行
authnppriv:认证被执行,但没有私密性被执行
authpriv:认证和私密性都执行
auth:支持MD5或SHA
priv:支持DES或RSA
SNMP抓包分析
snmp基于udp协议,因此snmp数据包中含有udp头部和ip头部,
snmp还需要配置版本标识、community团体名等信息
PDU类型包含两个字节:第一个字节是数据的类型,第二个字节是数据的长度
请求报文:get-response
目的mac地址 源mac地址
协议类型0x0800
IP头部
udp头部
snmp内容
02 01 01 表示版本号,02表示字段为INTEGER类型,01表示占1个字节,01表示版本号 版本为v2c
04 06 70 75 63 6c 69 63 其中04表示该字段为OCTET STRING类型,06表示长度有6个字节,70之后的表示团体名,此处为public
a2 24 中a2表示这是一个get-response报文,24表示后面还有36个字节
02 04 2c ac bc 9e 使用BER编码了一个值request-id后面的数据类似
get-request操作的数据包
snmpv2 snmpv1更多的区别
对象的定义
除了操作有增加之外,不同版本支持的数据类型也不同:
SNMPv2 增加了 Unsigned32 和 Counter64 两种新的数据类型,Counter64 与 Counter32一样,都表示计数器,只能增加不能减少。当计数器增加到上限时回零,从头再增加。SNMPv2 规定计数器没有定义的初始值,所以只有连续两次读计数器得到的增加值才是有意义的。
OBJECT-TYPE MACRO::= BEGIN
TYPE NOTATION::="SYNTAX" Syntax
UnitsPart
"MAX-ACCESS" Access
"STATUS"Status
"DESCRIPTION" Text
ReferPart
IndexPart
DefValPart
VALUE NOTATION::=value (VALUE ObjectName)
END
snmpv2增加了UNITS子句,用文字说明与对象有关的度量单位
MAX-ACCESS子句:SNMPv2 定义的访问类型中去掉了write-only 类,增加了一个与概念行有关的访问类型 read-create,表示可读、可写、可生成。SNMPv2的5种访问级别由小到大排列依次是:not-accessible、accessible-for-notify、read-only、 read-write、read-create。
STATUS子句:STATUS 子句指明对象的状态。新标准去掉了 SNMPvl 中的 optional 和mandatory,只有 3 种可选的状态。
STATUS | 说明 |
Current | 当前标准中有效 |
Obsolete | 废弃,不必实现此对象 |
deprecated | 过时,但为了兼容应该实现此对象 |
与snmpv1相同,snmpv2的管理操作只能作用于标量对象(节点),复杂的信息使用表来标识,表是行的序列,行是列对象的序列
- 禁止删除和生成行的表,表的最高访问级别是read-write,在很多情况下这种表由代理进行控制,表中只包含read-only类型的对象
- 允许删除和生成行的表,这种表开始时可能没有行,由管理站生成和删除行
snmpv2表的定义中必须存在INDEX或者AUGMENTS子句,INDEX子句定义了一个基本概念行,AUGMENTS的子句的作用是代替INDEX子句,表示概念行的扩展。
INDEX子句中的索引对象确定了一个概念行实例,作为索引的列对象叫做辅助对象,是不可访问的,如表中存在petType和petIndex实例,这是每行中的唯一一对标识
如果要引用第2行和第4列的对象实例,实例的标识符为:
petCharacteristic2.DOG.5
其中“DOG”是无修饰符IMPLIED的变长度字符串,编码为3.68.79.71,因此实例的标识为
A.1.4.3.68.79.71.5
表的操作
状态列
允许生成和删除行的表必须有一个列对象,这种列叫做概念行的状态列,其SYNTAX子句的值为RowStatus,MAX-ACCESS子句的值为read-write,状态列可取6个值:
状态列 | 读写限制 | 说明 |
active | 可读写 | 被管理设备可以使用概念行 |
notInService | 可读写 | 概念行存在,但由于其他原因不能使用 |
notReady | 只读 | 概念行存在,但因没有信息而不能使用 |
createAndGo | 只写不读 | 管理站生成一个概念行实例时先设置成 createAndGo,生成过程结束时自动变为 active |
createAndWait | 只写不读 | 管理站生成一个概念行实例时先设置成这种状态,但不会自动变成 active |
destroy | 只写不读 | 管理站需删除所有的概念行实例时设置成这种状态 |
状态行的生成
四个步骤:
- 选择索引对象的实例标识符
- 管理站通过事务处理产生和激活概念行,管理站通过事务处理产生,与代理协商后生成
- 初始化非默认值对象,Get操作查询所有列,根据返回值确定是否设置为列对象的值
- 激活概念行,Set操作设置状态列对象为active
概念行的挂起
当概念行处于active状态时,如果管理站希望概念行脱离服务,以便进行修改,则可以发出Set命令,将状态列由active置为notInService。这时有两种可能:
- 代理不执行该操作,返回WrongValue
- 代理可以执行该操作,返回noError
概念行的删除
管理站发出Set命令,将状态置为destroy,如果操作成功,概念行立即被删除
通知和信息模块
SNMPv2提供了通知类型的宏定义NOTIFICATION-TYPE,用于定义一场条件出现时,SNMPv2实体发送的信息。
NOTIFICATION-TYPE MACRO::=BEGIN
TYPE NOTATION::=ObjectsPart
"STATUS" Status
"DESCRIPTION" Text
ReferPart
VALUE NOTATION::=value(VALUE NotificationName)
ObjectsPart::="OBJECTS""{"Objects"}"lempty
Objects::=Object|Object","Object
Object::=value(Name ObjectName)
Status::="current"|"deprecated"|"obsolete"
ReferPart::="REFERENCE” Textlempty
Text::="string""
END
任选的 OBJECT 子句定义了包含在通知实例中的 MIB 对象序列,当 SNMPv2 实体发送通知时这些对象的值被传给管理站。DESCRIPTION 子句说明了通知的语义,任选的 REFERENCE 子句包含对其他 MIB 模块的引用。
SNMPv2 还引入了信息模块的概念,用于说明一组有关的定义。信息模块共有以下 3 种:
MIB 模块 | 包含一组有关的管理对象的定义 |
MIB 的一致性声明模块 | 说明有关管理对象实现方面的最小要求 |
代理能力说明模块 | 说明代理实体应该实现的能力 |
SNMPv2的管理信息库
snmpv2 mib拓展和细化了mib-2中定义的管理对象,又增加了新的管理对象。
其中SNMP 组是由 MIB-2 的对应组改造而成的,去掉了许多对排错作用不大的变量。
其中接口组增加了 4 张表,它们是接口扩展表、接口堆栈表、接口测试表、接口地址表。
协议数据单元
SNMPv2 提供了 3 种访问管理信息的方法,分别是:
- 管理站和代理之间的请求/响应通信:同 SNMPv1
- 管理站和管理站之间的请求/响应通信:SNMPv2 特有(分布式)
- 代理到管理站的非确认通信(Trap):同 SNMPv1