0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Python PySNMP模块获取设备指标呢?

网络技术干货圈 来源:网络技术干货圈 2024-01-12 13:59 次阅读

一、PySNMP模块介绍:

PySNMP 是一个跨平台的纯Python SNMP 引擎实现。它具有功能齐全的 SNMP 引擎,能够充当代理/管理器/代理角色,通过 IPv4/IPv6 和其他网络传输传输 SNMP v1/v2c/v3 协议版本。目前,使用较多的是SNMP v3和v2c版本。三个版本的区别如下:

SNMPv1:SNMP的第一个版本,它提供了一种监控和管理计算机网络的系统方法,它基于团体名认证,安全性较差,且返回报文的错误码也较少。它在RFC 1155和RFC 1157中定义。

SNMPv2c:第二个版本SNMPv2c引入了GetBulk和Inform操作,支持更多的标准错误码信息,支持更多的数据类型。它在RFC 1901,RFC 1905和RFC 1906中定义。

SNMPv3:鉴于SNMPv2c在安全性方面没有得到改善,IETF颁布了SNMPv3版本,提供了基于USM(User Security Module)的认证加密和基于VACM(View-based Access Control Model)的访问控制,是迄今为止最安全的版本。SNMPv3在RFC 1905,RFC 1906,RFC 2571,RFC 2572,RFC 2574和RFC 2575中定义。

模块官网地址:

https://pysnmp.readthedocs.io/en/latest/

二、SNMP v2c实验

实验目的: 通过PySNMP Version 4.4.12 SNMP v2c收集Cisco ASAv防火墙的各项指标。

实验设备: ASAv 992,IP地址10.1.102.254。

实验步骤:

首先对ASAv设备进行初始化配置:

interfaceGigabitEthernet0/0
nameifinside
security-level100
ipaddress10.1.102.254255.255.255.0
noshutdown

接下来配置SNMPv2,允许来自inside区域的10.1.1.1设备进行SNMP访问,只读community值为tcpipro。

snmp-serverenable
snmp-serverhostinside10.1.1.1communitytcpipro
snmp-servercommunitytcpipro

配置完成后,通过如下Python代码进行测试:

frompysnmp.hlapiimport*


defsnmpv2_get(ip,community,oid,port=161):
#varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIBvariable)
errorindication,errorstatus,errorindex,varbinds=next(
getCmd(SnmpEngine(),
CommunityData(community),#配置community
UdpTransportTarget((ip,port)),#配置目的地址和端口号
ContextData(),
ObjectType(ObjectIdentity(oid))#读取的OID
)
)
#错误处理
iferrorindication:
print(errorindication)
eliferrorstatus:
print('%sat%s'%(
errorstatus,
errorindexandvarbinds[int(errorindex)-1][0]or'?'
)
)
#如果返回结果有多行,需要拼接后返回
result=""
forvarBindinvarbinds:
result=result+varBind.prettyPrint()#返回结果!
#返回的为一个元组,OID与字符串结果
returnresult.split("=")[0].strip(),result.split("=")[1].strip()


if__name__=="__main__":
ASA_oid={"CPUTotal1min":"1.3.6.1.4.1.9.9.109.1.1.1.1.7.1","MemoryUsed":"1.3.6.1.4.1.9.9.48.1.1.1.5.1",
"MemoryFree":"1.3.6.1.4.1.9.9.48.1.1.1.6.1","ifInOctets-G0-Outside":"1.3.6.1.2.1.2.2.1.10.3",
"ifOutOctets-G0-Outside":"1.3.6.1.2.1.2.2.1.16.3","ifInOctets-G1-Inside":"1.3.6.1.2.1.2.2.1.10.4",
"ifOutOctets-G1-Inside":"1.3.6.1.2.1.2.2.1.16.4","TotalIPSec":"1.3.6.1.4.1.9.9.392.1.3.26.0",
"L2LIPSec":"1.3.6.1.4.1.9.9.392.1.3.29.0","AnyConnectVPN":"1.3.6.1.4.1.9.9.392.1.3.35.0",
"WebVPN":"1.3.6.1.4.1.9.9.392.1.3.38.0"}

forkey,valueinASA_oid.items():
try:
print(key+':',snmpv2_get("10.1.102.254","tcpipro",value))
exceptExceptionase:
print(e)

