我有一个程序处理来自 snmpd 的 pass_persist。它对于 get 和 getnext 请求运行良好。
对 0.0 获取将返回 0.0,对 0.0 获取下一步将返回 0.1:
user@debianbase:~$ sudo snmpget -v 2c -c public localhost 1.3.6.1.3.0.0
iso.3.6.1.3.0.0 = STRING: "192.168.153.0"
user@debianbase:~$ sudo snmpgetnext -v 2c -c public localhost 1.3.6.1.3.0.0
iso.3.6.1.3.0.1 = Gauge32: 0
但是,如果我尝试遍历我正在处理的 OID,它的行为就会很奇怪。我期望看到来自客户端的一系列 getnext 请求,但我看到的并不是这样。snmpwalk on 0.0 的输出只是 Get on 0.0 的结果:
user@debianbase:~$ sudo snmpwalk -v 2c -c public localhost 1.3.6.1.3.0.0
iso.3.6.1.3.0.0 = STRING: "192.168.153.0"
如果我执行数据包捕获,看起来我的应用程序响应正确,但客户端在初始响应后执行的是 Get,而不是 GetNext
获取 0.0 上的下一个:
10:38:37.238144 IP (tos 0x0, ttl 64, id 29006, offset 0, flags [DF], proto UDP (17), length 69)
localhost.43142 > localhost.snmp: [bad udp cksum 0xfe44 -> 0x6c7c!] { SNMPv2c { GetNextRequest(26) R=607525872 X:0.0 } }
代理对 0.1 的响应:
10:38:37.238892 IP (tos 0x0, ttl 64, id 29007, offset 0, flags [DF], proto UDP (17), length 70)
localhost.snmp > localhost.43142: [bad udp cksum 0xfe45 -> 0x673b!] { SNMPv2c { GetResponse(27) R=607525872 X:0.1=0 } }
现在我希望看到 0.1 上的 GetNext,但是 snmpwalk 客户端却对 0.0 执行了 Get:
10:38:37.239027 IP (tos 0x0, ttl 64, id 29008, offset 0, flags [DF], proto UDP (17), length 69)
localhost.43142 > localhost.snmp: [bad udp cksum 0xfe44 -> 0x6b7d!] { SNMPv2c { GetRequest(26) R=607525873 X:0.0 } }
我的代理使用 0.0 值正确响应:
10:38:37.240000 IP (tos 0x0, ttl 64, id 29009, offset 0, flags [DF], proto UDP (17), length 82)
localhost.snmp > localhost.43142: [bad udp cksum 0xfe51 -> 0x07f4!] { SNMPv2c { GetResponse(39) R=607525873 X:0.0="192.168.153.0" } }
如果我对不在 1.3.6.1.3 中的任何 OID 执行遍历,则遍历将按预期运行并执行一系列 GetNextRequests,但会跳过我正在使用代理处理的 1.3.6.1.3 oid 树。