0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Python PySNMP模塊獲取設(shè)備指標(biāo)呢?

網(wǎng)絡(luò)技術(shù)干貨圈 ? 來(lái)源:網(wǎng)絡(luò)技術(shù)干貨圈 ? 2024-01-12 13:59 ? 次閱讀

一、PySNMP模塊介紹:

PySNMP 是一個(gè)跨平臺(tái)的純Python SNMP 引擎實(shí)現(xiàn)。它具有功能齊全的 SNMP 引擎,能夠充當(dāng)代理/管理器/代理角色,通過(guò) IPv4/IPv6 和其他網(wǎng)絡(luò)傳輸傳輸 SNMP v1/v2c/v3 協(xié)議版本。目前,使用較多的是SNMP v3和v2c版本。三個(gè)版本的區(qū)別如下:

SNMPv1:SNMP的第一個(gè)版本,它提供了一種監(jiān)控和管理計(jì)算機(jī)網(wǎng)絡(luò)的系統(tǒng)方法,它基于團(tuán)體名認(rèn)證,安全性較差,且返回報(bào)文的錯(cuò)誤碼也較少。它在RFC 1155和RFC 1157中定義。

SNMPv2c:第二個(gè)版本SNMPv2c引入了GetBulk和Inform操作,支持更多的標(biāo)準(zhǔn)錯(cuò)誤碼信息,支持更多的數(shù)據(jù)類(lèi)型。它在RFC 1901,RFC 1905和RFC 1906中定義。

SNMPv3:鑒于SNMPv2c在安全性方面沒(méi)有得到改善,IETF頒布了SNMPv3版本,提供了基于USM(User Security Module)的認(rèn)證加密和基于VACM(View-based Access Control Model)的訪(fǎng)問(wèn)控制,是迄今為止最安全的版本。SNMPv3在RFC 1905,RFC 1906,RFC 2571,RFC 2572,RFC 2574和RFC 2575中定義。

模塊官網(wǎng)地址:

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

二、SNMP v2c實(shí)驗(yàn)

實(shí)驗(yàn)?zāi)康模?/strong> 通過(guò)PySNMP Version 4.4.12 SNMP v2c收集Cisco ASAv防火墻的各項(xiàng)指標(biāo)。

實(shí)驗(yàn)設(shè)備: ASAv 992,IP地址10.1.102.254。

實(shí)驗(yàn)步驟:

首先對(duì)ASAv設(shè)備進(jìn)行初始化配置:

interfaceGigabitEthernet0/0
nameifinside
security-level100
ipaddress10.1.102.254255.255.255.0
noshutdown

接下來(lái)配置SNMPv2,允許來(lái)自inside區(qū)域的10.1.1.1設(shè)備進(jìn)行SNMP訪(fǎng)問(wèn),只讀community值為tcpipro。

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

配置完成后,通過(guò)如下Python代碼進(jìn)行測(cè)試:

frompysnmp.hlapiimport*


defsnmpv2_get(ip,community,oid,port=161):
#varBinds是列表,列表中的每個(gè)元素的類(lèi)型是ObjectType(該類(lèi)型的對(duì)象表示MIBvariable)
errorindication,errorstatus,errorindex,varbinds=next(
getCmd(SnmpEngine(),
CommunityData(community),#配置community
UdpTransportTarget((ip,port)),#配置目的地址和端口號(hào)
ContextData(),
ObjectType(ObjectIdentity(oid))#讀取的OID
)
)
#錯(cuò)誤處理
iferrorindication:
print(errorindication)
eliferrorstatus:
print('%sat%s'%(
errorstatus,
errorindexandvarbinds[int(errorindex)-1][0]or'?'
)
)
#如果返回結(jié)果有多行,需要拼接后返回
result=""
forvarBindinvarbinds:
result=result+varBind.prettyPrint()#返回結(jié)果!
#返回的為一個(gè)元組,OID與字符串結(jié)果
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 的列表,請(qǐng)輸入以下命令:show snmp-server oidlist進(jìn)行查看?;蛘?,我們可以通過(guò)一些SNMP測(cè)試軟件進(jìn)行查詢(xún),例如ByteSphere OidView。最終python測(cè)試結(jié)果如圖1所示:

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

圖1 SNMP v2c測(cè)試結(jié)果

三、SNMP v3實(shí)驗(yàn)

實(shí)驗(yàn)?zāi)康模?/strong> 通過(guò)PySNMP的SNMP v3收集Cisco ASAv防火墻的各項(xiàng)指標(biāo)。

實(shí)驗(yàn)設(shè)備: ASAv 992,IP地址10.1.102.254。

