netsnmp软件包的应用.docx
《netsnmp软件包的应用.docx》由会员分享,可在线阅读,更多相关《netsnmp软件包的应用.docx(25页珍藏版)》请在冰豆网上搜索。
netsnmp软件包的应用
NET-SNMP软件包应用
1SNMP协议简介1
1.1网络管理协议结构2
1.2管理信息库5
1.3SNMP的版本6
2SNMP开发软件包6
3net-snmp软件包简介 6
3.1NET-SNMP简介和安装6
3.2NET-SNMP代理的配置7
3.3NET-SNMP工具的使用7
4用net-snmp软件包扩展代理---linux服务器9
4.1NET-SNMP中的scalar对象和table对象9
4.2NET-SNMP扩展代理的两种方式(转)9
4.3自定义MIB扩展流程(Linux服务器上)10
4.4自定义MIB11
4.5代理扩展实例——简单变量的实现12
4.6代理扩展实例——表对象的实现13
a)mib.iterator.conf模版的实现(转)13
b)mib.iterator_access.conf模版的实现(转)15
4.7代码的合并15
4.8配置和运行16
5用net-snmp软件包扩展代理---嵌入式板端16
6Linux环境中开发中的问题与解决18
7Windows环境中开发中的问题与解决(转)19
8总结20
9附录21
9.1snmpd.conf配置文件21
9.2主函数foxmail_new.c(为调试代理而用。
我自己未调试)21
9.3简单变量实现代码---mib2c.old-api.conf22
9.4简单变量实现代码---mib2c.scalar.conf22
9.5表的实现---mib2c.mfd.conf22
1SNMP协议简介
作为一个完备的系统,必须有一套反馈机制来调整系统的运行。
简单网络管理协议产生的目的,就是为了使松散的网络更加有效地运行。
它广泛的应用于监测网络的状态、网络设备的运行情况、各种电脑设备以及一些辅助的外围设备,使得网络管理员通过对节点的查询和设置,发现并定位故障,进而采取相应措施维护网络。
网络管理的研究已经发展了许多年,对于日益纷繁的需求,简捷性和扩展性仍是研究的主题。
本文中协议相关资料可以参考RFC文档:
RFC1155:
StructureandIdentificationofManagementInformationforTCP/IP-based
Internets
RFC1157:
SNMP
RFC1212:
ConciseMIBDefinitions
RFC1215:
AConventionforDefiningTraps
RFC1905:
ProtocolOperationsforSNMPv2
RFC2011:
SNMPv2ManagementInformationBasefortheInternetProtocolusingSMIv2
RFC2578:
StructureofManagementInformation
RFC2579:
TextualConventions
RFC2580:
ConformanceStatements
1.1网络管理协议结构
SNMP的网络管理模型包括以下关键元素:
管理端、代理端、管理信息库、网络管理协议。
它基于tcp/ip协议,属于应用层协议,通过udp协议通信。
管理端与代理端的通信原语包括:
Get,Getnext,Set,Trap。
在udp数据包中,发送信息是按ASN.1自解释方式编码的。
但对于许多小型被监管设备,可能会运行不同协议,或者运行完整代理花费很大,于是产生了代管设备,主代理和子代理的概念。
在小型设备上运行子代理,把数据发给主代理来完成snmp协议的通信。
网管基本模型
交互操作图
图中数字:
1-----GetRequest2-----GetNextRequest3-----SetRequest
4-----GetResponse5-----Trap
嵌入式Agent软件结构
1.2管理信息库
SNMP以MIB(管理信息结构)为基础来描述被监管资源,由此建立的数据集和称之为MIB库。
(它实质上就是制定格式的文本文件。
)它是一种树型结构的数据库,被监管的对象都处于叶子节点上。
每个被监管对象都由一个唯一的对象标识符来识别。
对象信息的存储结构由MIB定义的简单变量和表来构造,它一般包含描述名(对象标识符)、数据类型、读写规则、功能描述、状态。
MIB的定义可以查询RFC1155,它定义了四种基本数据类型:
INTEGER,OCTETSTRING,OBJECTIDENTIFIER和NULL。
由这四种基本类型通过SEQUENCE构造列和表,以及新类型如:
NetworkAddress、IpAddress、Counter、Gauge、TimeTicks、Opaque等,以及宏定义。
当然,根据需要还可以构造自己的数据类型。
1.3SNMP的版本
目前SNMP有三个版本snmpV1、snmpV2、snmpV3。
针对原始的V1版,93版的v2加入了安全机制,但用户对其并不感兴趣,在96版的v2中又删除了安全机制,99年开始酝酿的v3版开始提出一个snmp的统一架构,采用User-based安全模型和View-based访问控制模型提供SNMP网络管理的安全性。
安全机制是SNMPv3的最具特色的内容。
2SNMP开发软件包
目前,开发SNMP的软件包有许多可以选择如SNMP++、AGENT++、NET-SNMP等。
SNMP++是基于C++的,一般多用于windows。
这里我们选用的是NET-SNMP。
它是一个开源软件,基于C语言开发,便于移植。
ucd-snmp源自于卡耐基.梅隆大学的SNMP软件包CMUsnmp2.1.2.1,由加州大学Davis分校(UniversityofCaliforniaatDavis)开发与维护,所以命名为ucd-snmp。
2000年11月ucd-snmp项目转到由SourceForge()管理,并更名为net-snmp。
3net-snmp软件包简介
3.1NET-SNMP简介和安装
net-snmp早先是在Unix平台下开发的。
现可以移植到:
HP-UX(10.20to9.01and11.0)
Ultrix(4.5to4.2)
SolarisSPARC/ULTRA(2.8to2.3),Intel(2.9)andSunOS(4.1.4to4.1.2)
OSF(4.0,3.2)
NetBSD(1.5alphato1.0)
FreeBSD(4.1to2.2)
BSDi(4.0.1to2.1)
Linux(kernels2.4to1.3)
AIX(4.1.5,3.2.5)
OpenBSD(2.8,2.6)
Irix(6.5to5.1)
OSX(10.1.1and10.1.2)
Dynix/PTX4.4
QNX6.2.1A
Windows
等多个平台。
Net-snmp是一个代理端软件,但也提供管理端的查询工具。
安装有两种方式:
一是直接安装的二进制包,二是需要编译的源代码。
我们在windows平台上安装的二进制包,在虚拟Unix平台CygWin上编译安装的源代码。
在windows上的二进制包的安装非常简单,只需按提示就可完成。
源代码和二进制包可从-snmp.org/网站下载。
之所以要先安装一个可运行的net-snmp系统,是因为我们开发程序运行环境的配置文件,是按照默认安装路径内部设定搜索的;另外,还可以利用其提供的配置工具来生成配置文件,利用提供的查询工具来测试程序。
Linux上的安装流程:
---------------------------------------------------------------------------
tar-xvfnet-snmp-5.4.1.tar
cdnet-snmp-5.4.1
./configure
make
makeinstall
(修改snmpd.conf配置文件:
/usr/local/etc/snmp/snmpd.conf参见【附录】)
snmpd
ps-aef|grepsnmpd
3.2NET-SNMP代理的配置
运行net-snmp之前先要进行环境设置,否则无法查询到结果。
环境配置文件由snmpconf命令交互生成。
运行snmpconf后,提示有三个配置文件:
snmpd.conf,snmptraps.conf,snmp.conf。
其中:
⏹snmpd.conf用来配置代理和管理端通信时的参数,只需设置两个参数就可正常运行程序了,一是communityname,有只读rocommunity和读写rwcommunity之分,相当于访问账号,这里设rocommunity为public;另一个是访问端口,设为snmp协议默认的161端口。
⏹Snmp.conf是与mib库设置相关的配置文件。
⏹Snmptraps.conf用来设置代理陷阱。
另外,snmpconf和mib2c工具都是基于perl脚本的,在windows下需要安装perl才能运行。
按照帮助文档的提示,下载ActivePerl安装。
并按照帮助文档中perl的安装要求,下载在win32环境下所需的其他组件,配置并测试perl模块,使snmpconf和mib2c能正常运行。
3.3NET-SNMP工具的使用
当环境设置好后,运行snmpd,即snmp代理进程,就可以使用管理工具查询其中的信息了。
Net-snmp提供的查询工具有很多,大部分查询命令的格式都大同小异。
这里以.iso.org.dod.internet.mgmt.mib-2.system为例,其Oid为:
.1.3.6.1.2.1.1。
结构如下:
………system.1.3.6.1.2.1.1
|——sysDescr.1.3.6.1.2.1.1.1
|——sysObjectID.1.3.6.1.2.1.1.2
……
⏹snmpget——snmpget[OPTIONS]AGENTOID[OID]...用来查询叶子节点
实例:
snmpget–v2c–cpubliclocalhost.1.3.6.1.2.1.1.5.0
snmpget–v2c–cpublic192.168.12.77.1.3.6.1.2.1.1.5.0
snmpget–v2c–cpublic127.0.0.1.1.3.6.1.2.1.1.5.0
说明:
-v2c:
使用的是2c的snmp版本,可选1|2c|3
-cpublic:
community名为public
localhost:
代理的地址,若代理运行在本机上,所以可用localhost
⏹snmpgetnext.exe——snmpgetnext[OPTIONS]AGENTOID[OID]...通过父节点查询叶子节点
实例:
snmpgetnext–v2c–cpubliclocalhost.1.3.6.1.2.1.1
说明:
这个命令假设不知道叶子节点,但知道父节点,则可遍历到第一个叶子节点。
此例结果等同于上一个例子。
Oid也可输入.1.3.6.1.2,因为它是按字典顺序遍历的。
⏹snmptable.exe——snmptable[OPTIONS]AGENTTABLE-OID用来查询表对象
实例:
snmptable–v2c–cpubliclocalhost.iso.org.dod.internet.mgmt.mib-2.ip.ipAddrTable
⏹snmpwalk
实例:
snmpwalk-v1192.168.12.77-cpublicucdDemoPublic
⏹snmpset.exe——snmpset[OPTIONS]AGENTOIDTYPEVALUE[OIDTYPEVALUE]...修改数据
实例:
snmpset–v2c–cpubliclocalhost.1.3.6.1.2.1.4.21.1.3.xi99
说明:
x:
在这里是索引值,表示表项中某一列的第几个数据,根据要求设定
i:
这里是列数据类型,包括i:
INTEGER,u:
unsignedINTEGER,t:
TIMETICKS,
a:
IPADDRESSo:
OBJID,s:
STRING,x:
HEXSTRING,
d:
DECIMALSTRING,b:
BITSU:
unsignedint64,
I:
signedint64,F:
float,D:
double
⏹mib2c用来把mib库文件编译成.c和.h模版。
实例:
mib2ct1Table
mib2c-cmib2c.scalar.conflianyiPublic
mib2c-cmib2c.old-api.conflianyiPublic
mib2c-cmib2c.mfd.conflyTable
mib2c-cmib2c.genhtml.confifTable//生成mib文件的html格式
说明:
Whenyourunmib2c,youmustspecifyaMIBnodeforittoprocess.Youcanalsospecifywhichconfigurationfileyouwouldlikeittousetogeneratethecode.Theavailableoptionsare:
mib2c.int_watch.conf
mib2c.old-api.conf//scalar的ucd-snmp选项所用;
mib2c.scalar.conf//scalar的net-snmp选项所用;
mib2c.array-user.conf//
mib2c.create-dataset.conf//TableData在agent里;
mib2c.iterate.conf//TableData在外部时;
mib2c.iterate_access.conf//
mib2c.mfd.conf//
mib2c.notify.conf//(内容极简单,无采用价值)
mib2c.genhtml.conf模板:
生成mib文件的html格式
4用net-snmp软件包扩展代理---linux服务器
在利用net-snmp做扩展之前的准备工作是,一下载源代码,二编译出库文件:
netsnmpagent.lib、netsnmphelpers.lib、netsnmpmibs.lib、netsnmp.lib。
这四个库的工程文件都位于~\net-snmp-5.2.1.2\win32\下对应的文件夹中。
编译库文件时注意把netsnmp.lib放到最后编译,它可能会参考一下前面的编译文件。
本文档中实现的代理程序,在源代码包中只需要引用这四个库文件。
开发工具VC6.0的环境设置也需要注意,参考帮助文档readme.win32,设置好include目录,library目录。
在project\configure的选项link的相关栏目中添加上四个库文件,还要加上wsock32.lib库。
另外,在程序编译过程中会碰到与VC的默认库相冲突的地方,按提示在上述添加库的地方加上/NODEFAULTLIB:
XXX.LIB来除去默认库。
代理的开发过程基本上遵循:
mib模块→转换成C文件→编译进代理中。
4.1NET-SNMP中的scalar对象和table对象
mib模块一般都由变量和表组成。
因此Net-snmp把SMI中的对象分为两大类:
scalar和table。
Scalar就包含我们常用的整型,字符串,时间等等数据类型。
table就是scalar的一种集合,有一个和多个列组成,类似于数据库中的表。
它必须具有索引项,用来按一定顺序检索表项。
Mib2工具通过模版把mib文件解析成.c和.h文件,这些文件仅仅是半成品,还需要手工在相应地方添加相应代码。
Mib2c有很多模版,可以根据相应需要来调用不同的模版。
但mib2c目前不支持同时解析scalar和table对象,对于具有这两种对象的mib模块,需要分别生成代码文件,然后再合并成整体。
4.2NET-SNMP扩展代理的两种方式(转)
用net-snmp扩展代理,实现方式可归结为两种:
一是静态库方式,通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后重新编译库文件和代理程序;
二是编译动态共享库,只需把新引入的mib模块的.c和.h文件编译成动态库,通过设置能够让代理程序载入。
对于第二种方式,一需要编译成.so动态共享库,二需要原代理程序是否包含dlmod或load命令,三还要看系统是否支持。
一般情况下仅支持Unix平台。
我们在CygWin下试验过Unix平台编译。
在VC下的编译环境,基本上都是参考其makefile,configure等文件。
第一种方式允许我们在原有mib库上添加新的mib模块,也可以只针对需要的mib模块编译单独的程序。
源代码包中的代理程序工程文件位于~\net-snmp\win32\snmpd下,因为它可移植到多个平台,主程序代码中有许多平台开关,和各种选项,非常庞大。
为了简化开发和调试,我们使用了一个帮助文档中介绍的简化的代理端程序框架。
这个框架非常精简,在性能上可能比原版差很多,但用来测试和开发mib库就比较高效了。
程序的运行机制:
程序启动,载入初始化mib模块,然后进入一个等待呼叫的无限循环,代码片段如下:
……
init_MyMib();
……
while(keep_running)
{
/*ifyouuseselect(),seesnmp_select_info()insnmp_api(3)*/
/*---OR---*/
agent_check_and_process
(1);/*0==don'tblock*/
}
我们所要做的就是实现init_MyMib()函数,即自定义的mib模块。
关于无限循环中的阻塞与否,根据mib模块而定。
如果你的应用程序需要以非阻塞方式处理SNMP数据流,就使用一步接口(例如GUI、线程、forking等)。
否则,只需要使用同步接口就可以了。
在阻塞模式下,程序会占用大量cpu资源。
具体实现可参见例子:
【附录7.1】
下面以Linux下的为例分析;
4.3自定义MIB扩展流程(Linux服务器上)
实现步骤如下:
1)定义MIB文件
⏹按照SMIV2的语法来定义描述被管理对象的MIB文件:
***.txt;也使用MG-SOFT公司的”VisualMIBBuilder”可视化设计软件完成MIB库模块的定义;
⏹注意事项
◆注意表名必须为“***Table”,实体名应该为“***Entry”;(因为在实践过程中发现若名称不符合,mib2c不能正常执行;)
◆Mib文件中用到的数据类型注意要在IMPORTS中包含到;(若没包含到,便认为是不合理的类型)
2)利用mib2c生成C代码文件
⏹MIB库模块定义后,需要在代理程序中增加与所定义的MIB库模块相对应的源代码;用mib2c工具程序把MIB库模块文件转换成C源代码。
⏹
执行流程:
1.把设计好的MIB库文件(***.txt)拷贝到net-snmp源代码的mibs目录(如:
/usr/local/share/snmp/mibs);
2.exportMIBS=ALL//export是设置mib2c后对象名的查找范围。
上面设置表示在mibs目录下查找所有文件;
3.mib2cmodulename//modulename是要转换的对象名,不是mib文件名,也不是节点名;mib2c会在当前目录下生成modulename.h和modulename.c,这两个文件是根据所设计的mib库模块转换而成的;
注意事项:
◆Mib文件必须要存放到mib库中:
/usr/local/share/snmp/mibs;
◆使用mib2c工具时,要根据需要转换的MIB定义文件来选择配置文件。
传统的MIB定义文件一般根据里面的MIB变量是普通的MIB变量还是二维表,以及MIB变量值的获取是通过外部资源还是通过agent本身,来选择不同的mib2c配置文件;
◆在做mib文件时,若有表存在,注意标明应为*Table,实体:
*Entry.因为在实际应用中发现,若表明不为Table结束的,就不能正常生成代码文件;
3)添加自己的实现代码
⏹根据不同的模板修改相应的代码;由模版生成的文件,不论是简单变量还是表对象,其整体结构都是固定模式。
在模版头文件中对节点进行宏定义,函数声明。
在模版实现文件中,分为两大块:
一是初始化函数,主要用来对变量注册;二是响应函数,用来响应管理端的查询命令,响应函数的返回值,就是我们要手工实现的。
我们所要做的工作就是把数据以一种合理的方式导入到其中。
⏹注意事项:
◆注意代码中用到的variablen其中的n值可能有误,需要根据实际修改。
有两个地方需要修改并保持一致。
4)编译调试所实现的代码
a)通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后重新编译库文件和代理程序;
b)(先把原snmpd关闭并卸载)
c)./configure-with-mib-modules="lyTablelianyiPublic"//
d)make
e)makeinstall
f)cd/usr/local/sbin/
g)./snmpd-Lf/var/log/snmpd.log–DALL//打印信息到日志文件snmpd.log
4.4自定义MIB
这里我们定义了一个私人节点的MIB,位于节点.iso.org.dod.internet.private.enterprises下,数字Oid为:
.1.3.6.1.4.1。
树型结构如下:
+--lianyiMIB(32189)(.1.3.6.1.4.1.32189)
|
+--lianyiMIBObjects
(1)
|
+--lianyiPublic
(1)
|
+---RW-Integer32s1
(1)
|Range:
0..2147483647
+---RW-Strings2
(2)
|Size:
0..1024
+---R--Strings3(3)
+---R--Strings4(4)
|
+--lyTable(5)
|
+--lyEntry
(1)
|Index:
lyIndex
|
+---R--Integer32lyIndex
(1)
+---R--StringlyDescr
(2)
|TextualConvention:
DisplayString
|Size:
0..