当前位置: 代码网 > 服务器>网络>网络协议 > 深入解析pysnmp的SNMP协议

深入解析pysnmp的SNMP协议

2026年01月11日 网络协议 我要评论
1. snmp 协议基础1.1 snmp 是什么?snmp(simple network management protocol) 是用于网络设备管理的标准协议,支持对路由器、交换机、服务器等设备的监

1. snmp 协议基础

1.1 snmp 是什么?

snmp(simple network management protocol) 是用于网络设备管理的标准协议,支持对路由器、交换机、服务器等设备的监控和配置。核心功能包括:

  • get:查询设备信息(如 cpu 使用率、接口状态)。
  • set:修改设备配置(如设置设备名称)。
  • trap/inform:设备主动上报事件(如接口故障)。

1.2 snmp 架构

角色功能对应 pysnmp 模块
manager管理端(客户端),发起 snmp 请求(get/set)hlapi(高级 api)
agent被管理设备端(服务器),响应请求并执行操作pysnmp.entity(agent 实现)
mib管理信息库,定义可管理的对象(oid)及其属性(类型、权限等)pysnmp.smi(mib 解析)
oid对象标识符,唯一标识被管理的对象(如 1.3.6.1.2.1.1.1.0 表示系统描述)objectidentity 类

2. snmp 协议核心概念

2.1 oid(object identifier)

  • 结构:分层树形结构,如 1.3.6.1.2.1.1.1.0 对应 iso.org.dod.internet.mgmt.mib-2.system.sysdescr.0
  • 作用:唯一标识被管理的对象(如系统名称、接口流量)。
  • pysnmp 中的操作
    from pysnmp.hlapi import objectidentity
    
    # 通过 oid 字符串创建
    oid = objectidentity('1.3.6.1.2.1.1.1.0')
    
    # 通过 mib 符号创建(需加载 mib)
    oid = objectidentity('snmpv2-mib', 'sysdescr', 0)
    

2.2 mib(management information base)

  • 功能:定义 oid 的元数据(名称、数据类型、访问权限等)。
  • pysnmp 中的加载
    from pysnmp.smi import builder, view
    
    # 初始化 mib 编译器
    mib_builder = builder.mibbuilder()
    mib_view = view.mibviewcontroller(mib_builder)
    
    # 加载 mib 文件
    mib_builder.loadmodule('snmpv2-mib')
    

2.3 snmp 版本

版本特点pysnmp 实现类
v1基于社区名(明文),无加密communitydata(community)
v2c改进错误处理,仍使用社区名communitydata(community)
v3支持用户认证(usm)、加密(aes/des)usmuserdata(user, authkey, privkey)

3. snmp 消息结构与pysnmp实现

3.1 snmp 消息格式

snmp 消息由 headersecurity parameters(仅 v3)和 pdu 组成:

snmp message (ber encoded)
├── version
├── community/usmsecurityparameters (v3)
└── pdu (protocol data unit)
    ├── pdu type (get/set/getnext...)
    ├── request id
    ├── error status
    ├── error index
    └── variable bindings (oid-value pairs)

3.2pysnmp中的编码与解码

  • 编码(发送请求)
    from pysnmp.proto.api import v2c
    
    # 构建 get 请求 pdu
    pdu = v2c.getrequestpdu().addvarbinds(('1.3.6.1.2.1.1.1.0', v2c.octetstring('')))
    message = v2c.message(apiversion=1, community='public', pdu=pdu)
    
    # ber 编码为二进制
    encoded_message = message.encode()
    
  • 解码(接收响应)
    decoded_message, _ = v2c.message.decode(encoded_message)
    response_pdu = decoded_message['pdu']
    

4.pysnmp模块设计与 snmp 协议映射

4.1 分层架构

层级功能pysnmp 模块
应用层用户接口(get/set/walk)hlapi
协议层消息构建、编码/解码、安全处理(v3)proto, entity
传输层网络通信(udp/tcp)carrier
mib 层oid 解析与 mib 管理smi

4.2 核心类与 snmp 协议对应

snmp 概念pysnmp 类/方法示例代码
community (v2c)communitydatacommunitydata('public', mpmodel=1)
user (v3)usmuserdatausmuserdata('user1', authkey='auth123')
pdugetrequestpdu, setrequestpduv2c.getrequestpdu()
transportudptransporttarget, asyncore 事件循环udptransporttarget(('192.168.1.1', 161)

5. 深入 snmp 操作流程

5.1 get 请求全流程

  1. 用户发起请求
    from pysnmp.hlapi import getcmd, objecttype, objectidentity
    
    error_indication, error_status, error_index, var_binds = next(
        getcmd(snmpengine(),
               communitydata('public'),
               udptransporttarget(('192.168.1.1', 161)),
               contextdata(),
               objecttype(objectidentity('1.3.6.1.2.1.1.1.0')))
    
  2. 协议层构建 pdu
    • 创建 getrequestpdu,填充 oid。
  3. 传输层发送数据
    • 使用 udp 发送 ber 编码的 snmp 消息。
  4. agent 处理请求
    • 查找 oid 对应的值,生成 getresponsepdu
  5. manager 解析响应
    • 解码响应并返回 var_binds

5.2 snmp walk 实现原理

  • 底层操作:通过连续发送 getnext 请求,直到 oid 超出子树范围。
  • pysnmp 中的实现
    from pysnmp.hlapi import nextcmd
    
    for (error_indication, error_status, error_index, var_binds) in nextcmd(
        snmpengine(),
        communitydata('public'),
        udptransporttarget(('192.168.1.1', 161)),
        contextdata(),
        objecttype(objectidentity('1.3.6.1.2.1.1'))):
        # 处理每个 oid-value 对
    

6. snmpv3 安全机制与pysnmp

6.1 usm(user security model)

  • 认证(authentication)
    • 算法:md5、sha(usmhmacmd5authprotocolusmhmacshaauthprotocol)。
    • 防止数据篡改。
  • 加密(privacy)
    • 算法:des、aes(usmdesprivprotocolusmaescfb128protocol)。
    • 防止数据窃听。

6.2pysnmp中的 snmpv3 配置

from pysnmp.hlapi import usmuserdata, getcmd

error_indication, error_status, error_index, var_binds = next(
    getcmd(snmpengine(),
           usmuserdata('user1',
                       authkey='authkey123',
                       privkey='privkey123',
                       authprotocol=usmhmacshaauthprotocol,
                       privprotocol=usmaescfb128protocol),
           udptransporttarget(('192.168.1.1', 161)),
           contextdata(),
           objecttype(objectidentity('1.3.6.1.2.1.1.1.0')))
)

7. 总结

通过理解 snmp 协议的核心概念(oid、mib、pdu)和操作流程(get/set/walk),可以更深入地掌握 pysnmp 模块的设计逻辑:

  1. 分层架构:分离协议处理、传输层和 mib 管理。
  2. 灵活扩展:支持多版本 snmp 和自定义传输协议。
  3. 协议驱动pysnmp 的类和方法直接映射到 snmp 消息结构。

到此这篇关于深入解析pysnmp的snmp协议的文章就介绍到这了,更多相关pysnmp snmp协议内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com