盧建平
(中國(guó)電信股份有限公司高州分公司,廣東 高州 525200)
基于SNMP++/AGENT++的網(wǎng)管系統(tǒng)開發(fā)
盧建平
(中國(guó)電信股份有限公司高州分公司,廣東 高州 525200)
文章闡述了網(wǎng)絡(luò)管理、SNMP模型和MBI和SMI的基本概念和基本應(yīng)用,對(duì)SNMP++和AGENT++的結(jié)構(gòu)進(jìn)行了介紹,并通過(guò)實(shí)例來(lái)說(shuō)明SNMP代理的開發(fā)和私有MIB的擴(kuò)充。
網(wǎng)絡(luò)管理;簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議;MIB;SNMP++;AGENT++
互聯(lián)網(wǎng)己經(jīng)滲透到社會(huì)經(jīng)濟(jì)的各個(gè)領(lǐng)域,對(duì)社會(huì)經(jīng)濟(jì)的發(fā)展起著越來(lái)越重要的作用。與此同時(shí)網(wǎng)絡(luò)的規(guī)模日趨擴(kuò)大,網(wǎng)絡(luò)結(jié)構(gòu)日趨復(fù)雜,這些因素都極大地增加了整個(gè)網(wǎng)絡(luò)的安全運(yùn)行和日常管理的難度,如何構(gòu)建一個(gè)穩(wěn)定可靠的網(wǎng)絡(luò)管理體系和管理系統(tǒng),成為一個(gè)重要的研究方向。
簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol,SNMP)由一系列協(xié)議組和規(guī)范組成,是管理各種互連網(wǎng)絡(luò)的事實(shí)標(biāo)準(zhǔn)。SNMP提供了一種從網(wǎng)絡(luò)設(shè)備收集或設(shè)置網(wǎng)絡(luò)管理信息的方法,協(xié)議規(guī)定了網(wǎng)絡(luò)管理工作站與被管理設(shè)備之間進(jìn)行通信的語(yǔ)法和規(guī)則, 主要包括以下三個(gè)方面:1.管理信息結(jié)構(gòu) SMI(Structure of Management Information);2.管理信息庫(kù)MIB(Management Information Base);3.簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議 SNMP(Simple Network Management Protocol )。由于協(xié)議細(xì)節(jié)較多,為了減輕開發(fā)強(qiáng)度SNMP網(wǎng)管系統(tǒng)一般是基于已有的開發(fā)包來(lái)實(shí)現(xiàn),目前常見的開發(fā)包包括
本文的剩余部分安排如下,第二部分描述了SNMP模型,第三部分介紹了 SNMP++和 AGENT++,并通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明SNMP代理的開發(fā)過(guò)程,最后是結(jié)語(yǔ)。
1.SNMP網(wǎng)絡(luò)管理模型
SNMP網(wǎng)絡(luò)管理模型采用客戶/服務(wù)器的組織模式。網(wǎng)絡(luò)管理站充當(dāng)客戶方,而裝備了SNMP代理過(guò)程的被管理節(jié)點(diǎn)擔(dān)任服務(wù)器方。如圖1所示:
圖1 網(wǎng)絡(luò)管理協(xié)議結(jié)構(gòu)圖
網(wǎng)絡(luò)管理站是網(wǎng)絡(luò)管理員管理網(wǎng)絡(luò)系統(tǒng)的接口,它提供數(shù)據(jù)分析、故障恢復(fù)的管理應(yīng)用程序以及監(jiān)視和控制網(wǎng)絡(luò)的接口。被管理節(jié)點(diǎn)一般指裝備了SNMP代理的網(wǎng)絡(luò)實(shí)體(如主機(jī)、路由器等)。SNMP對(duì)來(lái)自于網(wǎng)絡(luò)管理站的信息請(qǐng)求和動(dòng)作請(qǐng)求進(jìn)行應(yīng)答,并異步的為管理工作站報(bào)告一些重要的意外事件。
網(wǎng)絡(luò)管理站與被管理節(jié)點(diǎn)通過(guò)簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議進(jìn)行通信。通信主要包括一些內(nèi)容:管理站讀取代理者處對(duì)象的值(Get操作),包括get-request、get-next-request;管理站設(shè)置代理者處對(duì)象的值(Set操作);代理者向管理站通報(bào)重要事件(Trap操作);被管理節(jié)點(diǎn)對(duì)管理站Get和Set操作的響應(yīng)(Get-response)。
SNMP在遞交SNMP消息時(shí)需要使用傳輸層服務(wù)。協(xié)議本身并沒有假設(shè)底層服務(wù)是無(wú)連接的還是面向連接的,大多數(shù)SNMP的實(shí)現(xiàn)都在TCP/IP結(jié)構(gòu)內(nèi)部實(shí)現(xiàn),并使用無(wú)連接的UDP協(xié)議。SNMP一般使用兩個(gè)端口,被管理節(jié)點(diǎn)在161端口偵聽傳來(lái)的GetRequest、GetNextRequest和SetRequest命令,而網(wǎng)絡(luò)管理站在162端口偵聽傳來(lái)的Traps。
2.MIB結(jié)構(gòu)
為了有效的對(duì)網(wǎng)絡(luò)進(jìn)行管理,SNMP模型必須定義大量的變量來(lái)描述網(wǎng)絡(luò)上硬件及軟件的運(yùn)行狀態(tài)和統(tǒng)計(jì)信息,在SNMP協(xié)議中,這些變量都稱為對(duì)象。MIB就是這些對(duì)象的集合。而為了網(wǎng)絡(luò)系統(tǒng)的互操作性,用于表示特定資源的對(duì)象在每個(gè)系統(tǒng)中都必須相同,同時(shí)對(duì)象必須使用統(tǒng)一的表示方案。也就是說(shuō),必須對(duì)語(yǔ)法和語(yǔ)義有一致的理解。管理信息結(jié)構(gòu)SMI確定了可用于MIB中的數(shù)據(jù)類型,并且說(shuō)明了對(duì)象在MIB內(nèi)部怎樣表示和命名。
源于SNMP中MIB的可擴(kuò)充性和實(shí)際運(yùn)行的網(wǎng)絡(luò)設(shè)備的多樣性,為了實(shí)現(xiàn)特定設(shè)備的非標(biāo)準(zhǔn)功能,我們可以對(duì)標(biāo)準(zhǔn)MIB進(jìn)行擴(kuò)充,加入某些私有的MIB。實(shí)際上,相當(dāng)部分的網(wǎng)絡(luò)設(shè)備都有某些標(biāo)準(zhǔn) MIB所沒有包括的特殊功能,所以很多商業(yè)的公司都有自己產(chǎn)品私有的MIB。例如CISCO的大部分可管理設(shè)備,均有其私有的MIB。私有MIB下的企業(yè)號(hào)可以向IANA申請(qǐng)。
結(jié)合前述網(wǎng)絡(luò)管理概念和SNMP模型,基于SNMP的網(wǎng)絡(luò)管理系統(tǒng)主要功能如下:1.訪問MIB 庫(kù)的變量并給出相應(yīng)變量的描述;2.性能和吞吐量分析,通過(guò)訪問SNMP和MIB 可以獲得網(wǎng)絡(luò)性能的有關(guān)數(shù)據(jù);3.對(duì)網(wǎng)絡(luò)性能進(jìn)行動(dòng)態(tài)分析,監(jiān)測(cè)中心對(duì)監(jiān)測(cè)設(shè)備進(jìn)行查詢來(lái)獲得有關(guān)網(wǎng)絡(luò)狀態(tài)的信息,用于以后的評(píng)估和分析;4.故障警告。
SNMP和MIB的開發(fā)可以大致分為兩種:SNMP網(wǎng)絡(luò)管理站的開發(fā)和Agent的開發(fā)。SNMP網(wǎng)絡(luò)管理站的開發(fā)根據(jù)側(cè)重點(diǎn)有很大差異,部分系統(tǒng)可以動(dòng)態(tài)的加入或卸載企業(yè)私有MIB,還有部分系統(tǒng)可以對(duì)歷史數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)進(jìn)行綜合,可以提前發(fā)現(xiàn)網(wǎng)絡(luò)的異常,這些根據(jù)業(yè)務(wù)邏輯和管理系統(tǒng)的智能程度而不同。但基本的功能是實(shí)現(xiàn)SNMP協(xié)議讀取和設(shè)置被管理對(duì)象的值。Agent在網(wǎng)管系統(tǒng)結(jié)構(gòu)的位置相當(dāng)于管理器和被管設(shè)備之間的網(wǎng)關(guān)和協(xié)議轉(zhuǎn)換器。它一般包括查詢?cè)O(shè)置模塊、告警模塊以及MIB庫(kù)。
1.SNMP++/ AGENT++
SNMP++是一套開源并且免費(fèi)的 C++類的集合,最初由 HP公司開發(fā),現(xiàn)由 Frank Fock 組織維護(hù)和升級(jí)。由于 SNMP++把編程中的核心部分都面向?qū)ο蠡庋b起來(lái),因此程序員無(wú)需了解 SNMP 底層的機(jī)制,只需了解 C++的編程知識(shí)和 SNMP編程的流程即可快速開發(fā)出高效的SNMP 程序,為網(wǎng)絡(luò)管理應(yīng)用的開發(fā)者提供高效、安全、易用的 SNMP 服務(wù)。Snmp類封裝了SNMP 通信活動(dòng)建立網(wǎng)絡(luò)連接的所有必要代碼,使用該類時(shí)只需要聲明一個(gè)該類的對(duì)象并設(shè)置對(duì)應(yīng)的參數(shù);對(duì)象標(biāo)識(shí)符類(Oid)對(duì)SMI中對(duì)象標(biāo)識(shí)符OID (Object Identifier)類型的封裝,該類的主要任務(wù)是使操作OID 更加簡(jiǎn)潔方便;PDU類封裝了SNMP 報(bào)文中的PDU 結(jié)構(gòu);而從SnmpSyntax類派生了一系列對(duì)應(yīng)于 SMI中各種數(shù)據(jù)類型的類,包括 IpAddress類、Counter32類、OctetStr類等。
AGENT++是一套用于開發(fā)SNMP Agent的C++庫(kù),它建立在SNMP++的基礎(chǔ)之上。AGENT++提供了完整的協(xié)議處理框架,提供了標(biāo)量對(duì)象和表對(duì)象等 MIB對(duì)象的基類,通過(guò)繼承用戶可以方便地定義MIB對(duì)象,通過(guò)派生的子類重載其中的虛函數(shù),根據(jù)系統(tǒng)的需要靈活控制程序。AGENT++包括的基本類包括Mib類、MibContext類、MibEntry類、MibLeaf類、MibTable類、MibTableRow類等。Mib類對(duì)象存放了整個(gè)系統(tǒng)的MIB,MIB可能由多個(gè)模塊構(gòu)成,每個(gè) MIB模塊存放在一個(gè)MibContext對(duì)象中。而開發(fā)SNMP代理的主要工作就是生成各種MibEntry類來(lái)獲取和設(shè)置系統(tǒng)的各種參數(shù)。
2.AGENT++實(shí)例
SNMP代理的功能是響應(yīng)網(wǎng)絡(luò)管理站的信息請(qǐng)求,返回一定的信息或根據(jù)請(qǐng)求設(shè)置某些信息。因此使用AGENT++來(lái)構(gòu)建SNMP代理可以分解為兩個(gè)內(nèi)容,首先是如何構(gòu)建程序的主體和必要部分,其次是如何擴(kuò)充該代理的額外功能,也即如何實(shí)現(xiàn)公有和私有MIB。
程序的主體包括幾個(gè)部分。①初始化SNMP:創(chuàng)建類Snmpx的實(shí)例;②創(chuàng)建MIB:創(chuàng)建類MIB的實(shí)例;③注冊(cè)RequestList:創(chuàng)建類RequestList的一個(gè)實(shí)例,并在MIB實(shí)例中注冊(cè);④初始化 RequestList:Request List 需要 SNMP 消息處理部件來(lái)接收和發(fā)送SNMP消息,因此要把SNMP消息處理部件進(jìn)行注冊(cè);⑤添加MIB對(duì)象:根據(jù)需要添加所有的MIB對(duì)象;⑥進(jìn)入主循環(huán):負(fù)責(zé)處理來(lái)自網(wǎng)絡(luò)管理站的請(qǐng)求。
擴(kuò)充私有MIB主要通過(guò)AGENT++中的MibEntry類及其繼承類來(lái)完成,普通的標(biāo)量采用 MibLeaf類來(lái)擴(kuò)充,而表格類采用MibTable和MibTableRow來(lái)擴(kuò)充。
本文的 myTag例子用來(lái)設(shè)置和獲取主機(jī)上的一個(gè)標(biāo)志符(Tag),設(shè)置與獲取的具體操作由 getmyTag()和 setmyTag()函數(shù)實(shí)現(xiàn),該私有 Oid為“1.3.6.1.4.1.29427.0”。程序除了主干(斜體字部分)外,主要是通過(guò)MibLeaf的繼承類myTag來(lái)實(shí)現(xiàn)擴(kuò)充私有 MIB(粗體字部分),主要是自定義get_request()和set()這兩個(gè)成員函數(shù)。其中g(shù)et_request()函數(shù)是對(duì)應(yīng)去網(wǎng)絡(luò)管理站的“讀取信息”功能,而set()函數(shù)是對(duì)應(yīng)網(wǎng)絡(luò)管理站的“設(shè)置”功能。
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);
//獲得標(biāo)志符的實(shí)際操作函數(shù),結(jié)果存儲(chǔ)在buf中
set_value(OctetStr(buf));
//將該節(jié)點(diǎn)存儲(chǔ)的值設(shè)置為buf中存儲(chǔ)的字符串
MibLeaf::get_request(req, ind);
//由基類中的函數(shù)繼續(xù)處理
}
int set(const Vbx& vb)
{
//將節(jié)點(diǎn)中的值設(shè)置為請(qǐng)求中包含的參數(shù)
if(0 != set_value(vb))
return SNMP_ERROR_BAD_VALUE;
char buf[64];
get_value(buf);
//將節(jié)點(diǎn)包含的值拷貝到buf中
setmyTag(buf);
//將系統(tǒng)標(biāo)志符值設(shè)置為buf的實(shí)際操作函數(shù)
return SNMP_ERROR_SUCCESS; }};
void main (int argc, char* argv[]) {
int status;
Snmp::socket_startup(); //初始化網(wǎng)絡(luò)配置
Snmpx snmp(status,161); //創(chuàng)建Snmpx類的實(shí)例
Mib* mib = new Mib(); //創(chuàng)建Mib類的實(shí)例
mib->set_request_list(reqList);//初始化RequestList
mib->add(new sysGroup()); //添加 Mib 子樹
mib->add(new myTag()); //添加私有Mib
reqList->set_snmp(&snmp);
//將Snmpx的實(shí)例注冊(cè)到請(qǐng)求列表中
for(;;) { //程序主循環(huán)
Request* req= RequestList::receive();
if(req) mib->process_request(req);
}
}
SNMP 協(xié)議是當(dāng)前網(wǎng)絡(luò)管理的事實(shí)標(biāo)準(zhǔn),本文簡(jiǎn)述了SNMP協(xié)議, 并分析了HP公司的SNMP++和AGENT++開發(fā)包,然后通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明SNMP代理的開發(fā)過(guò)程。
[1] William Stallins.SNMP 網(wǎng)絡(luò)管理[M].胡成松,汪凱,譯. 中國(guó)電力出版社.
[2] Mani Subramanian.網(wǎng)絡(luò)管理[M].王松,周靖,譯.清華大學(xué)出版社.
[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-),男,廣東高州人,中國(guó)電信股份有限公司高州分公司助理工程師,研究方向?yàn)榫W(wǎng)絡(luò)管理。