盧建平
(中國電信股份有限公司高州分公司,廣東 高州 525200)
基于SNMP++/AGENT++的網管系統開發
盧建平
(中國電信股份有限公司高州分公司,廣東 高州 525200)
文章闡述了網絡管理、SNMP模型和MBI和SMI的基本概念和基本應用,對SNMP++和AGENT++的結構進行了介紹,并通過實例來說明SNMP代理的開發和私有MIB的擴充。
網絡管理;簡單網絡管理協議;MIB;SNMP++;AGENT++
互聯網己經滲透到社會經濟的各個領域,對社會經濟的發展起著越來越重要的作用。與此同時網絡的規模日趨擴大,網絡結構日趨復雜,這些因素都極大地增加了整個網絡的安全運行和日常管理的難度,如何構建一個穩定可靠的網絡管理體系和管理系統,成為一個重要的研究方向。
簡單網絡管理協議(Simple Network Management Protocol,SNMP)由一系列協議組和規范組成,是管理各種互連網絡的事實標準。SNMP提供了一種從網絡設備收集或設置網絡管理信息的方法,協議規定了網絡管理工作站與被管理設備之間進行通信的語法和規則, 主要包括以下三個方面:1.管理信息結構 SMI(Structure of Management Information);2.管理信息庫MIB(Management Information Base);3.簡單網絡管理協議 SNMP(Simple Network Management Protocol )。由于協議細節較多,為了減輕開發強度SNMP網管系統一般是基于已有的開發包來實現,目前常見的開發包包括
本文的剩余部分安排如下,第二部分描述了SNMP模型,第三部分介紹了 SNMP++和 AGENT++,并通過一個實例來說明SNMP代理的開發過程,最后是結語。
1.SNMP網絡管理模型
SNMP網絡管理模型采用客戶/服務器的組織模式。網絡管理站充當客戶方,而裝備了SNMP代理過程的被管理節點擔任服務器方。如圖1所示:

