snmp mib.docx
- 文档编号:10305264
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:84
- 大小:54KB
snmp mib.docx
《snmp mib.docx》由会员分享,可在线阅读,更多相关《snmp mib.docx(84页珍藏版)》请在冰豆网上搜索。
snmpmib
零专业级的SNMP框架---SNMP4J
∙SNMP4J简介
相比SNMPPACKAGEAPI比较低的门槛和简单的功能,SNMP4J则是完全专业级的框架.他的SNMP-TARGET-PDU的三点结构更科学更严谨,完善的PDU数据引擎也是业界的一种潮流.SNMP4J的强大体现在他对SNMPV3标准下基于用户安全(USM)方式的认证,加密,和对Agent功能的强大支持.
∙SNMP4J基本GET和GETNEXT功能
1.先建立一个工具类,主要是对SNMP,TARGET,PDU的三个SNMP4J基本类的实例化
注:
出于简化,本例去掉了SNMPV3的支持,以下代码只支持SNMPV1和SNMPV2C
publicclassSnmp4JHelper{
publicstaticSnmpcreateSnmpSession(Addressaddress)throwsIOException{
//newTransportMappingobject
AbstractTransportMappingtransport;
if(addressinstanceofTcpAddress){
transport=newDefaultTcpTransportMapping();
}
else{
transport=newDefaultUdpTransportMapping();
}
//newSnmpobject
Snmpsnmp=newSnmp(transport);
returnsnmp;
}
publicstaticTargetcreateTarget(Addressaddress,OctetStringcommunity){
CommunityTargettarget=newCommunityTarget();
target.setAddress(address);
target.setCommunity(community);
returntarget;
}
publicstaticPDUcreatePDU(intpduType){
PDUrequest;
if(pduType==PDU.V1TRAP){
request=newPDUv1();
}
else{
request=newPDU();
}
request.setType(pduType);
returnrequest;
}
几个工具方法
一基于SNMP的MIB库访问实现的研究
蔡国森
(北京工商大学计算机学院)
摘要SNMP是用于网络管理/代理之间的请求/应答协议。
管理信息库(MIB)定义了由代理者维护的各种变量,它们由管理者来进行存取操作,从而实现具体的网络管理。
本文在对MIB的分析之后,给出了对MIB库变量访问的C语言程序实例.
关键词简单网络管理协议,模型,信息库,访问实现
1引言
简单网络管理协议(SNMP)是Internet组织用来管理Internet的网络协议,随着Internet所使用的TCP/IP协议族成为事实上的网间网互连协议标准,SNMP也成为计算机网络管理方面大家实际遵循的标准。
几乎所有的Internet网络设备的生产厂家都在开发与SNMP有关的产品并投放市场。
2SNMP的管理模型
在SNMP管理模型中有三个基本组成部分:
管理者(Manager),被管代理(Agent)和管理信息库(MIB)。
管理站一般是一个单机设备或一个共享网络中的一员,它是网络管理员和网络管理系统的接口,能将网络管理员的命令转换成对远程网络元素的监视和控制,同时从网上所有被管实体的MIB(管理信息库)中提取出信息数据。
作为管理站,它还必须拥有能进行数据分析、故障发现等管理应用软件。
整个管理站的管理工作是通过轮询代理来完成的。
管理者可以通过SNMP操作直接与管理代理通信,获得即时的设备信息,对网络设备进行远程配置管理或者操作;也可以通过对数据库的访问获得网络设备的历史信息,以决定网络配置变化等操作。
SNMP管理代理指的是用于跟踪监测被管理设备状态的特殊软件或硬件,每个代理都拥有自己本地的MIB。
实际上,SNMP的管理任务是移交给管理代理来执行的。
代理翻译来自管理站的请求,验证操作的可执行性,通过直接与相应的功能实体通信来执行信息处理任务,同时向管理站返回响应信息。
3管理信息库
MIB信息为网管中被管资源,而网络管理中的资源是以对象表示的,每个对象表示被管资源的某方面属性,这些对象形成了MIB库。
每个MIB变量记录了每个相连网络的状态、通信量统计数据、发生差错的次数以及内部数据结构的当前内容等。
网络管理者通过对MIB库的存取访问,来实现五大管理功能。
3.1MIB对象定义格式
ASN.1是一种用于描述结构化客体的结构和内容的语言,基于编码规则BER(BasicEncodingRules)是ASN.1标准定义的一种传送文法。
每个MIB变量格式是SMI规定的,用ASN.1描述如下:
OBJECTNAMEBOJECT-TYPE
DESCRIPTION:
(description)
SYNTAX:
(syntax)
ACCESS:
(access)
STATUS:
(status)
:
:
={(Parent)number}
OBJECTNAME是被管对象的名字,ASN.1要求所有对象的名字在MIB中必须是唯一的;BOJECT-TYPE是每一个节点对象所必需的关键字;SYNTAX是被管对象类型的关键字,随后跟着的是一个类型(syntax);ACCESS是被管对象的访问方式关键字,在
SNMP第二版中为MAX-ACCESS关键字,(access)是被管对象的访问方式,可为如下列举值之一:
read-only、read-write、no-accessible,SNMP第2版中又增加了read-create;STATUS是被管对象关键字,(status)是被管对象的状态,如必备的、可选的或废弃的;DESCRIPTION是 对被管对象的功能、特征等进行描述的关键字,(description)是被管对象的文本描述,在:
:
:
={(Parent)number}中,Parent表示位于MIB树中的父节点,number表示是第几个子节点。
3.2MIB树
每个MIB对象都用对象标识符(OID)来唯一的标识,这是用定义在ASN.1语法中的树型结构来组织的可用信息,其中每个可用信息是一个带标号的节点,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点通向它的路径,它命名节点并指示它在ASN.1树中的准确位置。
一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。
图3是带有ASN.1编号的MIB树实例:
可以看出MIB-Ⅱ的OID是:
1.3.6.1.2.1或者iso.org.dod.internet.mgmt.mib2。
在SNMP中,实现应用到的MIB对象都是MIB-Ⅱ的子树节点。
3.3MIB对象及变量
InternetMIB是一树形结构的数据库,MIB-I定义了8个管理信息类别,MIB-Ⅱ是在MIB-I基础上的扩展,增加了SNMP和CMOT两项。
MIB类别说明见表1。
表1MIB类别表
MIB类别包含有关信息
System关于实体所在系统的数据
Interface用于管理的网络接口信息
AT地址转换信息
IP网络协议
ICMP为IP设备携带错误和控制的协议
TCP传输控制协议
UDP用户数据报协议
EGP外部网关协议
CMOT公共管理信息与服务协议
SNMP简单网络管理协议
MIB库中每一个变量都符合ASN.1语法规则,MIB库中只使用了ASN.1诸多类型中的INTEGER,OCTETSTRING,OBJECTIDENTIFIER,NULL作为基本类型,同时定义了IpAddress,Counter,Gauge,TimeTicks,Opaque类型,大体上说,MIB中变量可分为两大部分,简单变量(Simplevariable)和表格(Table)。
简单变量是常见的整型及字符串,也包括一些数据集合,通过在变量的对象标识符末尾附加.0来引用。
表格对应一组数组,可包含变量的多个实例,表格中的每个表项可以用多个字段,这些字段本身可能是简单变量也可能是表格,表格不能直接进行存取。
4MIB访问实现
4.1SNMP报文操作
由于SNMP是工作在UDP上的协议,即无连接的报文通信方式,它不保证报文是否正确到达(SNMP的报文格式如图4所示)。
与其他网络管理协议不同的是,SNMP使用一种称作“取—存”的范例来实现各种操作。
主要有以下3种信息:
(1)Get:
由管理站去获取代理管理信息库的值,通过发送Get-Request,Get-Next–Request两种消息来实现。
管理站通过发送Get-Request报文从拥有SNMP管理代理的网络设备中获取指定对象的信息,而管理代理用Get-Response报文来响应Get-Request报文。
Get-Next-Request是获取一个表中指定对象的下一个对象,因此通常用它来获取一个表中的所有对象信息。
(2)Set:
由管理站设置代理的管理信息库的对象值,通过发送Set-request来实现,它可以对一个网络设备进行远程参数配置。
Version
Community
SNMPPDU
SNMP消息
PDUtype
Request-id
0
0
Variable-bindings
Get-RequestPDU,Get-Next-RequestPDU,Set-RequestPDU
PDUtype
Request-id
Error-status
Error-status
Variable-bindings
Get-ResponsePDU
PDUtype
Enterprise
Agent-addr
Generic-trap
Specific-trap
Time-stamp
Variable-bindings
TrapPDU
Name1
Value1
Name2
Value2
……..
Namen
Valuen
图4SNMP消息格式
(3)Trap:
使得代理能够向管理站通告重要事件,是属于非请求的消息,这些消息通知管理站发生了特定事件。
Trap消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。
一个SNMP实体在接收SNMP报文时,一般要进行基本的语法检查、版本号的验证、认证(若成功就以ASN.1的形式返回一个PDU)、对返回的PDU再进行语法检查。
当所有的验证和语法解析成功以后,实体就选择适当的访问策略,对该PDU进行相应的处理。
管理系统工作时,管理站周期性地发送Get-Request/Get-Next-Request报文来轮询各个代理,获取各个MIB中的管理信息,同时,管理站也接收代理发来的Trap报文,并记录在一个数据库中。
网络管理员可以通过专用的应用软件从管理站上查看每个代理提供的管理信息。
各个节点的代理程序驻留在工作站内存中,负责收集被管对象的网络状态信息。
当代理接收到管理站的Get报文后,代理将根据请求的内容从本地MIB中提取所需信息,并以Get-Response报文方式将结果回送给管理站。
代理一方面在161端口上(SNMP的默认端口)循环侦听来自管理站的Get-Request/Get-Next-Request报文,并做出相应的响应,读取或修改MIB中的变量值,将结果返回给管理站,另一方面,它也不断地检查本地的状态,适当地发送Trap报文。
4.2MIB访问流程及原理
首先根据自变量接收一个要访问的被管理对象主机名,并接收要查询的对象标识符的简略定义形式.过程首先生成SNMP报文,一旦报文生成,再把报文简单反转过来,发送出去.这其中要将请求标识符段内容及标识符长度保存起来,留待以后进行匹配检查.生成SNMP报文后,建立代理地址,创建套接字连接,以便代理能将响应发回.然后,启动警告信号处理器,将SNMP请求报文发给代理,等待一个响应的到来.因为SNMP是工作在UDP之上的,所以在SNMP应用实体间通信时,无需先建立连接,这样虽降低了系统开销,但UDP传输是不可靠的,为此,网络管理站采取了相应的超时和重发策略.本系统在发出请求报文之后,启动超时计数器,等待响应的到来,并设置重发次数为3.若3次之后仍没有收到响应,则关闭套接字,并返回一个“接收失败”错误代码.反之,若确定收到一个响应,则调用一过程来把响应转换成为内部表示形式,即对SNMP报文进行译码.再用已保存的Request-id与响应Request-id段进行比较,来验证这个报文是否是刚才发出的请求报文的响应.若是,就调用另一个过程,把每段对象标识符的ASN.1表示形式转换成自己的内部形式,并显示其值.由于SNMP报文对各个段都使用可变长度编码,这就使得即便是从SNMP报文中提取一简单整数段,也要进行许多计算,因而,所开发的系统原码程序中包含了一个语言较长、结构复杂的特殊句法分析程序,用于提取报文的各个段并进行译码,此句法分析软件必须把一指针移遍报文中所有各段,以找出各段长度并提取其数值.
MIB访问的主流程图如下:
4.3结合自己的开发经验,列举了访问MIB的一个具体实现
以下介绍一个访问MIB库中SysDescr变量的程序。
该程序在Stratus容错机(BSDUNIX4.3)上运行通过。
读者根据这个例子不难编写对MIB库的其他变量的操作,从而实现一个具体的网络管理系统。
#include 〈stdio.h〉
#include 〈sys/types.h〉
#include 〈sys/socket.h〉
#include 〈netinet/in.h〉
#include 〈netdb.h〉
#define snmp_port 161 /*SNMPUDP端口号*/
#define destaddress “192.168.1.16” /*访问目标机的IP地址*/
structsockaddr_indest;
structhostent*hp;
intsockfd;
registerinti,n;
intfromlen;
intpacksize=43;
u_charsendpack[100]={0x30,0x37,2,1,0,4,6,0x70,0x75,0x62,0x6c,0x69,0x63,0xa0,0x26,2,4,0,0,0,0,2,1,0,2,1,0,0x30,0x1c,0x30,0x0c,6,8,0x2b,6,1,2,1,1,1,0,5,0};/*get_request报文编码*/
u_charrecvpack[150]; /*收到get_response报文编码*/
main()
{
if((hp=gethostbyname(destaddress))==0)
{
printf(“unknownhost”);
exit
(1);
}
dest.sin_family=AF_INET;
dest.sin_port=htons(snmp_port);
memcpy((char*)&dest.sin_addr,(char*)hp->h_addr,hp->h_length);
if((sockfd=socket(AF_INET,SOCK_DGRAM,17))<0)
{
printf(“can`tcreateudpsocket”);
exit
(1);
}
/*以上生成udp套接字*/
i=sendto(sockfd,sendpack,packsize,0,(structsockaddr*)&dest,sizeof(dest));
if(i<0)
{
printf(“sendtoerror”);
exit
(1);
}
if(i!
=packsize)
{
printf(“wrote%dbytes,return=%d”,packsize,i);
exit
(1)
}
/*发送udp报文*/
puts(“receivingnow……”);
fromlen=sizeof(dest);
if((n=recvfrom(sockfd,recvpack,sizeof(recvpack),0,(structsockaddr
*)&dest,&fromlen))<0)
{
printf(“recvfromerror!
”);
exit
(1);
}
/*接收udp报文*/
for(i=0;i printf(“%X”,recvpack[i]); close(sockfd); } 五结束语 综上所述,阐述了对MIB的存取实现,优点是考虑到命令模块的可重用性,此方法而开发的网络管理系统基模块具备了发送网络管理查询请求到远程设备的能力,实现了对动态管理数据的收集,只有很好的实现对MIB的存取,网络管理系统才能更好的发挥作用,若对MIB进行深入的分析,可以将其应用到流量监控、性能分析、访问控制等重要的网络管理功能 二Snmp4j编程简介之一: Target2010-11-2315: 18: 33 分类: 系统运维 关于Snmp4j包,最重要三个概念,也是三个类: Snmp、Target、PDU。 Target,表示被管理的设备。 对于一个被管理的设备,我们关注它的Address,它使用的协议版本version,访问它的用户名和密码、以及对这个设备我们设置跟它打交道的一些策略,比如超时时间、重传次数等。 所以有如下方法: 1)获取或者设置ip地址 voidsetAddress(Addressaddress) AddressgetAddress() 2)设置或者获取版本号(支持V1,V2c,V3) voidsetVersion(intver) intgetVersion() 3)超时时间(单位: milliseconds) voidsetTimeout(longout) longgetTimeout() 4)重传次数 voidsetRetries(intretries) intgetRetries() 5)最大PDU大小值 voidsetMaxSizeRequestPDU(intmax) intgetMaxSizeRequestPDU() 上面这些对于Snmp三个版本都是相同的,不同的只是在于安全方面,具体来说,Snmpv1,v2c采用共同体(community)方式,安全性很差;SnmpV3采用基于用户的安全(USM)方式,安全性能得到很大提高。 (1)对于Snmpv1,v2c,使用Target派生出一个子类CommunityTarget,增加了对Community的方法: voidsetCommunity(OctetStringcommunity) OctetStringgetCommunity() (2)对于SnmpV3,使用其子类UserTarget,增加了一些有关USM安全方面的设置,比如采用的安全模型、安全级别、访问该设备的用户名以及权威引擎ID(authoritativeengineID): i)安全级别(支持三种安全级别) voidsetSecurityLevel(intlevel) intgetSecurityLevel() ii)访问用户名(该访问用户名称必须在设置USM的时候添加其相应的UsmUser) voidsetSecurityName(OctetStringname) OctetStringgetSecurityName() iii)安全模型(支持三种安全模型) voidsetSecurityModel(intmodel) intgetSecurityModel() V)权威引擎ID(authoritativeengineID) voidsetAuthoritativeEngineID(byte[]id) byte[]getAuthoritativeEngineID() 对于Target的代码大致如下: (摘自Snmp4j的说明文档) ∙CommunityTarget ∙CommunityTargettarget=newCommunityTarget(); ∙target.setCommunity(newOctetString("public")); ∙target.setAddress(targetAddress); target.setVersion(SnmpConstants.version1); ∙UserTarget ∙UserTargettarget=newUserTarget(); ∙target.setAddress(targetAddress); ∙target.setRetries (1); ∙//settimeoutto500milliseconds->2*500ms=1stotaltimeout ∙target.setTimeout(500); ∙target.setVersion(SnmpConstants.version3); ∙target.setSecurityLevel(SecurityLevel.AUTH_PRIV); target.setSecurityName(newOctetString("MD5DES")); 三Snmp4j编程简介之二: PDU PDU(协议数据单元),用来表示管理站跟代理站点进行通信的数据。 包括PDU的类型、传输的数据集合、错误说明等。 除Snmpv1Trap外,其他操作类型的PDU大致相同。 Snmp4j针对Snmp的各个版本,开发了三个有关PDU的类。 PDU(针对Snmpv2c)、PDUv1(针对Snmpv1)、ScopedPDU(针对Snmpv3),但三个类除各自特别的一些参数外,都基本相同。 所以Snmp4j在设计的时候,将PDU设计成另外两个的超类,使他们能够共享大部分功能。 (1)PDU 1)pdu类型(Snmpv1支持5种,get、set、getnext、trap、getresponse,Snmpv2c增加了getbulk、inform) intgetType() voidsetType(inttype)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- snmp mib
![提示](https://static.bdocx.com/images/bang_tan.gif)