本人小白,由于一些学习上和项目上的实际需求,对SNMP协议进行了一些学习研究,主要应用于交通信号机和城市大脑。以下是本人的一些学习经验,如有错误,欢迎大家交流指正。
1.SNMP介绍
SNMP是简单网络管理协议,其全称为simple network management Protocol。SNMP是一种简单网络管理协议,属于TCP/IP当中的应用层协议。主要用于网络设备的管理。
在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行一个SNMP代理(Agent)),代理实现设备与管理站的SNMP通信。如下图
管理站与代理端通过MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。
SNMP协议提供了三种用于控制MIB对象的基本操作命令,分别为 Get、Set、Trap:
1.Get:管理站读取代理者处的某一对象的值。
2.Set:管理站设置代理者处的某一对象的值。
3.Trap:代理者主动向管理者报告的重要事件,主要包括设备损坏、意外事件等。
SNMP协议定义了数据包的格式,网络管理员与管理代理之间的数据交换,还控制这管理代理的MIB数据对象。
一条SNMP消息包括三个部分,分别是“版本标识符”,“团体名”,“数据单元PDU”所构成
PDU中的协议数据单元:
SNMP当中规定了5种协议数据单元,用于管理进程和进程之间的交换
如下图所示,SNMP一共由三个部分组成,分别是公共SNMP首部,get/set首部,变量绑定
PDU类型 | 操作类型 |
---|---|
0 | get-request |
1 | get-next-request |
2 | set-request |
3 | get-response |
4 | trap |
3.差错索引:当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。
差错索引 | 名字 | 说明 |
---|---|---|
0 | coldstart | 代理进行了初始化 |
1 | warmstart | 代理进行了重新初始化 |
2 | linkDown | 一个接口从工作状态变为故障状态 |
3 | linkUp | 一个接口从故障状态变为工作状态 |
4 | authenticationFailure | 从SNMP管理进程接收到具有一个无效共同体的报文 |
5 | egpNeighborLoss | 一个EGP相邻路由器变为故障状态 |
6 | enterpriseSpecific | 代理自定义的事件,需要用后面的“特定代码”来指明 |
4.特定代码
知名代理自定义的事件(若trap类型为6),否则为0
5.时间戳
指明自代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms
指明一个或多个变量的名和对应的值。
在get或get-next报文中,变量的值应忽略。
PDU (协议数据单元)是SNMP消息中的数据区, 即Snmp通信时报文数据的载体。
SNMP协议的实现工具和方法有很多,本人使用snmptuil工具和一台Windows10平台的电脑进行模拟。
snmputil是一个汉化版的snmp集成工具
snmputil工具的命令规则是:snmputil [get|getnext|walk] agent community oid [oid …]
[get|getnext|walk]:为消息类型 包括get getnext walk
agent:指Snmp代理即你想进行操作的网络设备的ip或名称
community:分区域,即密码,默认是public
oid:想要操作的MIB数据对象号
SNMP获取系统版本:
OID: .1.3.6.1.2.1.1.1.0
实现命令:snmputil get loaclhost public .1.3.6.1.2.1.1.1.0
结果:
获取计算机连续开机多长时间:
OID:.1.3.6.1.2.1.1.3.0
实现命令:snmputil get loaclhost public .1.3.6.1.2.1.1.3.0
抓包软件使用wireshark对SNMP消息进行抓包
以下为SNMP获取系统版本:snmputil get loaclhost public .1.3.6.1.2.1.1.1.0所捕捉到的消息
18 00 00 即代表IPv6 Src: localhost, Dst: localhost
00 30 消息长度总共为48
11 Next Header: UDP (17)
80 Hop Limit: 128
00 00 00 00 00 00 00 00 00 00 00 01 Source Address: ::1(localhost)
00 00 00 00 00 00 00 00 00 00 00 01 Destination Address: ::1(localhost)
eb cd Source Port(发送端口): 60365
00 a1 Destination Port:(目标端口) 161
00 30 消息长度 48
de e4 Checksum: 0xdee4 [unverified]
以下为SNMP报文内容
30 26 02 01 00 04 06 70 75 62 6c 69 63
a0 19 02 01 01 02 01 00 02 01 00 30 0e 30 0C
06 08 2b 06 01 02 01 01 01 00 05 00
30 表示SNMP协议报文
26 消息长度为38个字节
02 01 00 协议版本v1 (前两个字节02表示INTEGER类型01是指1个字节长度)
04 参数类型(OCTSTR)
06 群体(community)名长度
70 75 62 6c 69 63 群体名public的assic码值
a0 PUD类型get-request
19 pdu的长度为25个OctStr(后面的内容31字节)
02 01 01 request ID
02 01 00 表示error-state为0
02 01 00 表示error-index为0
30 0e 表示后面变量绑定是SEQUENCE类型14个字节长度
30 0C 表示变量名1
06 表示该字段是OID类型
08 OID长度8字节
2b 06 01 02 01 01 01 00 1.3.6.1.2.1.1.1.0
05 00 表示NULL
get-response回复消息分析
18 00 00 即代表IPv6
60 03 d1 55 flow labell 03 d1 55
00 b8 消息长度184字节
11 Next Header: UDP (17)
80 Hop Limit: 128
00 00 00 00 00 00 00 00 00 00 00 01 Source Address: ::1(localhost)
00 00 00 00 00 00 00 00 00 00 00 01 Destination Address: ::1(localhost)
00 a1 Source Port(发送端口): 161
eb cd Destination Port:(目标端口) :60365
00 b8 消息长度184字节
le 63 Checksum: 0x1e63 [unverified]
以下为SNMP报文:
30 表示SNMP协议报文
81 消息长度为129个字节
02 01 00 协议版本v1
04 参数类型(OCTSTR)
06 群体(community)名长度
70 75 62 6c 69 63 群体名public的assic码值
a2 PUD类型get-response
81 pdu的长度为129个OctStr(后面的内容31字节)
9f
02 01 01 request id
02 01 00 表示error-state为0
02 01 00 表示error-index为0
30 81 表示后面变量绑定是SEQUENCE类型129个字节长度
93 30 81 90 表示变量名1
06 表示该字段是OID类型
08 OID长度8字节
2b 06 01 02 01 01 01 00 1.3.6.1.2.1.1.1.0
后续则表示
.Hardware: Intel64 Family 6 Mode
1158 Stepping 10 AT/AT COMPATIBLE - Software: Windows V ersion 6.3 (Build 19044Multipro cessor Free )
本文对SNMP的简单构造、消息类型、支持操作进行了简单介绍,然后使用snmputil进行了简单的snmp信息实例,并使用wireshark对消息进行了抓包,最后对SNMP消息进行分析,对SNMP消息进行了拆解,说明了各个部分的功能及作用。