圖1 網絡管理協議結構圖
網絡管理站是網絡管理員管理網絡系統的接口,它提供數據分析、故障恢復的管理應用程序以及監視和控制網絡的接口。被管理節點一般指裝備了SNMP代理的網絡實體(如主機、路由器等)。SNMP對來自于網絡管理站的信息請求和動作請求進行應答,并異步的為管理工作站報告一些重要的意外事件。
網絡管理站與被管理節點通過簡單網絡管理協議進行通信。通信主要包括一些內容:管理站讀取代理者處對象的值(Get操作),包括get-request、get-next-request;管理站設置代理者處對象的值(Set操作);代理者向管理站通報重要事件(Trap操作);被管理節點對管理站Get和Set操作的響應(Get-response)。
SNMP在遞交SNMP消息時需要使用傳輸層服務。協議本身并沒有假設底層服務是無連接的還是面向連接的,大多數SNMP的實現都在TCP/IP結構內部實現,并使用無連接的UDP協議。SNMP一般使用兩個端口,被管理節點在161端口偵聽傳來的GetRequest、GetNextRequest和SetRequest命令,而網絡管理站在162端口偵聽傳來的Traps。
2.MIB結構
為了有效的對網絡進行管理,SNMP模型必須定義大量的變量來描述網絡上硬件及軟件的運行狀態和統計信息,在SNMP協議中,這些變量都稱為對象。MIB就是這些對象的集合。而為了網絡系統的互操作性,用于表示特定資源的對象在每個系統中都必須相同,同時對象必須使用統一的表示方案。也就是說,必須對語法和語義有一致的理解。管理信息結構SMI確定了可用于MIB中的數據類型,并且說明了對象在MIB內部怎樣表示和命名。
源于SNMP中MIB的可擴充性和實際運行的網絡設備的多樣性,為了實現特定設備的非標準功能,我們可以對標準MIB進行擴充,加入某些私有的MIB。實際上,相當部分的網絡設備都有某些標準 MIB所沒有包括的特殊功能,所以很多商業的公司都有自己產品私有的MIB。例如CISCO的大部分可管理設備,均有其私有的MIB。私有MIB下的企業號可以向IANA申請。
結合前述網絡管理概念和SNMP模型,基于SNMP的網絡管理系統主要功能如下:1.訪問MIB 庫的變量并給出相應變量的描述;2.性能和吞吐量分析,通過訪問SNMP和MIB 可以獲得網絡性能的有關數據;3.對網絡性能進行動態分析,監測中心對監測設備進行查詢來獲得有關網絡狀態的信息,用于以后的評估和分析;4.故障警告。
SNMP和MIB的開發可以大致分為兩種:SNMP網絡管理站的開發和Agent的開發。SNMP網絡管理站的開發根據側重點有很大差異,部分系統可以動態的加入或卸載企業私有MIB,還有部分系統可以對歷史數據和實時數據進行綜合,可以提前發現網絡的異常,這些根據業務邏輯和管理系統的智能程度而不同。但基本的功能是實現SNMP協議讀取和設置被管理對象的值。Agent在網管系統結構的位置相當于管理器和被管設備之間的網關和協議轉換器。它一般包括查詢設置模塊、告警模塊以及MIB庫。
1.SNMP++/ AGENT++
SNMP++是一套開源并且免費的 C++類的集合,最初由 HP公司開發,現由 Frank Fock 組織維護和升級。由于 SNMP++把編程中的核心部分都面向對象化封裝起來,因此程序員無需了解 SNMP 底層的機制,只需了解 C++的編程知識和 SNMP編程的流程即可快速開發出高效的SNMP 程序,為網絡管理應用的開發者提供高效、安全、易用的 SNMP 服務。Snmp類封裝了SNMP 通信活動建立網絡連接的所有必要代碼,使用該類時只需要聲明一個該類的對象并設置對應的參數;對象標識符類(Oid)對SMI中對象標識符OID (Object Identifier)類型的封裝,該類的主要任務是使操作OID 更加簡潔方便;PDU類封裝了SNMP 報文中的PDU 結構;而從SnmpSyntax類派生了一系列對應于 SMI中各種數據類型的類,包括 IpAddress類、Counter32類、OctetStr類等。
AGENT++是一套用于開發SNMP Agent的C++庫,它建立在SNMP++的基礎之上。AGENT++提供了完整的協議處理框架,提供了標量對象和表對象等 MIB對象的基類,通過繼承用戶可以方便地定義MIB對象,通過派生的子類重載其中的虛函數,根據系統的需要靈活控制程序。AGENT++包括的基本類包括Mib類、MibContext類、MibEntry類、MibLeaf類、MibTable類、MibTableRow類等。Mib類對象存放了整個系統的MIB,MIB可能由多個模塊構成,每個 MIB模塊存放在一個MibContext對象中。而開發SNMP代理的主要工作就是生成各種MibEntry類來獲取和設置系統的各種參數。
2.AGENT++實例
SNMP代理的功能是響應網絡管理站的信息請求,返回一定的信息或根據請求設置某些信息。因此使用AGENT++來構建SNMP代理可以分解為兩個內容,首先是如何構建程序的主體和必要部分,其次是如何擴充該代理的額外功能,也即如何實現公有和私有MIB。
程序的主體包括幾個部分。①初始化SNMP:創建類Snmpx的實例;②創建MIB:創建類MIB的實例;③注冊RequestList:創建類RequestList的一個實例,并在MIB實例中注冊;④初始化 RequestList:Request List 需要 SNMP 消息處理部件來接收和發送SNMP消息,因此要把SNMP消息處理部件進行注冊;⑤添加MIB對象:根據需要添加所有的MIB對象;⑥進入主循環:負責處理來自網絡管理站的請求。
擴充私有MIB主要通過AGENT++中的MibEntry類及其繼承類來完成,普通的標量采用 MibLeaf類來擴充,而表格類采用MibTable和MibTableRow來擴充。
本文的 myTag例子用來設置和獲取主機上的一個標志符(Tag),設置與獲取的具體操作由 getmyTag()和 setmyTag()函數實現,該私有 Oid為“1.3.6.1.4.1.29427.0”。程序除了主干(斜體字部分)外,主要是通過MibLeaf的繼承類myTag來實現擴充私有 MIB(粗體字部分),主要是自定義get_request()和set()這兩個成員函數。其中get_request()函數是對應去網絡管理站的“讀取信息”功能,而set()函數是對應網絡管理站的“設置”功能。
class myTag:public MibLeaf {
public:
myTag():MibLeaf(Oidx("1.3.6.1.4.1.29427.0"),
READWRITE, new OctetStr("")) { }
~myTag() { }
void get_request(Request *req, int ind)
{
char buf[64];getmyTag(buf);
//獲得標志符的實際操作函數,結果存儲在buf中
set_value(OctetStr(buf));
//將該節點存儲的值設置為buf中存儲的字符串
MibLeaf::get_request(req, ind);
//由基類中的函數繼續處理
}
int set(const Vbx& vb)
{
//將節點中的值設置為請求中包含的參數
if(0 != set_value(vb))
return SNMP_ERROR_BAD_VALUE;
char buf[64];
get_value(buf);
//將節點包含的值拷貝到buf中
setmyTag(buf);
//將系統標志符值設置為buf的實際操作函數
return SNMP_ERROR_SUCCESS; }};
void main (int argc, char* argv[]) {
int status;
Snmp::socket_startup(); //初始化網絡配置
Snmpx snmp(status,161); //創建Snmpx類的實例
Mib* mib = new Mib(); //創建Mib類的實例
mib->set_request_list(reqList);//初始化RequestList
mib->add(new sysGroup()); //添加 Mib 子樹
mib->add(new myTag()); //添加私有Mib
reqList->set_snmp(&snmp);
//將Snmpx的實例注冊到請求列表中
for(;;) { //程序主循環
Request* req= RequestList::receive();
if(req) mib->process_request(req);
}
}
SNMP 協議是當前網絡管理的事實標準,本文簡述了SNMP協議, 并分析了HP公司的SNMP++和AGENT++開發包,然后通過一個實例來說明SNMP代理的開發過程。
[1] William Stallins.SNMP 網絡管理[M].胡成松,汪凱,譯. 中國電力出版社.
[2] Mani Subramanian.網絡管理[M].王松,周靖,譯.清華大學出版社.
[3] AGENT++.AGENT++ Documentation 3.5.31[EB/OL].(2011-03).http://www.agentpp.com.
[4] K. McCloghrie." Structure of Management Information Version 2".RFC 2578.(2011-03).
TN915.07
A
1008-1151(2011)06-0040-02
2011-03-23
盧建平(1979-),男,廣東高州人,中國電信股份有限公司高州分公司助理工程師,研究方向為網絡管理。