秦子實



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