基于SNMP++/AGENT++的网管系统开发
2011-10-18卢建平
卢建平
(中国电信股份有限公司高州分公司,广东 高州 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代理的开发过程,最后是结语。
(二)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-),男,广东高州人,中国电信股份有限公司高州分公司助理工程师,研究方向为网络管理。