⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜
✏️write in front✏️
📝个人主页:陈丹宇jmu
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
🙉联系作者🙈by QQ:813942269🐧
🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️🌈
✉️少年不惧岁月长,彼方尚有荣光在 🏆
📋笔记目录
🎖️验证SNMP数据包
🥇SNMP的报文分析
🥈SNMP报文格式分析
🏅SNMP PDU分析
🚩结尾
🎖️验证SNMP数据包
使用snmputilg发送SNMP数据包; 使用wireshark抓包;使用netstat -an查看代理站TCP/UDP连接表,分析并验证SNMP协议的工作过程;
如下图所示,SNMP协议通信涉及两个端口号:UDP端口号161和UDP端口号162。
其中,UDP端口号161用于SNMP代理向SNMP管理程序发送信息,也称为SNMP读端口,SNMP管理程序通过该端口获取被管理设备的状态信息;UDP端口号162用于SNMP管理程序向SNMP代理发送信息,也称为SNMP写端口,SNMP管理程序通过该端口向被管理设备发送控制和配置信息。
需要注意的是,SNMP协议使用的是UDP协议,不同于TCP协议,因此设计的端口号不同,其目的是使SNMP通信更加高效,减少网络传输的负担。
使用netstat -an查看代理站TCP/UDP连接表
对于表项的理解:
SNMP协议是基于UDP协议传输的,而UDP协议是无连接的,只是监听,并没有因为数据包的发送就成登记一条连接。
🥇SNMP的报文分析
使用 wireshark 抓包,过滤条件直接设为“snmp”,成功抓到包。
下图所示的为一次SNMP报文的交互,从抓包的结果可以看出SNMP服务采用的是C / S模式,即请求 / 响应的机制实现SNMP报文的交互。
- 上图中圆圈一指示的是SNMP一次管理的过程使用的PDU,即服务器端(管理站)发出请求报文(get-request),客户端(网管设备的代理系统)对管理站的请求做出响应并通过响应报文(get-response)将网管信息返回给管理站。
- 上图中圆圈一指示的是通过SNMP所需要获取的管理对象的OID。OID为.1.3.6.1.2.1.2.2.1.4
通过MIB Browser所给出的MIB对象实例“ifMtu”具体的使用说明如下图所示:
该对象实例具体应用在:
接口上可以发送或接收的最大数据报的大小,以八字节为单位指定。用于传输网络数据报的接口,该接口可以发送的最大网络数据报大小。
报文发送和接收过程分析
当 SNMP 协议实体发送报文时,首先按照 ASN.1 的格式构造 PDU 交给认证进程。接着认证进程检查源和目标之间是否可以通信,如果检查通过则把有关信息(版本号、团体名、PDU)组装成报文。最后经过 BER 编码,交传输实体发送出去。
当一个 SNMP 协议实体接收到报文时,需要执行封装报文的逆过程。首先按照 BER 编码恢复 ASN.1 报文,然后对报文进行语法分析、验证版本号和认证信息等。如果通过分析和验证,则离出协议数据单元,并进行语法分析。在认证检验失败时可以生成一个陷入报文,向发送站报告通信异常情况并丢弃报文.
🥈SNMP报文格式分析
注明:下面所示的是SNMPv1版本的报文格式
报文中每个字段的含义如下:
- 版本(version):版本字段,写入版本字段的是版本号减1。例如,SNMP(即 SNMPv1)应写入 0。
- 共同体(community):字符串形式,作为网络管理站 NMS 和 SNMP 代理之间的明文口令,默认为 public。
- PDU 类型:SNMP 协议的操作类型。
- 值为 0,表示 get-request 操作;
- 值为 1,表示 get-next-request 操作;
- 值为 2,表示 get-response 操作;
- 值为 3,表示 set-request 操作;
- 值为 7,表示 informRequest 操作。
- 请求标识(request-id):管理站 NMS 设置的一个整数值。SNMP 代理在发送 get-response 报文时也要返回此请求标识符。
- 差错状态(error status):整数,由 SNMP 代理进行标注,指明有错误发生。可用的值及含义如下表所示。
- 差错索引(error-index):当出现 noSuchName、badValue 或 readOnly 的错误时,由代理进程在回答时设置的一个整数。该数值指明引起错误的变量在变量列表中的偏移位置。
- 名称(Object name):MIB 管理信息库中的OID。
- 值(Value):OID对应的值。
🏅SNMP PDU分析
PDU 一共有 GetRequest-PDU、GetNextRequest-PDU、GetResponse-PDU、SetRequest-PDU、Trap-PDU 五种,这些类型在 RFC1157 的第 4 节Protocol Specification 有给出。
从RFC1157文档(SNMPv1协议的规范文件),查看SNMPv1一共有5种类型的PDU,ASN.1(抽象语法表示)如下图所示:
通过对于《计算机网络管理》第四章有关内容的学习,我学习到了:
- 管理站发出的 3 种请求报文GetRequest、GetNextRequest和 SetRequest 采用的格式是一样的。
- 代理的应答报文格式只有一种 GetResponsePDU。
- 另外,还有一个Trap操作。Trap 操作相当于代理系统发送事件报告,因此 Trap 报文由代理发给管理站,不需要应答。
下面对SNMPv1版本的包结构进行分析:
根据TLV中T的编码规则,解释下图SNMP协议中version的编码依据。
答:
- 从RFC1157文档(SNMPv1协议的规范文件),查看version的ASN.1(抽象语法表示)
可以看出,SNMP第一个字段是version(版本号)。它是值为0的INTEGER。
2、根据BER(基本编码规则,Basic Encoding Rule)进行编码。
BER把ASN.1表示的抽象类型值编码为TLV结构的字符串。
根据前面分析:
1)INTEGER是UNIVERSAL(通用标签),因此前两位(标签)为00。
2)类型为INTEGER,是简单类型,因此第三位类型值为0。
3)类型INTEGER为UNIVERSAL 2,因此后五位为00010。
由此可见,TLV中第一个字节T的值为二进制00 0 00010,即0000 0010,对应十六进制数为02H。
总结:【00(UNIVERSAL)+0(简单类型)+00010(INTEGER类型)】,即0000 0010B,02H。
2.2 第二部分L表示值V的长度,1个字节,对应十六进制数为01H。
2.3第三部分V表示值0,对应十六进制数为00H。
综上,版本号0(实际是表示使用的是SNMPv1)的BER编码为02 01 00。
根据TLV中T的编码规则,解释下图SNMP协议中Community的编码依据。
答:
community 类型是 OCTET STRING 字节串为通用标签 UNIVERSAL,标签值为4。因此前两位(标签)为 00,类型为简单类型,第三位为 0,标签值为 4,后五位为 00100。T 字段为的值为 00000100,对应十六进制数为 04。Value的值有11字节,所以L字段的值为 0000 1011,十六进制为 0B。V 字段的值为cdy077cr090,也就是用 ASCII 码表示的值为63 64 79 30 37 37 63 72 30 39 30。
Community: cdy077cr090的BER编码为04 0b 63 64 79 30 37 37 63 72 30 39 30。
TLV分析:
1. T:【00(UNIVERSAL)+0(简单类型)+00100(OCTET STRING类型)】,即0000 0100B,04H。
依据:RFC1157文档中version的ASN.1语法:
2. L:值的长度为11个字节,即0bH。
3. V:值为cdy077cr090,即63 64 79 30 37 37 63 72 30 39 30H。
🚩结尾
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
🌈写给读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️🌈