【1.8.5.2】构建SNMP协议的请求

一、构建SNMP协议的Set请求

通过发送 Get 请求或 Walk 请求获取远程设备指定参数的值,实际上是获取远程设备中管理信息库 MIB 指定 OID 的值。为了方便对远程设备上 MIB 中的 OID 值进行管理,用户可以通过 Set 命令,改变设备的配置或控制设备的运转状态。

netwox 工具提供了编号为 164 的模块,用于构建 SNMP Set 请求,设置远程设备中 MIB 中的 OID 的值。语法格式如下:

netwox 164 -i IP -n OID -t OIDtype -V oidvalue

参数说明:

-i 选项指定远程设备的 IP 地址。
-n 选项指定要设置的 MIB 中 OID 的值。
-t 选项指定 OID 类型。
-V 选项指定 OID 对应的值。

【实例】已知远程设备的 IP 地址为 182.16.184.190,在主机 192.168.59.133 上构建 SNMP Set 请求,设置远程主机 MIB 中 OID.1.3.6.1.2.1.1.1.0 的值为 Linux snmp 2.6.39#1 SMP PREEMPT。

  1. 构建 SNMP Set 请求,执行命令如下:

    root@daxueba:~# netwox 164 -i “182.16.184.190” -n “.1.3.6.1.2.1.1.1.0” –t “s” -V “Linux snmp 2.6.39 #1 SMP PREEMPT”

执行命令后没有任何输出信息,但是会成功构建 SNMP Set 请求。

  1. 通过抓包查看构建的 SNMP Set 请求,如图所示。

其中,数据包的源 IP 地址为 192.168.59.133,目标 IP 地址为182.16.184.190。Info 列显示了 set-request,表示成功构建了 Set 请求。

在报文中可以看到,OID.1.3.6.1.2.1.1.1.0 的值被设置为了 Linux snmp 2.6.39#1 SMP PREEMPT。

二、构建SNMP协议的Get请求

Get 请求表示网络管理站 NMS 要从 SNMP 代理处获取被管理设备上的一个或多个参数值。

netwox 工具中编号为 159 的模块可以实现 SNMP Get 请求功能,它可以向 SNMP服务设备发送 Get 请求,获取指定参数的值。语法格式如下:

netwox -q OID -i IP

其中,-q 选项用来指定对象标识符,表示要获取该标识符对应的值;-i 选项用来指定 SNMP 服务地址。

【实例】已知支持 SNMP 协议的远程网络设备地址为 199.58.200.68。在主机 192.168.59.133上,构建 SNMP Get 请求,获取该设备上的系统基本信息。

  1. 获取系统基本信息,执行命令如下:

    root@daxueba:~# netwox 159 -q “.1.3.6.1.2.1.1.1.0” -i 199.58.200.68

命令中的 .1.3.6.1.2.1.1.1.0 为对象标识符,表示系统基本信息参数位置。

获取到的系统基本信息如下:

'Dell Out-of-band SNMP Agent for Remote Access Controller'

以上输出信息显示了远程设备的系统信息,从中可以了解到该设备是戴尔远程访问控制器。

  1. 通过抓包可以捕获到对应的请求和响应包。

Get 请求包如图所示。

在上图中,第 2 个数据包的源 IP 地址为 192.168.59.133,目标 IP 地址为 199.58.200.68,Info 列中的基本信息为 get-request 1.3.6.1.2.1.1.1.0,表示成功向远程设备发送了 SNMP Get 请求。第 4 个数据包为对应的响应包。

请求数据包的 Simple Network Management Protocol 部分显示了 Get 请求包的报文信息,具体如下:

Simple Network Management Protocol
version: version-1 (0)                            #版本, 这里值为0, 代表SNMP v1
community: public                                 #共同体
data: get-request (0)                             #PDU类型, 这里值为0, 表示为Get请求
get-request
request-id: 1330050988                            #请求标识
error-status: noError (0)                         #差错状态, 值为0, 表示无差错
error-index: 0                                    #差错索引
variable-bindings: 1 item                         #变量绑定
1.3.6.1.2.1.1.1.0: Value (Null)                   #变量名:值, 目前值为空, 因为
是请求包
Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)
#变量名
Value (Null)                                      #值, 这里值为空

上述输出信息显示了 Get 请求包中的字段信息。可以看到请求的变量名为 1.3.6.1.2.1.1.1.0,目前变量值为空,使用的请求标识为 1330050988。

  1. 响应包信息如图所示。

响应包的报文信息如下:

Simple Network Management Protocol
version: version-1 (0)
community: public
data: get-response (2)                  #PDU类型, 这里值为2, 表示为响应包
get-response
request-id: 1330050988                  #请求标识
error-status: noError (0)
error-index: 0
variable-bindings: 1 item
1.3.6.1.2.1.1.1.0: 44656c6c204f75742d6f662d62616e6420534e4
d50204167...
Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)
Value (OctetString): 44656c6c204f75742d6f662d62616e642
0534e4d50204167...
Variable-binding-string: Dell Out-of-band SNMP Agent
for Remote Access Controller

