如何创建支持get/set命令响应的本地自定义SNMP OID
问题解答
关于你的代理运行模式
你当前基于pysnmp实现的模拟器完全脱离本地MIB体系独立响应请求,不需要依赖本地已加载的任何MIB文件即可处理任意OID的get/set请求:
- 你自定义的
FileInstrumController继承自AbstractMibInstrumController,并重写了readVars/writeVars核心方法,pysnmp收到SNMP请求后,会直接把请求中的OID元组透传给这两个方法,不会做本地MIB的OID存在性校验,只要方法返回符合SNMP类型规范的值,就能正常响应管理端。 - 现有代码的逻辑是将OID作为文件名映射到
/tmp目录下的文本文件,只要对应OID的文件存在、读写权限正常,就能正常返回值,和该OID是否在本地MIB中注册过没有任何关系。 - 注意你当前VACM配置的允许访问OID根为
(1,3,6),只要你要响应的自定义OID属于这个子树(即以1.3.6开头),就不会被访问控制拦截。如果需要使用1.3.6根以外的自定义OID,修改addVacmUser最后两个OID前缀参数为你的自定义根,或测试环境下直接设为空元组()放开所有OID的访问权限即可。
UUID生成唯一OID的方案可行性
该路径完全可行,但需要符合OID的编码规则:
- OID本质是由无符号整数组成的点分序列,你可以选择一个自定义的私有OID根(测试场景可直接使用实验段如
1.3.6.1.3.9999,生产场景建议使用自己的私有企业号段),将128位UUID按字节拆分为16个0-255的整数,依次拼接在私有根之后,即可得到全局唯一、不会和标准MIB OID冲突的自定义OID。 - 禁止直接将UUID的十六进制字符串(带横杠的格式)直接作为OID段使用,OID每一段必须是整数类型,否则会触发pysnmp的类型校验错误。
快速验证方法
不需要等待UUID方案实现,你可以直接验证自定义OID的响应能力:
- 在
/tmp目录下创建名为目标自定义OID的文件,比如文件名设为1.3.6.1.3.9999.1.0(这个OID默认不在任何本地MIB中),文件内写入测试内容如custom_oid_test。 - 启动代理服务后,使用snmpget工具发起请求,注意携带你配置的context名
my-context,参考命令:
snmpget -v3 -u my-area -n my-context -l noAuthNoPriv 127.0.0.1 1.3.6.1.3.9999.1.0
- 正常情况下会直接返回你写入文件的测试值,不会报OID不存在错误,即可确认代理支持无本地MIB的自定义OID响应。
优化建议
当前代码中IO异常直接抛出SmiError会对应SNMP的通用错误genErr,如果需要符合SNMP标准规范,建议在OID对应文件不存在时抛出NoSuchInstance错误,管理端可以更准确识别OID不存在的场景。另外代理端不需要加载自定义OID对应的MIB文件,只有当你需要让管理端能识别OID的名称、数据类型、描述信息时,才需要给管理端侧提供对应的MIB文件。
内容的提问来源于stack exchange,提问作者Digit_Fish
相关产品推荐
相关产品推荐