Tips:要获取特定 ASA 的受支持 SNMP MIB 和 OID 的列表,请输入以下命令:show snmp-server oidlist进行查看。或者,我们可以通过一些SNMP测试软件进行查询,例如ByteSphere OidView。最终python测试结果如图1所示:

cfa6d234-b10e-11ee-8b88-92fbcf53809c.png

图1 SNMP v2c测试结果

三、SNMP v3实验

实验目的: 通过PySNMP的SNMP v3收集Cisco ASAv防火墙的各项指标。

实验设备: ASAv 992,IP地址10.1.102.254。

实验步骤:

完成ASA接口初始化配置后,进行SNMP v3的配置,如下所示:

snmp-serverenable
snmp-servergroupsnmpgroupv3priv
snmp-serveruseradminsnmpgroupv3authshaCisc0123privaes256Cisc0123
snmp-serverhostinside10.1.1.1version3admin

SNMP v3配置中需要注意的是,首先我们创建了一个SNMP v3认证group snmpgroup,在这个group的用户数据需要同时进行身份验证和加密(priv)。其中,auth 关键字可启用数据包身份验证。noauth 关键字表示未在使用数据包身份验证或加密。priv 关键字可启用数据包加密和身份验证。auth 或 priv 关键字不存在默认值。

接下来,我们在该组内创建了用户admin,使用的SHA作为哈希算法,密钥是Cisc0123;加密算法则使用的是AES256,密钥同样是Cisc0123。最后,与SNMP v2c相似,我们需要配置允许inside区域10.1.1.1 IP地址的admin用户使用SNMP v3访问该ASA设备。

完成SNMP v3配置后,我们可以通过如下SNMPv3 Python代码进行测试:

frompysnmp.hlapiimport*


defsnmpv3_get(ip,oid,username,authkey,privkey,authprotocol,privprotocol,port=161):
#通过数字映射,对应SNMPv3使用的认证和加密算法
auth_map={'0':usmNoAuthProtocol,'1':usmHMACSHAAuthProtocol,'2':usmHMAC128SHA224AuthProtocol,
'3':usmHMAC192SHA256AuthProtocol,'4':usmHMAC256SHA384AuthProtocol,
'5':usmHMAC384SHA512AuthProtocol}

priv_map={'0':usmNoPrivProtocol,'1':usmAesCfb128Protocol,
'2':usmAesCfb192Protocol,'3':usmAesCfb256Protocol}

#varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIBvariable)
errorindication,errorstatus,errorindex,varbinds=next(
getCmd(SnmpEngine(),
UsmUserData(userName=username,authKey=authkey,privKey=privkey,
authProtocol=auth_map.get(authprotocol),
privProtocol=priv_map.get(privprotocol)),
UdpTransportTarget((ip,port)),#配置目的地址和端口号
ContextData(),
ObjectType(ObjectIdentity(oid))#读取的OID
)
)
#错误处理
iferrorindication:
print(errorindication)
eliferrorstatus:
print('%sat%s'%(
errorstatus,
errorindexandvarbinds[int(errorindex)-1][0]or'?'
)
)
#如果返回结果有多行,需要拼接后返回
result=""
forvarBindinvarbinds:
result=result+varBind.prettyPrint()#返回结果!
#返回的为一个元组,OID与字符串结果
returnresult.split("=")[0].strip(),result.split("=")[1].strip()


if__name__=="__main__":
ASA_oid={"CPUTotal1min":"1.3.6.1.4.1.9.9.109.1.1.1.1.7.1","MemoryUsed":"1.3.6.1.4.1.9.9.48.1.1.1.5.1",
"MemoryFree":"1.3.6.1.4.1.9.9.48.1.1.1.6.1","ifInOctets-G0-Outside":"1.3.6.1.2.1.2.2.1.10.3",
"ifOutOctets-G0-Outside":"1.3.6.1.2.1.2.2.1.16.3","ifInOctets-G1-Inside":"1.3.6.1.2.1.2.2.1.10.4",
"ifOutOctets-G1-Inside":"1.3.6.1.2.1.2.2.1.16.4","TotalIPSec":"1.3.6.1.4.1.9.9.392.1.3.26.0",
"L2LIPSec":"1.3.6.1.4.1.9.9.392.1.3.29.0","AnyConnectVPN":"1.3.6.1.4.1.9.9.392.1.3.35.0",
"WebVPN":"1.3.6.1.4.1.9.9.392.1.3.38.0"}