从输出信息中可以看到,请求标识为 1330050988 与请求包中的请求标识相同,表示是同一次的请求与响应;这里的值类型为 OctetString,并且成功返回了要查询的系统基本信息(最后一行)。

三、构建SNMP协议的Inform请求

Inform 请求是 SNMP 代理检测到设备上有资源消息产生,根据资源消息到 MIB 中找到对应的 OID,并主动向网络管理站 NMS 发出 Inform 请求。

与 Trap 请求不同的是,网络管理站 NMS 收到 Inform 请求后会给出响应。netwox 工具提供编号为 163 的模块,可以用来构建 SNMP Inform 请求。

【实例】已知网络管理站 NMS 地址为 198.13.107.218,在主机 192.168.59.133 上构建 Inform 请求。操作步骤如下:

  1. 构建 Inform 请求,指定 OID.1.3.6.1.2.1.1.1.0 对应的值为 SNMP Management,执行命令如下:

    root@daxueba:~# netwox 163 -i 198.13.107.218 -r “.1.3.6.1.4.1” -z “0” –n “.1.3.6.1.2.1.1.1.0” -t “s” -V “SNMP Management”

执行命令后没有任何输出信息,但是会成功构建 Inform 请求。

  1. 通过抓包验证成功构建的 Inform 请求,捕获的数据包如图所示。

该数据包的源 IP 地址为 192.168.59.133,目标 IP 地址为 198.13.107.218。Info 列显示了 informRequest,表示该数据包为 SNMP 代理向网络管理站 NMS 发送的 Inform 请求数据包。

在报文中可以看到,data 的值为 informRequest(6)。

四、构建SNMP协议的Walk请求

Walk 请求与 Get 请求类似,实际上是一个 Get-next-request 请求。区别在于,Walk 请求是获取对象标识符在系统树中所处位置的下一个对象标识符,并请求参数值。

netwox 工具中编号为 160 的模块实现了 SNMP Walk 请求功能,它可以向 SNMP 服务设备发送 Walk 请求,获取指定对象标识符的下一个对象标识符。语法格式如下: netwox -q OID -i IP

其中,-q 选项用来指定对象标识符,表示要获取该标识符的下一个对象标识符;-i 选项用来指定 SNMP 服务地址。

【实例】已知支持 SNMP 协议的远程网络设备地址为 198.13.107.218。在主机 192.168.59.133 上构建 SNMP Get 请求,获取指定标识符的下一个标识符的值。

  1. 获取网络接口描述信息,执行命令如下:

    root@daxueba:~# netwox 160 -q “.1.3.6.1.2.1.2.2.1.2” -i 198.13.107.218

命令中 .1.3.6.1.2.1.2.2.1.2 为网络接口描述信息的标识符。

执行命令后输出信息如下:

.1.3.6.1.2.1.2.2.1.2.1: 'LOOPBACK'

以上输出信息显示了下一个标识符,这里为 .1.3.6.1.2.1.2.2.1.2.1,并且获取到了对应的值为 LOOPBACK。表示网络接口为回环接口。

  1. 通过抓包可以看到构建的 SNMP Walk 请求包和对应的响应包,如图所示。

其中,第 18 个数据包的源 IP 地址为 192.168.59.133,目标 IP 地址为 198.13.107.218,Info 列中的基本信息为 get-next-request 1.3.6.1.2.1.2.2.1.2。其中,1.3.6.1.2.1.2.2.1.2 表示 OID,get-next-request 表示要获取该 OID 的下一个 OID。

该数据包的报文信息如下:

Simple Network Management Protocol
version: version-1 (0)
community: public
data: get-next-request (1)                  #PDU类型, 这里值为1, 表示为Walk请求
get-next-request
request-id: 222961396
error-status: noError (0)
error-index: 0
variable-bindings: 1 item
1.3.6.1.2.1.2.2.1.2: Value (Null)
Object Name: 1.3.6.1.2.1.2.2.1.2 (iso.3.6.1.2.1.2.2.1.2)
#对象名(变量名)
Value (Null)

从输出信息可以看到,报文中 PDU 类型为 1,请求的变量名为对象标识符 1.3.6.1.2.1.2.2.1.2。

  1. 捕获到的返回数据包,如图所示。

该数据包为对应的响应包。此时在报文中可以看到,对象名为 1.3.6.1.2.1.2.2.1.2.1,该 OID 是命令中指定的 OID 的下一个 OID。

  1. 指定再次向下一个 OID 发送请求,捕获的数据包如图所示。

从图中的数据包报文中可以看到,对象名为 1.3.6.1.2.1.2.2.1.2.1,表示向下一个 OID 发送了请求。

