深入解析pysnmp的SNMP协议

 更新时间:2026年01月11日 10:35:00   作者:漫谈网络  
本文主要介绍了深入解析pysnmp的SNMP协议,详细讲解了SNMP协议的实现,包括编码与解码、消息格式和安全机制,具有一定的参考价值,感兴趣的可以了解一下

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协议内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python3创建Django项目的几种方法(3种)

    Python3创建Django项目的几种方法(3种)

    这篇文章主要介绍了Python3创建Django项目的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 详解python进行mp3格式判断

    详解python进行mp3格式判断

    这篇文章主要介绍了详解python进行mp3格式判断,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • Python 命令行解析工具 argparse基本用法

    Python 命令行解析工具 argparse基本用法

    在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse, getopt, argparse,这里面功能最强大的莫过于 argparse,下面就来看看它用法,需要的朋友可以参考下
    2022-12-12
  • python原始套接字编程示例分享

    python原始套接字编程示例分享

    在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互。因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送。使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制。
    2014-02-02
  • Python单例模式实例详解

    Python单例模式实例详解

    这篇文章主要介绍了Python单例模式,结合实例形式分析了单例模式的概念、实现与使用方法、已经相关注意事项,需要的朋友可以参考下
    2017-03-03
  • pycharm2022.1最新永久激活码破解补丁一键安装教程免费分享(2022持续更新)

    pycharm2022.1最新永久激活码破解补丁一键安装教程免费分享(2022持续更新)

    更新到Pycharm 2022.2.x版,pycharm2022.2最新可用永久激活码分享(持续更新),pycharm激活补丁一键安装简单方便,无需手动修改文件,兼容苹果MAC,linux,Windows系统
    2022-07-07
  • Python处理SSH和Redis的示例代码详解

    Python处理SSH和Redis的示例代码详解

    这篇文章主要为大家详细介绍了Python中处理SSH和Redis的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • Python HTMLParser模块解析html获取url实例

    Python HTMLParser模块解析html获取url实例

    这篇文章主要介绍了Python HTMLParser模块解析html获取url实例,HTMLParser是python用来解析html的模块,HTMLParser采用的是一种事件驱动的模式,需要的朋友可以参考下
    2015-04-04
  • Python趣味爬虫之用Python实现智慧校园一键评教

    Python趣味爬虫之用Python实现智慧校园一键评教

    你还在为智慧校园每周的评教而苦恼吗?今天我来帮你解放双手,用Python实现一键评教,从此生活无忧无虑,文中有非常详细的代码示例,需要的朋友可以参考下
    2021-05-05
  • python3.6根据m3u8下载mp4视频

    python3.6根据m3u8下载mp4视频

    这篇文章主要为大家详细介绍了python3.6根据m3u8下载mp4视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论