武 一,吳 桐
(河北工業大學信息工程學院,天津 300401)
隨著網絡的迅速發展,數據中心對交換機的傳輸速度要求越來越高,網絡從百兆網卡發展到現在40G的光模塊通信。交換機上需要支持的協議也越來越多,而這些協議直接的通信和用戶配置界面等也越來越復雜。大部分三層交換機使用的代碼不開源,很難進行完全個性化的配置和修改。
XORP是一個開放的網絡平臺,支持OSPF,RIP的BGP,OLSR協議,PIM,IGMP(組播)和其他路由協議。大多數協議支持IPv4和IPv6(如適用)。XORP的首要目標是要成為一個開放式平臺替代專有和封閉的網絡產品。XORP的開放性使得任何個人或者單位可以免費使用其源代碼進行個性的配置以及更改。
簡單網絡管理協議(Simple Network Management Protocol,SNMP)是由簡單網關監控協議(SGMP)發展而來的,其同SGMP的主要區別是加入了符合Internet定義的SMI和MIB體系結構[1]。SNMP的目標是管理互聯網或者數據中心中各設備的鏈路狀態以及設備硬件狀態。現在SNMP協議發展到版本3,其增強了SNMP協議的安全性能,包括封包加密以及認證等。可以使用SNMP進行網絡管理,需要管理基站,管理代理,管理信息庫和網絡管理工具等[2]。
本設計主要研究了在XORP平臺上SNMP協議的實現,包括配置XORP中添加SNMP的XRL、SNMP協議參數的用戶命令、SNMP協議的移植以及MIB庫的添加等。
XORP是一個完全開源的網絡平臺,支持多種協議,提供對IPv4和IPv6的支持。由于其開放性,因此方便用戶對其進行剪裁以及根據本身硬件進行優化。其中重要的是rtrmgr(XORP Router Manager Process),XRL接口的解析和模板的解析都是由其完成,CLI(Command Line Interface)用戶命令行向用戶提供設備配置命令行,其負責完成命令樹文件的語法解析以及命令樹和配置樹的生成、不同用戶之間的同步等。XORP進程的結構如圖1所示。

圖1 XORP結構圖
在XORP中,XRL接口是各個模塊通信的接口,XORP默認的通信接口定義文件是XIF文件,在編譯過程中會自動利用腳本把XIF文件編譯成.hh和.cc文件。其定義有固定的語法。例如:

其第一個接口定義了一個給SNMP發送系統內存狀況的接口,0.1是其版本號。“?”的含義是后面是傳給該接口函數的輸入參數,默認添加的返回值是程序執行結果,由類XorpError定義。如果需要其他的返回值,則需要一個回調的callback函數,在XRL接口定義中使用“->”標示進行聲明,在該接口函數執行完成之后,XORP會自動調用該callback函數。上述聲明生成的XRL在執行過程中,實際調用的XRL如下:

在snmp.xif文件中按照上述格式聲明其他協議,例如OSPF,RIP,IGMP等傳遞給SNMP數據的接口。自動腳本會生成.cc和.hh文件,例如接口set_location會自動生成如下函數:

其生成的只是XRL的接口函數,還需要自行添加該接口的實現函數。
在XORP中,CLI是XORP與用戶進行交互的界面,供用戶來對設備進行個性化配置以及查看設備運行狀態和各個參數等。默認的CLI模塊命令行中不存在SNMP協議的命令,需要按照XORP的語法規定手動添加模板文件,CLI模塊對模板進行解析,XORP中模板有兩種格式,擴展名分別為.tp以及.cmd,其中.tp文件中的命令的調用是通過XRL來實現的,而在.cmd中的命令是用Shell,Linux命令等非XRL來實現的。
SNMP模塊必須提供啟動SNMP協議、配置SNMP版本號、關閉SNMP協議、配置SNMP協議family等接口。示例如下:
1)TP文件示例


上述tp文件中需要聲明SNMP模塊的信息,包括版本號、依賴程序、路徑信息以及默認名稱,除此之外是各個SNMP模塊相關命令的調用XRL以及傳遞參數等。其中接口函數名以及路徑等必須和XRL接口聲明的相同,否則將引起rtrmgr找不到對應的XRL命令而無法啟動。XORP在啟動時會自動對上述模板進行解析,動態生成相關的配置樹。當在用戶命令行中輸入相關命令時,RTRMGR會按照相應的XRL調用SNMP模塊命令。
2)cmd文件示例

上述程序聲明了清除SNMP統計信息的命令,commands后面聲明的是需要調用的程序和參數等。XORP也會把cmds文件聲明的命令加入到用戶命令行的命令樹中,與tp文件聲明的命令不同的是,此處調用命令不再使用XRL。
SNMP協議現在有3個版本,v1現在基本已經淘汰,主要使用v2和v3,v2在RFC 2578中進行了描述,v3在RFC 3411-RFC 3418中定義。在v1中指定5種核心PDU:GET REQUEST,GET NEXT REQUEST,GET RESPONSE,SET REQUEST,TRAP。其他PDU在SNMP的v2中加入,包含GETBULK REQUEST和INFORM。v3中主要增加SNMP在安全性和遠端配置方面的強化。
SNMP和Agent有基于GPL發表的源代碼可供使用,最新的代碼可以從http://agentpp.com/上下載。其移植主要是修改其中的宏定義等配置[3-4]。
1)在移植過程中必須修改SNMP和Agent中對于布爾的變量定義,因為XORP中已經對boolean進行了定義。因此更改agent++.h,去掉boolean的定義,添加如下定義:

2)對SNMP和Agent中所有關于布爾變量的聲明進行更正,把boolean改成agentpp_boolean。
3)根據系統要求更改SNMP以及Agent的配置文件,例如使用的SNMP版本號v2/v3等。
MIB(Management Information Base)即管理信息庫,其主要由網絡管理協議訪問的管理對象的數據庫構成[5-6]。MIB庫中每個葉子節點以及Entry等都具有獨一無二的OID號,RFC以及IEEE提供了大部分協議的標準MIB庫定義文件。此外,用戶還可以自己添加私有的MIB庫,此類MIB庫需添加到private節點下。
上述SNMP和Agent中并未包含任何MIB庫,通用的標準MIB庫可以從IEEE等官方網站下載對應的MIB的文本文件,在此之后用第三方的Java工具Agentgen工具將定義的MIB庫轉換成對應的.hh和.cc文件。以RFC1213-MIB為例,其步驟如下:
1)添加該MIB文件到倉庫。命令為

其中 mibrepository是 MIB的二進制的倉庫,pica8mibs是MIB的文本文件倉庫。如果看到“Loading MIB file[./RFC1213 -MIB - rfc1213.txt]...parsed,done”這樣的打印,說明RFC1213-MIB-rfc1213.txt成功加入mibrepository。
2)生成相應的頭文件
#./agentgen.sh ./mibrepository generate RFC1213 - MIB h 3.4 > /tmp/rfc1213_mib.h
3)生成相應的C++文件
#./agentgen.sh ./mibrepository generate RFC1213 - MIB c 3.4 > /tmp/rfc1213_mib.cpp
按照上述方法,將其他協議的MIB庫全部生成C++文件,并將上述文件添加到Makefile或者Makefile.am中。
Agent++主程序主要功能是添加MIB庫,完成初始化,添加eventloop事件,注冊SNMP模塊。由于SNMP初始啟動時并無MIB庫葉子節點的數據,因此其會通過XRL向其他模塊請求數據,來構建初始的數據庫。在此之后基本不再主動請求數據,而是在網絡拓撲結構變化等條件下由其他模塊自動向SNMP傳輸更正的數據,以此來減少XRL調用的次數,提高系統效率。其流程圖如圖2所示。
2.3.1 添加MIB庫代碼
SNMP啟動時需要首先添加相應的MIB庫,例如

圖2 SNMP程序流程圖
SNMP的自帶基礎庫Vacm和OSFP庫等。添加系統描述庫以及OSFP庫的程序示例如下:

2.3.2 初始化
初始化主要是初始化系統使用的時間處理EventLoop,系統描述節點的初始化,以及UsmUserTable等的初始化,初始化UsmUserTable的程序示例如下:

2.3.3 啟動模塊
SNMP模塊初始化完成后即可啟動,SNMP會通過XRL向rtrmgr注冊SNMP模塊,rtrmgr在收到SNMP的啟動信息后,會向其他模塊下發該通知,其他模塊收到通知后會自動向SNMP模塊發送其負責的MIB節點的數據,來構建初始數據。構建完成之后,其他模塊只有在需要更新MIB庫數據時才會向SNMP模塊發送數據。例如構建SNMP結點的xrl_snmp_node初始化示例如下:
XrlSnmpNode xrl_snmp_node(eventloop,snmp_target_name,finder_target_name,finder_hostname,finder_port)eventloop.add_ioevent_cb(snmp.get_iv_snmp_session(),IOT_READ,callback(process_snmp),XorpTask::PRIORITY_DEFAULT);
自定義MIB庫需添加到MIB的private節點之下,必須按照標準對于節點進行聲明,例如如下代碼聲明了一個關于CPU利用率的節點[7-9],其中 SYSTAX 聲明該結點顯示使用的是字符串格式,MAX-ACCES聲明客戶端的操作權限,此處為只讀,STATUS聲明狀態信息,DESCRIPTION是關于該節點的描述信息。最后一行聲明該結點是hostStatusGroup組的第一個結點。

自定義MIB庫的編譯方法和標準MIB庫相同,但必須將其在客戶端重新編譯添加到客戶端MIB庫中才可以獲取到數據[10]。

圖3 客戶端顯示結果(截圖)
經測試,本設計的SNMP協議在XORP上可以正常啟動,并在客戶端可以正常獲取和配置數據(見圖3)。
:
[1]李文杰.EPON網管代理中SNMP與OAM的設計實現[J].光通信技術,2011,35(5):78-81.
[2]肖鋼.基于SNMP、WBEM和WSDM的系統管理技術比較[J].北京郵電大學學報,2009,32(S1):134-139.
[3]劉振海.核心交換機嵌入式重啟裝置研究與設計[J].電子技術應用,2010,36(11):141-145.
[4]吳迪.基于嵌入式操作系統的網管代理實現方法[J].計算機及網絡技術應用,2010,8(5):41-43.
[5]張登銀.基于SNMP的MIB庫轉化成C文件的實現[J].計算機技術與發展,2011,21(9):6-9.
[6]王海穎.基于LINUX嵌入式系統的NMP及其代理(Agent)的設計與實現[D].遼寧:遼寧科技大學,2008.
[7]陳波.基于SNMP的多元網絡統一管理模型研究[J].電視技術,2011,35(10):68-71.
[8]陶寧.基于SNMP的光纖放大器遠程監控系統設計[J].激光技術,2011,35(3):365-371.
[9]張亮.基于SNMP的網絡設備管理系統設計與實現[D].河北:河北科技大學,2010.
[10]魏煜欣.一種基于SNMP網絡性能管理數據的采集方法[J].計算機工程與應用,2011,21(9):6-9.