實(shí)驗(yàn)步驟:

完成ASA接口初始化配置后,進(jìn)行SNMP v3的配置,如下所示:

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

SNMP v3配置中需要注意的是,首先我們創(chuàng)建了一個(gè)SNMP v3認(rèn)證group snmpgroup,在這個(gè)group的用戶(hù)數(shù)據(jù)需要同時(shí)進(jìn)行身份驗(yàn)證和加密(priv)。其中,auth 關(guān)鍵字可啟用數(shù)據(jù)包身份驗(yàn)證。noauth 關(guān)鍵字表示未在使用數(shù)據(jù)包身份驗(yàn)證或加密。priv 關(guān)鍵字可啟用數(shù)據(jù)包加密和身份驗(yàn)證。auth 或 priv 關(guān)鍵字不存在默認(rèn)值。

接下來(lái),我們?cè)谠摻M內(nèi)創(chuàng)建了用戶(hù)admin,使用的SHA作為哈希算法,密鑰是Cisc0123;加密算法則使用的是AES256,密鑰同樣是Cisc0123。最后,與SNMP v2c相似,我們需要配置允許inside區(qū)域10.1.1.1 IP地址的admin用戶(hù)使用SNMP v3訪(fǎng)問(wèn)該ASA設(shè)備。

完成SNMP v3配置后,我們可以通過(guò)如下SNMPv3 Python代碼進(jìn)行測(cè)試:

frompysnmp.hlapiimport*


defsnmpv3_get(ip,oid,username,authkey,privkey,authprotocol,privprotocol,port=161):
#通過(guò)數(shù)字映射,對(duì)應(yīng)SNMPv3使用的認(rèn)證和加密算法
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是列表,列表中的每個(gè)元素的類(lèi)型是ObjectType(該類(lèi)型的對(duì)象表示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)),#配置目的地址和端口號(hào)
ContextData(),
ObjectType(ObjectIdentity(oid))#讀取的OID
)
)
#錯(cuò)誤處理
iferrorindication:
print(errorindication)
eliferrorstatus:
print('%sat%s'%(
errorstatus,
errorindexandvarbinds[int(errorindex)-1][0]or'?'
)
)
#如果返回結(jié)果有多行,需要拼接后返回
result=""
forvarBindinvarbinds:
result=result+varBind.prettyPrint()#返回結(jié)果!
#返回的為一個(gè)元組,OID與字符串結(jié)果
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)

需要注意的是,這里我們對(duì)SNMP v3的加密和HASH算法進(jìn)行了映射,后續(xù)只需要傳入相關(guān)的數(shù)字編號(hào),即可設(shè)置SNMP v3的安全參數(shù)。最終的測(cè)試結(jié)果如圖2所示:

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







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SNMP
    +關(guān)注

    關(guān)注

    0

    文章

    82

    瀏覽量

    29695
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84297
  • Hash算法
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    7379

原文標(biāo)題:高級(jí)網(wǎng)絡(luò)工程師必備技能:使用Python PySNMP模塊獲取設(shè)備指標(biāo)

