一、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所示:
圖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所示:
審核編輯:劉清
-
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論