基于XORP的SNMP网络协议实现

2012-09-17 07:54一,吴
电视技术 2012年23期
关键词:调用示例命令

武 一,吴 桐

(河北工业大学信息工程学院,天津 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库的添加等。

1 XORP介绍

XORP是一个完全开源的网络平台,支持多种协议,提供对IPv4和IPv6的支持。由于其开放性,因此方便用户对其进行剪裁以及根据本身硬件进行优化。其中重要的是rtrmgr(XORP Router Manager Process),XRL接口的解析和模板的解析都是由其完成,CLI(Command Line Interface)用户命令行向用户提供设备配置命令行,其负责完成命令树文件的语法解析以及命令树和配置树的生成、不同用户之间的同步等。XORP进程的结构如图1所示。

图1 XORP结构图

1.1 XRL 接口

在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的接口函数,还需要自行添加该接口的实现函数。

1.2 模板定义

在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。

2 SNMP移植

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在安全性和远端配置方面的强化。

2.1 SNMP 和 Agent移植

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等。

2.2 MIB 库添加

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中。

2.3 主程序实现

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);

2.4 自定义MIB库

自定义MIB库需添加到MIB的private节点之下,必须按照标准对于节点进行声明,例如如下代码声明了一个关于CPU利用率的节点[7-9],其中 SYSTAX 声明该结点显示使用的是字符串格式,MAX-ACCES声明客户端的操作权限,此处为只读,STATUS声明状态信息,DESCRIPTION是关于该节点的描述信息。最后一行声明该结点是hostStatusGroup组的第一个结点。

自定义MIB库的编译方法和标准MIB库相同,但必须将其在客户端重新编译添加到客户端MIB库中才可以获取到数据[10]。

图3 客户端显示结果(截图)

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.

猜你喜欢
调用示例命令
只听主人的命令
2019年高考上海卷作文示例
核电项目物项调用管理的应用研究
常见单位符号大小写混淆示例
常见单位符号大小写混淆示例
LabWindows/CVI下基于ActiveX技术的Excel调用
“全等三角形”错解示例
移防命令下达后
基于系统调用的恶意软件检测技术研究
这是人民的命令