首页 > 代码库 > snmp数据包分析

snmp数据包分析

今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析。

先说说snmp get-request的书报包格式吧,get-next-request,get-response,set-request这几个格式都是差不多的,只是pdu类型不一样。还有trap格式不大一样。

好,先说说get-request报文格式(参考tcp/ip详解 卷一)。

版本 + 团体名 + pdu类型 + 请求标识 + 差错状态 + 差错索引 + 差错索引 + 名称 + 值 + 名称 + 值 。。。。

trap的也说一下

版本 + 团体名 + pdu类型 + 企业 + 代理地址 + trap类型 + 特定代码 + 时间戳 + 名称 + 值。。。

okay,下面说一下我的环境

主机windows xp虚拟机Vmware ubuntu,抓包工具wireshark,使用的netsnmp,主机ip210.38.235.184,虚拟机ip210.38.235.186

这里虚拟机向主机发一条命令snmpget -v 1 -c public 210.38.235.184 sysDescr.0(oid为1.3.6.1.2.1.1.1.0)

先来看看snmp v1版的数据包吧

c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00 00 47 21 ba 40 00 40 11 9d 2b d2 26 eb ba d2 26 eb b8 96 f9 00 a1 00 33 8a 2d 30 29 02 01 00 04 06 70 75 62 6c 69 63 a0 1c 02 04 26 ca 2f cb 02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 01 00 05 00

c8 1f 66 05 fb a6//目的网卡地址

00 0c 29 90 f7 6d//源网卡地址

08 00//协议类型,这里是ip协议

45 00 00 47 21 ba 40 00 40 11 9d 2b d2 26 eb ba d2 26 eb b8//ip头部20个字节

96 f9 00 a1 00 33 8a 2d//udp8个字节

30 29//30表示snmp消息用的是asn.1 sequence 29表示消息长度(29后面的字节数)41个字节

02 01 00 //这里采用的是BER(Basic encode rule)编码(第一个字节表示数据类型,第二个字节表示数据长度,后面为数据)02表示INTEGER类型,01表示长度为1,00表示版本为v1
04 06 70 75 62 6c 69 63//这里是团体名public阿斯科马,这里也采用的是BER编码

a0 1c//pdu类型a0表示get-request 1c表示pdu数据长度28个字节

02 04 26 ca 2f cb//request-id管理进程设置的一个整数

02 01 00//差错状态,00表示没有出现差错

02 01 00//差错状态索引,00

30 0e//表示值名称采用的是asn.1,数据长度为14个字节

30 0c//表示第一个值名称采用的是asn.1,数据长度为12个字节

06 08 2b 06 01 02 01 01 01 00//这里采用的是BER,但是snmp,oid的编码方式有点怪,后面我会有说明

05 00//snmp NULL 所以数据长度为0

okay上面已经分析完snmp v1的数据包

下面看看snmp v2数据包

c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00 00 47 21 b9 40 00 40 11 9d 2c d2 26 eb ba d2 26 eb b8 a8 8d 00 a1 00 33 d1 e6 30 29 02 01 01 04 06 70 75 62 6c 69 63 a0 1c 02 04 51 5a b7 e0 02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 01 00 05 00

 

c8 1f 66 05 fb a6 //目的网卡地址
00 0c 29 90 f7 6d //源网卡地址 这里应该是数据链路层封装的头部
08 00 //协议类型,这里是ip协议

45 00 00 47 21 b9 40 00 40 11 9d 2c d2 26 eb ba d2 26
eb b8 //ip首部
a8 8d 00 a1 00 33 d1 e6 //udp首部
//下面是snmp报文
30//表示snmp消息是asn.1 sequence类型
29//29表示该字段后面还有41个字节
02 01 01//最后一个01表示snmp版本为2c这里采用的是BER编码方式 02表示该字段为INTEGER类型,第二个01表示数据长度为1
04 06 70 75 62 6c 69 63 //这里是团体名称public,04表示数据类型为OCTET STRING类型,06表示数据长度为6个字节,后面6个为public 的阿斯科马值,但是这里为什么后面的没有采用这种BER编码方式,即数据类型+数据长度+数据类容
a0 1c //a0表示报文类型为get-request,1c表示后面还有28个字节的数据,这里为什么没有采用BER编码方式?这里除了类型字段外,其他的都采用BER编码方式
02 04 51 5a b7 e0 //request ID这是由管理进程设置的一个整数这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文

02 01 00 //差错状态 00表示noError
02 01 00 //差错状态索引00
//下面为名称 值
30 0e //30 asn.1 sequence类型 0e长度为14
30 0c //第一个名值对编码方式asn.1 sequence 长度为12
06 08 2b 06 01 02 01 01 01 00 //oid为1.3.6.1.2.1.1.1.0 关于SNMP的OID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为x和y。编码时40*x+y,这里x=1,y=3,因此结果为40*1+3=43,即表示十六进制的2b
05 00//asn.1的NULL类型 variable-value1的值为NULL

 

 

这里说明一下关于SNMP的OID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为x和y。编码时40*x+y,这里x=1,y=3,因此结果为40*1+3=43,即表示十六进制的2b

关于snmp trap数据包,我会面会分析。可以参考http://blog.chinaunix.net/uid-23069658-id-3251045.html这篇文章写得还不错

snmp报文中pdu只有pdu类型没有采用BER编码,其他的都采用了BER编码

 

okay先到这

参考:http://blog.chinaunix.net/uid-23069658-id-3251045.html

 

 

 

snmp数据包分析