Python网络编程6-使用Pysnmp实现简单网管

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python网络编程6-使用Pysnmp实现简单网管相关的知识,希望对你有一定的参考价值。

参考技术A   简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。SNMP作为广泛应用于TCP/IP网络的网络管理标准协议,提供了统一的接口,从而实现了不同种类和厂商的网络设备之间的统一管理。
  SNMP协议分为三个版本:SNMPv1、SNMPv2c和SNMPv3。

  SNMP系统由网络管理系统NMS(Network Management System)、SNMP Agent、被管对象Management object和管理信息库MIB(Management Information Base)四部分组成。

  SNMP查询是指NMS主动向SNMP Agent发送查询请求,如图1-3所示。SNMP Agent接收到查询请求后,通过MIB表完成相应指令,并将结果反馈给NMS。SNMP查询操作有三种:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。

  不同版本的SNMP查询操作的工作原理基本一致,唯一的区别是SNMPv3版本增加了身份验证和加密处理。下面以SNMPv2c版本的Get操作为例介绍SNMP查询操作的工作原理。假定NMS想要获取被管理设备MIB节点sysContact的值,使用可读团体名为public,过程如下所示:

  SNMP设置是指NMS主动向SNMP Agent发送对设备进行Set操作的请求,如下图示。SNMP Agent接收到Set请求后,通过MIB表完成相应指令,并将结果反馈给NMS。

  不同版本的SNMP Set操作的工作原理基本一致,唯一的区别是SNMPv3版本增加了身份验证和加密处理。下面以SNMPv3版本的Set操作为例介绍SNMP Set操作的工作原理。
假定NMS想要设置被管理设备MIB节点sysName的值为HUAWEI,过程如下所示:

  SNMPv1和SNMPv2c的Set操作报文格式如下图所示。一般情况下,SNMPv3的Set操作信息是经过加密封装在SNMP PDU中,其格式与SNMPv2c的Set操作报文格式一致。

  SNMP Traps是指SNMP Agent主动将设备产生的告警或事件上报给NMS,以便网络管理员及时了解设备当前运行的状态。
  SNMP Agent上报SNMP Traps有两种方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的区别在于,SNMP Agent通过Inform向NMS发送告警或事件后,NMS需要回复InformResponse进行确认。

  在Ensp中搭建网络环境,在R2上启用SNMP作为SNMP agent,Linux主机作为NMS;为方便观察SNMP报文格式,在R2使用SNMP的版本为v2c。

通过下面的Python脚本获取R2的系统信息与当前的主机名

运行结果如下

  在R2接口上抓包结果如下,Linux主机向R2的161端口发送SNMP get-request报文,可以看到SNMP使用的版本为v2c,设置的团体名为public,随机生成了一个request-id,变量绑定列表(Variable bindings),即要查询的OID,但Value为空;值得注意的是这些信息都是明文传输的,为了安全在实际环境中应使用SNMPv3。

通过下面的Python脚本获取R2的接口信息。

运行结果如下:

在R2接口抓包结果如下,getBuikRequest相比get-request设置了一个max-repetitions字段,表明最多执行get操作的次数。Variable bindings中请求的OID条目只有一条。

下面Python脚本用于设置R2的主机名为SNMPv2R2。

运行结果如下

在路由器上可以看到主机名有R2变为了SNMPv2R2。

get-response数据包内容与set-request中无异。

下面Python脚本用于接收,R2发送的Trap,并做简单解析。

先运行该脚本,之后再R2上手动将一个接口shutdown,结果如下:

接口上抓包结果如下,此时团体名用的是public,data部分表明是trap。

由于Ensp中的通用路由器认证算法只支持des56,而pysnmp不支持该算法,因此使用AR路由器配置SNMPv3。

使用下面Python脚本发送snmpv3 get报文获取设备系统信息。

抓包结果如下,首先发送get-resques进行SNMPv3认证请求,随机生成一个msgID,认证模式为USM,msgflgs中Reportable置1要求对方发送report,其他为置0,表示不进行加密与鉴权;另外安全参数,认证参数、加密参数都为空,此时不携带get请求数据。

路由器给NMS回复report,msgID与resquest一致,Msgflgs中各位都置0,同时回复使用的安全引擎,认证与加密参数为空,不进行认证与加密,因此能看到data中的数据。

AR1收到请求后进行回复,数据包中msgflags标志位中除reportable外其他位都置1,表示不需要回复,同时进行加密与鉴权。同样也可以看到认证用户为testuser,认证参数与加密参数都有填充,data部分也是同样加密。

参考:
什么是SNMP - 华为 (huawei.com)
AR100-S V300R003 MIB参考 - 华为 (huawei.com)
SNMP library for Python — SNMP library for Python 4.4 documentation (pysnmp.readthedocs.io)

如何在不使用 pip 的情况下在 Linux 终端中查看 pysnmp 版本

【中文标题】如何在不使用 pip 的情况下在 Linux 终端中查看 pysnmp 版本【英文标题】:How to see the pysnmp version in Linux terminal without using pip 【发布时间】:2016-08-22 21:34:14 【问题描述】:

我已经在 Linux 中安装了 pysnmp 模块。

我想知道安装了哪个版本的 pysnmp。如何通过 Linux 终端查看 pysnmp 版本..? pysnmp -V 无效。

我的 linux 中没有安装 pip,所以pip show pysnmp 也无法正常工作..

【问题讨论】:

How to check version of python modules?的可能重复 【参考方案1】:

您还可以从 Python 解释器中检查模块的版本:

>>> import pysnmp
>>> pysnmp.__version__
'4.3.2'

要从 shell 执行此操作,只需通过 python -c 执行即可。

$ python -c "import pysnmp; print(pysnmp.__version__)"
'4.3.2'

这会在从 shell 启动 Python 解释器时执行一个字符串,让您无需编写新的脚本文件或加载交互式解释器即可轻松运行短命令。

【讨论】:

【参考方案2】:

你可以试试

pip show pysnmp 

或者你想要的任何版本

pip show YOUR_PACKAGE_NAME | grep Version

【讨论】:

我的 linux 中没有安装 pip。所以它无法识别 pip 命令.. 嗨@SabinChacko,这很有趣。那你如何安装你的版本呢? 我手动安装了库.. 从 sourceforge.net 下载 zip,解压缩并最后执行 python setup.py install .. 我知道版本,因为我手动安装了它,但我需要显示它。 . omg @SabinChacko 老办法... :) 尝试使用 pip 进行下一次安装。既省时又省力。 是的.. 我不知道.. 有时我们需要不惜一切代价完成工作.. :p 最奇怪的事实是我正在为一个 php 程序安装它.. :p

以上是关于Python网络编程6-使用Pysnmp实现简单网管的主要内容,如果未能解决你的问题,请参考以下文章

python pysnmp使用

Python 封装SNMP调用接口

如何在不使用 pip 的情况下在 Linux 终端中查看 pysnmp 版本

使用 Pysnmp 从代理端动态更新 SNMP 表

使用带有选项 privProtocol=usm3DESEDEPrivProtocol 的 pysnmp 时出错

asyncio "任务已被破坏,但它正在等待处理!"在 pysnmp 示例程序中