文章出處:【微信號(hào):網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號(hào):網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)使用普通運(yùn)放時(shí)如何獲取運(yùn)放的增益誤差和增益非線(xiàn)性這些指標(biāo)?

    AD8221這類(lèi)的儀表放大器數(shù)據(jù)手冊(cè)中會(huì)有閉環(huán)的增益誤差和增益非線(xiàn)性度這樣的指標(biāo),但是像OP2177之類(lèi)的普通運(yùn)放的數(shù)據(jù)手冊(cè)中沒(méi)有這些參數(shù),我在使用普通運(yùn)放時(shí)如何獲取運(yùn)放的增益誤差和增益非線(xiàn)性這樣的指標(biāo)
    發(fā)表于 07-27 06:26

    Python獲取文件目錄函數(shù)模塊方法

    Python獲取文件夾和文件的路徑
    發(fā)表于 09-11 08:00

    Python入門(mén)之36常用第三方模塊獲取系統(tǒng)信息psutil

    Python入門(mén)】36常用第三方模塊獲取系統(tǒng)信息psutil
    發(fā)表于 07-16 06:31

    使用普通運(yùn)放時(shí)如何獲取運(yùn)放的增益誤差和增益非線(xiàn)性這樣的指標(biāo)?

    AD8221這類(lèi)的儀表放大器數(shù)據(jù)手冊(cè)中會(huì)有閉環(huán)的增益誤差和增益非線(xiàn)性度這樣的指標(biāo),但是像OP2177之類(lèi)的普通運(yùn)放的數(shù)據(jù)手冊(cè)中沒(méi)有這些參數(shù),我在使用普通運(yùn)放時(shí)如何獲取運(yùn)放的增益誤差和增益非線(xiàn)性這樣的指標(biāo)
    發(fā)表于 11-17 06:58

    解析Kubernetes監(jiān)控指標(biāo)獲取方式對(duì)比

    。metric-server/heapster是從api-server中獲取CPU、內(nèi)存使用率這種監(jiān)控指標(biāo),并把他們發(fā)送給存儲(chǔ)后端,如InfluxDB或云廠(chǎng)商,他當(dāng)前的核心作用是:為HPA等組件提供決策指標(biāo)支持
    的頭像 發(fā)表于 09-26 10:45 ?1414次閱讀

    python包、模塊和庫(kù)是什么

    1. 模塊 以 .py 為后綴的文件,我們稱(chēng)之為 模塊,英文名 Module。 模塊讓你能夠有邏輯地組織你的 Python 代碼段,把相關(guān)的代碼分配到一個(gè)
    的頭像 發(fā)表于 03-09 16:47 ?2274次閱讀

    Python模塊Addict的安裝與使用

    Addit 是一個(gè)Python模塊,除了提供標(biāo)準(zhǔn)的字典語(yǔ)法外,Addit 生成的字典的值既可以使用屬性來(lái)獲取,也可以使用屬性進(jìn)行設(shè)置。
    的頭像 發(fā)表于 06-21 16:14 ?2191次閱讀

    使用Python和PHP獲取天氣信息

    電子發(fā)燒友網(wǎng)站提供《使用Python和PHP獲取天氣信息.zip》資料免費(fèi)下載
    發(fā)表于 01-04 11:03 ?1次下載
    使用<b class='flag-5'>Python</b>和PHP<b class='flag-5'>獲取</b>天氣信息

    Python-模塊與包

    模塊Python 程序架構(gòu)的一個(gè)核心概念
    的頭像 發(fā)表于 02-16 14:55 ?724次閱讀
    <b class='flag-5'>Python</b>-<b class='flag-5'>模塊</b>與包

    python模塊屬性及字符串導(dǎo)入模塊介紹

    python可以通過(guò)點(diǎn)號(hào)或字典,獲取模塊屬性。 已經(jīng)導(dǎo)入的模塊存放在sys.modules字典,通過(guò)getattr獲取
    的頭像 發(fā)表于 02-21 11:27 ?696次閱讀

    簡(jiǎn)述python模塊import和from及all

    python指定導(dǎo)入目錄路徑,稱(chēng)為包導(dǎo)入。 通過(guò)import和from導(dǎo)入包模塊。 通過(guò)**all**指定導(dǎo)入的模塊和導(dǎo)入的模塊屬性。 ## 1.1
    的頭像 發(fā)表于 02-21 14:20 ?1191次閱讀

    淺析python模塊創(chuàng)建和from及import使用

    python模塊通過(guò)用python程序編寫(xiě)的.py文件即可創(chuàng)建,通過(guò)from及import語(yǔ)句導(dǎo)入模塊來(lái)使用。
    的頭像 發(fā)表于 02-21 14:44 ?769次閱讀

    Python中telnetlib模塊的基本使用

    telnetlib 是 Python 標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,它提供了 Telnet 協(xié)議的客戶(hù)端功能。使用 telnetlib 模塊,我們可以在 Python 中編寫(xiě)腳本來(lái)自動(dòng)化 Tel
    的頭像 發(fā)表于 05-04 14:27 ?7751次閱讀

    yfinance:獲取數(shù)據(jù)的Python第三方模塊

    yfinance 是一個(gè)使用 Yahoo! 獲取數(shù)據(jù)的 Python 第三方模塊。它支持獲取最細(xì)到1分鐘級(jí)的歷史數(shù)據(jù)及股票基本面數(shù)據(jù),是免費(fèi)獲得美股分鐘級(jí)及以上粒度數(shù)據(jù)的不二之選。 1
    的頭像 發(fā)表于 10-21 14:32 ?2260次閱讀

    python如何導(dǎo)入模塊

    Python是一種強(qiáng)大的編程語(yǔ)言,它支持模塊化編程,使得開(kāi)發(fā)者可以將代碼分解為可重用且獨(dú)立的模塊模塊是一個(gè)包含函數(shù)、類(lèi)和變量等定義的文件,我們可以使用import語(yǔ)句將這些
    的頭像 發(fā)表于 11-22 14:46 ?852次閱讀