SNMP服务模拟

背景

​ SNMP(简单网络管理协议)是一种广泛应用于网络设备、服务器和操作系统的监控协议。通过SNMP,我们可以获取各类设备的性能指标,用于实时监控其状态和健康情况。

​ 然而,不同设备的SNMP实现存在差异。每种设备返回的数据格式、OID(对象标识符)和支持的监控项可能不同,因此我们需要为每种设备开发特定的适配代码。理想情况下,如果开发人员能够直接连接到设备进行调试开发,那无疑是最便捷的方式。但在一些情况下,设备可能位于客户现场,开发人员无法直接访问,这时,如何进行调试就成为一个挑战。

​ 此时,SNMP模拟器就显得尤为重要。我们需要的是模拟真实设备的SNMP响应,帮助我们在没有实际设备的情况下进行开发和调试。

技术理论

snmpsim 是一个 Python 库,能够实现 SNMP 模拟器,用于模拟 SNMP 设备响应。

下载地址:https://pypi.org/project/snmpsim/

安装要求:Python 3.8及以上

使用文档:https://docs.lextudio.com/snmpsim/documentation/

实现过程

1.安装

可以通过 pip 命令安装 snmpsim

1
pip install snmpsim

通过 pip 安装时,可能会安装到 snmpsim 版本 0.4.7,这个库是不正确的。

我们需要使用版本 1.x.x,比如我这里是 1.1.7,可以通过离线安装来获取:

  1. 下载 snmpsim-1.1.7-py3-none-any.whl 文件。
  2. 使用下面的命令安装:
1
pip install snmpsim-1.1.7-py3-none-any.whl

安装完成后,你就可以使用 snmpsim-command-respondersnmpsim-manage-records 等命令进行模拟snmp服务了。

注:通过文件安装,命令可能不会加入到环境变量,所以我下面指定绝对路径了

2. 获取真实数据

首先,从现场设备获取 SNMP 数据。使用 snmpwalk 命令来获取设备的 SNMP 信息:

1
snmpwalk -v2c -c 团体字 -ObentU IP 1.3.6 > snmpdata.snmpwalk

如果遇到报错,可以添加 -Cc 参数来忽略错误并继续执行:

1
snmpwalk -v2c -c 团体字 -Cc -ObentU IP 1.3.6 > snmpdata.snmpwalk

3. 数据处理

获取到 snmpwalk 数据后,我们需要将其转换为 snmprec 格式,才能供 snmpsim 使用。

假设我们在 Linux 虚拟机上操作,将 snmpdata.snmpwalk 文件上传到虚拟机,然后执行以下命令进行数据转换:

1
/usr/local/python3/bin/snmpsim-manage-records --input-file=snmpdata.snmpwalk --source-record-type=snmpwalk > snmpdata.snmprec

如果在转换过程中遇到报错,可能是 snmpdata.snmpwalk 文件中存在格式问题。请检查每一行是否以 .1.3.6 开头。如果某些行没有以 .1.3.6 开头,可能是上一行数据的换行问题。可以使用以下正则表达式来查找这些行并进行处理:

1
^(?!\.1\.3\.6).*$

修复数据后,再次运行转换命令即可正常生成 snmprec 文件。

4. 启动模拟器

数据处理完成后,可以启动 SNMP 模拟器。通过以下命令启动 snmpsim-command-responder,它将模拟一个 SNMP 代理服务:

1
/usr/local/python3/bin/snmpsim-command-responder --agent-udpv4-endpoint=0.0.0.0:1161 --process-user=root --process-group=root --data-dir=./

参数说明

  • --agent-udpv4-endpoint:指定模拟器监听的 IP 和端口。
  • --process-user:指定运行模拟器的用户。
  • --process-group:指定运行模拟器的用户组。
  • --data-dir:指定模拟器的数据源目录,通常为包含 .snmprec 文件的目录。

启动后,你可以从控制台输出中查看 SNMP 服务的运行信息。

其中v2版本的团体字是文件名,比如我这里的就是snmpdata

5. 测试模拟器

为了验证模拟器是否正常运行,可以通过 snmpwalk 命令测试模拟的 SNMP 服务:

1
snmpwalk -v2c -c snmpdata 127.0.0.1

如果能够成功获取数据,说明模拟器已正常运行。


SNMP服务模拟
http://www.yangchao.me/posts/118/
作者
小不点
发布于
2024年12月11日
许可协议