forkey,valueinASA_oid.items():
try:
print(key+':',snmpv3_get("10.1.102.254",value,'admin','Cisc0123','Cisc0123','1','3'))
exceptExceptionase:
print(e)

需要注意的是,这里我们对SNMP v3的加密和HASH算法进行了映射,后续只需要传入相关的数字编号,即可设置SNMP v3的安全参数。最终的测试结果如图2所示:

cfcca982-b10e-11ee-8b88-92fbcf53809c.png







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SNMP
    +关注

    关注

    0

    文章

    85

    浏览量

    29744
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7382

原文标题:高级网络工程师必备技能:使用Python PySNMP模块获取设备指标

文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问使用普通运放时如何获取运放的增益误差和增益非线性这些指标

    AD8221这类的仪表放大器数据手册中会有闭环的增益误差和增益非线性度这样的指标,但是像OP2177之类的普通运放的数据手册中没有这些参数,我在使用普通运放时如何获取运放的增益误差和增益非线性这样的指标
    发表于 07-27 06:26

    Python获取文件目录函数模块方法

    Python获取文件夹和文件的路径
    发表于 09-11 08:00

    Python入门之36常用第三方模块获取系统信息psutil

    Python入门】36常用第三方模块获取系统信息psutil
    发表于 07-16 06:31

    使用普通运放时如何获取运放的增益误差和增益非线性这样的指标

    AD8221这类的仪表放大器数据手册中会有闭环的增益误差和增益非线性度这样的指标,但是像OP2177之类的普通运放的数据手册中没有这些参数,我在使用普通运放时如何获取运放的增益误差和增益非线性这样的指标
    发表于 11-17 06:58

    解析Kubernetes监控指标获取方式对比

    。metric-server/heapster是从api-server中获取CPU、内存使用率这种监控指标,并把他们发送给存储后端,如InfluxDB或云厂商,他当前的核心作用是:为HPA等组件提供决策指标支持
    的头像 发表于 09-26 10:45 1456次阅读

    python包、模块和库是什么

    1. 模块 以 .py 为后缀的文件,我们称之为 模块,英文名 Module。 模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码分配到一个
    的头像 发表于 03-09 16:47 2318次阅读

    Python模块Addict的安装与使用

    Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属性来获取,也可以使用属性进行设置。
    的头像 发表于 06-21 16:14 2302次阅读

    使用Python和PHP获取天气信息

    电子发烧友网站提供《使用Python和PHP获取天气信息.zip》资料免费下载
    发表于 01-04 11:03 1次下载
    使用<b class='flag-5'>Python</b>和PHP<b class='flag-5'>获取</b>天气信息

    Python-模块与包

    模块Python 程序架构的一个核心概念
    的头像 发表于 02-16 14:55 767次阅读
    <b class='flag-5'>Python</b>-<b class='flag-5'>模块</b>与包

    python模块属性及字符串导入模块介绍

    python可以通过点号或字典,获取模块属性。 已经导入的模块存放在sys.modules字典,通过getattr获取
    的头像 发表于 02-21 11:27 741次阅读

    简述python模块import和from及all

    python指定导入目录路径,称为包导入。 通过import和from导入包模块。 通过**all**指定导入的模块和导入的模块属性。 ## 1.1
    的头像 发表于 02-21 14:20 1246次阅读

    浅析python模块创建和from及import使用

    python模块通过用python程序编写的.py文件即可创建,通过from及import语句导入模块来使用。
    的头像 发表于 02-21 14:44 845次阅读

    Python中telnetlib模块的基本使用

    telnetlib 是 Python 标准库中的一个模块,它提供了 Telnet 协议的客户端功能。使用 telnetlib 模块,我们可以在 Python 中编写脚本来自动化 Tel
    的头像 发表于 05-04 14:27 8067次阅读

    yfinance:获取数据的Python第三方模块

    yfinance 是一个使用 Yahoo! 获取数据的 Python 第三方模块。它支持获取最细到1分钟级的历史数据及股票基本面数据,是免费获得美股分钟级及以上粒度数据的不二之选。 1
    的头像 发表于 10-21 14:32 2777次阅读

    python如何导入模块

    Python是一种强大的编程语言,它支持模块化编程,使得开发者可以将代码分解为可重用且独立的模块模块是一个包含函数、类和变量等定义的文件,我们可以使用import语句将这些
    的头像 发表于 11-22 14:46 946次阅读