摘要:
Snmp模拟器是适用于模拟网络上大量的不同类型的支持SNMP设备响应请求的过程,其原理通过监听本地的本地IP接口和/或UDP端口,一旦SNMP请求进入,SNMP模拟器查找snmprec文件并以snmp协议格式响应给服务器。
SNMP模拟器依赖于Python库,开源免费,易于扩展,在实际应用中涉及大批量设备与网管交互测试时是首选方案。本文结合项目需求阐述其应用,文中包含了对以下请求的响应(get-request、get-next-request、set-request)。
背景:需要模拟多台设备并发8条业务流的过程
操作步骤:
1、环境安装:
详参http://snmplabs.com/snmpsim/,本文以Python2.7,windows安装环境为例
2、构造snmpprc文件
该文件是把获取设备mib,以OID | TYPE | VALUE形式的单个SNMP对象组织在一起的文本文件,以.snmprec作为后缀。
获取设备mib的方法有三种:
1)手工创建
小编是结合wireshark抓包软件,抓取真实报文后分析SNMP报文来获取,以下做重点介绍:
通过以上报文分析可以得出:
① SNMP版本为v2c,
② SNMP 读写团体字为private,故该mib节点应该放在private.snmprec
③ 根据标红的mib,生成的单个SNMP对象是:
1.3.6.1.4.1.8886.6.1.36.1.48.0|2|5 |
PS:TYPE对应的ASN.1 如下:
Integer32 - 2 OCTET STRING - 4 NULL - 5 OBJECT IDENTIFIER - 6 IpAddress - 64 Counter32 - 65 Gauge32 - 66 TimeTicks - 67 Opaque - 68 Counter64 – 70 |
同理,整个过程的报文逐条分析,将每个mib生成SNMP对象,最后组织在一起,生成private.snmprec和public.snmprec。
2)真实设备模拟
通过如下命令生成
snmprec.py --agent-udpv4-endpoint=192.168.20.221:161 --output-file=./data/demo.snmprec --protocol-version=2c --community=public |
3)MIB文件构建
参http://snmplabs.com/snmpsim/quickstart.html#simulate-from-mib,此处小编未做验证。
3、指定文件目录
手动将以上生成的private.snmprec和public.snmprec数据文件放入以下目录:<Python-package-root>/data下,在本实例中便于管理,统一放在..\data\Y1564\RAX711C
4、运行模拟器
cd /d C:\Python27\Scripts snmpsimd.py --data-dir=..\data\Y1564\RAX711C --args-from-file=..\data\DeviceIp\Y1564\RAX711C.txt |
模拟器可以监听多个本地IP接口和/或UDP端口。需要传递多个--agent-udpv4-endpoint / --agent-udpv6-endpoint命令行参数,生成一个txt文件,绑定--args-from-file下
5、开始监听
以本文中实例(v2c)为例,正常启动如下所示
传输ID是标识本地传输端点的OID,模拟器在启动时会报告它正在侦听的每个端点。
6、响应请求
如截图所示,当服务器192.168.20.39使用 “public”团体向192.168.20.221模拟器发送SNMP请求时,模拟器从特定数据文件public / 1.3.6.1.6.1.1.0 / 192.168.20.39将用于构建响应(由Simulator根据传输ID 1.3.6.1.6.1.1.0报告)。
7、变体模块的使用
可以通过变体模块可以实现高度复杂行为,PYSNMP中变体模块可扩展,详参:http://snmplabs.com/snmpsim/simulation-with-variation-modules.html#standard-variation-modules
本文针对实例中使用场景对部分变体模块的使用做简要说明:
①numeric:生成随时间变化的整数值,用于INTEGER,Counter32,Counter64,Gauge32,TimeTicks对象
例如:
1.3.6.1.4.1.8886.6.1.36.1.52.0|2:numeric|min=1,max=8,offset=0,wrap=1 |
说明:该节点用于生成8条业务的索引值,最小为1,最大为8,偏差为0,在0-8循环使用;结合当前业务的话,每次产生的索引是一个随机值,不能实现自增的顺序增长,可能会重复,该问题暂时没解决,需要扩展。
②writecache:OID在.snmprec通过SNMP SET操作文件写入内存中
例如:
1.3.6.1.4.1.8886.6.1.36.2.3.1.2.1|2:writecache|value=1,op=set |
说明:该节点用于指定业务的标志位,初始值是1,通过set 操作修改值,再次用get获取时值为Manager配置的值
③multiplex:单个代理服务多个快照,一次只挑选一个快照来回答SNMP请求。模拟了更自然的代理行为,包括随时间变化的OID集。
例如:
1.3.6.1.4.1.8886.6.1.36.2.3.1.3.1|2:multiplex|dir=C:\Python27\snmpsim\data\variation\multiplex\Y1564\RAX711C-RAX701\1.3.6.1.4.1.8886.6.1.36.2.3.1.3.1,period=1,wrap=true |
说明:该节点是业务的状态位,3代表进行中,4代表已结束,同一个节点需要返回不同的值,结合当前业务,在标志位控制下只有获取到想要的想要的状态位才能进入下一步流程,否则就继续请求状态位,故使用快照来处理,详细的使用如下截图所示:
8、常见问题分析与解决
该章节汇总在实际操作中遇到的问题
1)基本环境配置
起码要保证模拟器和Manager之间能ping通;
对于监听多个IP接口时,需要将其逐个添加到网卡
2)模拟的返回节点报 no such instance
当节点不存在时回报该错误。
首先通过抓包,检查所属的团体字,在对应的.snmprec文件下查找该节点是否存在。
3)get-next-request请求的响应
.snmprec文件的查找是基于上下文,get-next-request请求存在顺序,对于请求内容是整表下的第一行数据,需要用multiplex指定到到第一行数据;对于请求的内容是下一行(非第一行)数据,返回就是.snmprec文件中该节点的下一行。
例如,依次通过get-next-request请求表里面的所有内容如下:
1.3.6.1.4.1.8886.6.1.36.3.20.1.1|:multiplex|dir=C:\Python27\snmpsim\data\variation\multiplex\Y1564\RAX711C-RAX701\1.3.6.1.4.1.8886.6.1.36.3.20.1.1,period=1,wrap=true 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.1|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.2|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.3|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.4|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.5|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.6|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.7|2|2 1.3.6.1.4.1.8886.6.1.36.3.20.1.1.8|2|2 |
备注:1.3.6.1.4.1.8886.6.1.36.3.20.1.1下的快照即第一行数据:1.3.6.1.4.1.8886.6.1.36.3.20.1.1
4)同步问题
实际测试中模拟多台设备同时并发时,发现SNMP 请求时同步执行。
该问题,通过查找相关API,可知:SNMP Simulator是一个单线程应用程序,这意味着它只能一次处理单个请求。最重要的是,一些变体模块可能会给请求处理带来额外的延迟,这可能导致后续请求在输入队列中累积并导致延迟增加。为了最大化吞吐量和最小化延迟,可以绑定到不同IP接口或端口的snmpsimd.py的多个实例,这有效地使SNMP模拟器一次执行多个请求,只要它们被发送到不同的snmpsimd.py实例。
5)基于IP接口文件的配置
实际应用中发现,IP接口文件有个数限制,建议最多配置500个。
......
查看更多精彩内容,请点击下载:
版权声明:本文出自《51测试天地》第五十三期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。