五、构建SNMP协议的Trap请求

一般情况下,网络管理站 NMS 向 SNMP 代理发送请求,获取被管理设备的参数值。然后,SNMP 代理将自己在 MIB 管理信息库中查到的参数值返回给网络管理站 NMS。这种方式采用的是 Get 请求。

但是还有一种情况,就是 SNMP 代理主动向网络管理站 NMS 发出报文,通知发生了某些事件。该种情况使用的是 Trap 请求,它可以用来通知故障、连接的中断和恢复、认证失败等消息。

由于 SNMP 版本不同,netwox 工具提供了不同的模块,用于构建 SNMPv1 版本和 SNMPv2 版本的 Trap 请求。

5.1 构建 SNMPv1 版本的 Trap 请求

netwox 工具编号为 161 的模块实现了 SNMPv1 版本的 Trap 请求功能,其语法格式如下:

netwox 161 -i IP -r OID -a IP -s Traptype -z timestamp -n OID -t OIDtype -V oidvalue

参数说明:

-i 选项用来指定远程主机服务(网络管理站 NMS)的地址。
-r 选项用来指定报文的网络设备的 OID(报文中的企业字段)。
-a 选项用来指定 SNMP 代理的 IP 地址。
-s 选项用来指定 Trap 类型。
-z 选项用来指定时间戳。
-n 选项用来指定要告诉网络管理站 NMS,发生事情的 OID。
-t 选项用来指定 OID 类型。
-V 选项用来指定 OID 对应的值。

【实例】已知网络管理站 NMS 地址为 182.16.184.190。主机 192.168.59.133 作为 SNMP 代理,构建 SNMP Trap 请求,具体步骤如下:

  1. 构建 SNMP Get 请求,设置企业对象 OID 为 .1.3.6.1.4.1,通知网络管理站 NMS,OID.1.3.6.1.2.1.1.1.0 对应的值为 APC Web/SNMP Management Card。执行命令如下:

    root@daxueba:~# netwox 161 -i “182.16.184.190” -r “.1.3.6.1.4.1.3.1” –a “192.168.59.133” -s “3” -z “0” -n “.1.3.6.1.2.1.1.1.0” -t “s” -V “APC Web/SNMP Management Card”

执行命令后没有任何输出信息,但是会成功构建 SNMP Trap 请求。

  1. 通过抓包查看构建的 SNMP Trap 请求,如图所示。

其中,该数据包的源 IP 地址为 192.168.59.133,目标 IP 地址为 182.16.184.190。Info 列显示了 trap,表示该数据包为 SNMP 代理向客户端发送的 Trap 数据包,是针对 SNMPv1 版本的。

Simple Network Management Protocol 部分显示了 Trap 请求的相关报文信息,具体如下:

Simple Network Management Protocol
version: version-1 (0)
community: public
data: trap (4) )                                             #PDU类型, 这里值为4, 表示为Trap请求
    trap
        enterprise: 1.3.6.1.4.1.3.1 (iso.3.6.1.4.1.3.1)      #企业OID
        agent-addr: 192.168.59.133                           #代理IP地址
        generic-trap: linkUp (3)                             #Trap类型
        specific-trap: 0                                     #特定代码
        time-stamp: 0                                        #时间戳
        variable-bindings: 1 item 
            1.3.6.1.2.1.1.1.0: 415043205765622f534e4d50204d616e6167656d656e7420...
                Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)         #OID
                Value (OctetString): 415043205765622f534e4d50204d616e6167656d656e7420...
                    Variable-binding-string: APC Web/SNMP Management Card    #OID的值

上述输出信息显示了 Trap 请求的报文信息,如代理 IP 地址、Trap 类型、OID,以及对应的值。

5.2 构建 SNMPv2 版本的 Trap 请求

netwox 工具中编号为 162 的模块实现了 SNMPv2 版本的 Trap 请求功能,其语法格式如下:

netwox 162 -i IP -r OID -z timestamp -n OID -t OIDtype -V oidvalue

参数说明:

-i 选项用来指定网络管理站 NMS 的地址。
-r 选项用来指定报文中企业字段的 OID。
-z 选项用来指定时间戳。
-n 选项用来告诉网络管理站 NMS,发生事情的 OID。
-t 选项用来指定 OID 类型。
-V 选项用来指定 OID 对应的值。

【实例】构建 SNMPv2 版本的 Trap 请求。执行命令如下:

root@daxueba:~# netwox 162 -i "182.16.184.190" -r ".1.3.6.1.4.1.3.1" -z "0" -n ".1.3.6.1.2.1.1.1.0" -t "s" -V "APC Web/SNMP Management Card"

执行命令后没有任何输出信息。

通过抓包查看构建的 Trap 请求,如图所示。

从报文中可以看到,data 的值为 snmpV2-trap(7),表示 PDU 类型为 SNMPv2 版本的 Trap 请求。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn