秦子實(shí)
摘要:隨著企業(yè)內(nèi)網(wǎng)規(guī)模的擴(kuò)大,內(nèi)網(wǎng)接入終端逐漸增多,終端接入控制業(yè)務(wù)也越發(fā)繁雜,導(dǎo)致企業(yè)信息部門的日常業(yè)務(wù)存在大量重復(fù)性工作,且效率較低易出錯(cuò)。因此,企業(yè)信息部門需要一種簡(jiǎn)單的自動(dòng)化網(wǎng)管方法,能夠代替人工自動(dòng)管理IP、MAC資源等網(wǎng)絡(luò)資源,并能夠進(jìn)行端口MAC綁定等準(zhǔn)入業(yè)務(wù)。本文設(shè)計(jì)并實(shí)現(xiàn)了一種基于Pysnmp的交換設(shè)備管理方法,通過SNMP協(xié)議讀取、設(shè)置交換機(jī)配置,以達(dá)到自動(dòng)化管理交換設(shè)備的目的。該方法具有依賴庫少、代碼編寫簡(jiǎn)單、執(zhí)行效率高等特點(diǎn),適合局域網(wǎng)客制化開發(fā)與部署。
關(guān)鍵詞:網(wǎng)絡(luò)運(yùn)維;SNMP;Python
中圖分類號(hào):TP393? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)08-0047-02
1 概述
在企業(yè)內(nèi)部辦公局域網(wǎng),尤其是物理隔離的內(nèi)網(wǎng)中,通常需要信息部門進(jìn)行終端準(zhǔn)入,以保護(hù)內(nèi)網(wǎng)信息安全。隨著內(nèi)網(wǎng)規(guī)模的擴(kuò)大,終端接入準(zhǔn)入、接入點(diǎn)變更、設(shè)備變更、設(shè)備注銷等業(yè)務(wù)也大量增加,此類業(yè)務(wù)具有工作量大、重復(fù)性高、人工易出錯(cuò)且步驟固定等特點(diǎn),適合通過腳本自動(dòng)化管理。由于企業(yè)內(nèi)網(wǎng)較為封閉的特點(diǎn),自動(dòng)化腳本不應(yīng)有較多的庫依賴關(guān)系,同時(shí)應(yīng)該方便信息部門開發(fā)部署。此外,對(duì)于大型辦公內(nèi)網(wǎng),腳本應(yīng)該具有較高的執(zhí)行效率。本文針對(duì)該場(chǎng)景,基于Pysnmp設(shè)計(jì)了一種易于開發(fā)方便部署的方法。
2 Pysnmp安裝
Pysnmp的依賴庫僅有四個(gè),依賴關(guān)系如下圖1所示。
這四個(gè)依賴庫為純Python庫,沒有平臺(tái)編譯依賴,可以直接使用pypi上提供的wheel文件安裝,下載完成后在內(nèi)網(wǎng)環(huán)境按照ply、jinja2、pysmi、pyasn1、pysnmp的順序安裝即可:
或使用github上提供的源碼,按照ply、jinja2、pysmi、pyasn1、pysnmp的順序,通過在源碼根目錄中運(yùn)行“python setup.py”,從源碼安裝依賴。
3 系統(tǒng)設(shè)計(jì)
3.1 獲取數(shù)據(jù)
對(duì)于企業(yè)內(nèi)網(wǎng)站準(zhǔn)入業(yè)務(wù)而言,準(zhǔn)入控制僅需要網(wǎng)關(guān)交換機(jī)中的ARP數(shù)據(jù),即IP到MAC的映射關(guān)系。批量獲取此類數(shù)據(jù)需要使用“nextCmd”函數(shù):其中在第二個(gè)參數(shù)使用“CommunityData”對(duì)象生成團(tuán)體字,在第三個(gè)參數(shù)使用“UdpTransportTarget”生成目標(biāo)對(duì)象指定交換機(jī)snmp的IP與端口:
nextCmd函數(shù)返回一個(gè)生成器對(duì)象,可以直接使用for循環(huán)遍歷:
3.2 異常數(shù)據(jù)
for循環(huán)中的四個(gè)參數(shù)在循環(huán)體中分別用于:
snmp引擎(SnmpEngine)出現(xiàn)異常時(shí),errorIndication不為空,可以用于拋出異?;蛴涗浗粨Q設(shè)備級(jí)的錯(cuò)誤日志;
snmp代理(snmpAgent)產(chǎn)生異常數(shù)據(jù)時(shí),errorStatus不為空且errorIndex有用于指定錯(cuò)誤所在的索引值,可以用于拋出異?;蛴涗浗粨Q機(jī)上報(bào)的異常數(shù)據(jù)。
若前三個(gè)變量均為空,則可以通過varBinds取回正常數(shù)據(jù),異常處理通常編寫如下:
3.3 ARP數(shù)據(jù)處理
在交換機(jī)返回的SNMP數(shù)據(jù)中,IP-MAC映射數(shù)據(jù)的oid為“.1.3.6.1.2.1.3.1.1.2”(即“獲取數(shù)據(jù)”例子中一節(jié)“ObjectIdentity”中的參數(shù))。在請(qǐng)求該oid數(shù)據(jù)后,會(huì)返回從該oid開始的UDP中的原始結(jié)果,每個(gè)條目包含一個(gè)ObjectType對(duì)象表示oid名稱,以及一個(gè)OctetString對(duì)象表示oid下的值。原始數(shù)據(jù)包含非utf-8編碼和十六進(jìn)制數(shù)據(jù),不方便直接處理,因此可以使用這兩個(gè)對(duì)象的“prettyPrint”輸出方便處理的信息。
使用nextCmd函數(shù)讀取該oid數(shù)據(jù)時(shí),對(duì)應(yīng)調(diào)用的snmp“GETBULK”命令,即批量獲取“下一個(gè)指定oid相關(guān)”數(shù)據(jù),返回的數(shù)據(jù)有順序。由于nextCmd返回從指定的oid開始的所有oid數(shù)據(jù),本文利用數(shù)據(jù)的排序特征,僅獲取.1.3.6.1.2.1.3.1.1.2集合中的數(shù)據(jù),當(dāng)snmp代理接收到第一條不屬于.1.3.6.1.2.1.3.1.1.2的數(shù)據(jù)時(shí),立即停止接收,此舉能夠大幅縮短數(shù)據(jù)讀取時(shí)間(經(jīng)測(cè)試在華為5700系列交換機(jī)上,接收IP-MAC映射數(shù)據(jù)僅耗時(shí)約1秒,而接收所有數(shù)據(jù)將耗時(shí)數(shù)十秒)。接收varBinds并判斷oid是否結(jié)束的示例寫法:
經(jīng)過這一步處理,即可獲取IP-MAC映射列表,本文以列表形式輸出為例,此外也可以通過字典形式輸出,可以用于數(shù)據(jù)去重:
可以看出,每條數(shù)據(jù)的第一個(gè)元素為mib字符串,可以很容易地將IP數(shù)據(jù)分離出來,第二個(gè)成員即為MAC數(shù)據(jù)。這樣一來,可以得到IP-MAC數(shù)據(jù)的關(guān)系,進(jìn)而通過dict或set等數(shù)據(jù)結(jié)構(gòu)進(jìn)行去重,將多個(gè)網(wǎng)關(guān)的ARP信息進(jìn)行整合,即可得到局域網(wǎng)的整體ARP信息。
3.4 異步I/O加速
在交換機(jī)較多的場(chǎng)景中,若順序執(zhí)行上述步驟,依次從每個(gè)交換機(jī)中獲取數(shù)據(jù),可能會(huì)需要較長(zhǎng)時(shí)間。Pysnmp還提供了異步I/O版本的UdpTransportTarget:
只需要將nextCmd中的第二個(gè)參數(shù)替換為這個(gè)asyncio版本的即可,之后就可以使用async/await聲明函數(shù),并使用Python異步框架asyncio中的各種調(diào)度器異步執(zhí)行了。經(jīng)測(cè)試,使用同步函數(shù)獲取1臺(tái)交換機(jī)的ARP數(shù)據(jù)約耗時(shí)1秒,使用同步函數(shù)順序獲取10臺(tái)交換機(jī)數(shù)據(jù)越需要15秒,同步函數(shù)的耗時(shí)正比于交換機(jī)數(shù)量;而換用異步函數(shù)獲取10臺(tái)交換機(jī)約需要2秒,而交換機(jī)繼續(xù)增多的情況下,耗時(shí)也并未顯著增加。
4 結(jié)束語
本文介紹了使用Pysnmp獲取交換機(jī)IP-MAC映射數(shù)據(jù)的方法,可以方便地實(shí)現(xiàn)自動(dòng)化準(zhǔn)入管理。該方法依賴庫少,便于內(nèi)網(wǎng)部署,對(duì)于交換機(jī)數(shù)量較多的大型局域網(wǎng),可以使用異步I/O版本的函數(shù),可以較大幅度地縮短函數(shù)的等待時(shí)間,是一種方便部署、性能優(yōu)良的網(wǎng)絡(luò)管理方法。
【通聯(lián)編輯:梁書】