您的位置:首页 > 其它

基于SNMP的MIB库访问实现的研究

2013-04-10 12:58 260 查看
蔡国森

(北京工商大学 计算机学院)

摘要 SNMP是用于网络管理/代理之间的请求/应答协议。管理信息库(MIB)定义了由代理者维护的各种变量,它们由管理者来进行存取操作,从而实现具体的网络管理。本文在对MIB的分析之后,给出了对MIB库变量访问的C语言程序实例.

关键词 简单网络管理协议,模型,信息库,访问实现

1 引言

简单网络管理协议(SNMP)是Internet组织用来管理Internet的网络协议,随着Internet所使用的TCP/IP协议族成为事实上的网间网互连协议标准,SNMP也成为计算机网络管理方面大家实际遵循的标准。几乎所有的Internet网络设备的生产厂家都在开发与SNMP有关的产品并投放市场。

2 SNMP 的管理模型

在SNMP管理模型中有三个基本组成部分:管理者(Manager),被管代理(Agent)和管理信息库(MIB)。管理站一般是一个单机设备或一个共享网络中的一员,它是网络管理员和网络管理系统的接口,能将网络管理员的命令转换成对远程网络元素的监视和控制,同时从网上所有被管实体的MIB (管理信息库) 中提取出信息数据。作为管理站,它还必须拥有能进行数据分析、故障发现等管理应用软件。整个管理站的管理工作是通过轮询代理来完成的。管理者可以通过SNMP 操作直接与管理代理通信,获得即时的设备信息,对网络设备进行远程配置管理或者操作;也可以通过对数据库的访问获得网络设备的历史信息,以决定网络配置变化等操作。SNMP管理代理指的是用于跟踪监测被管理设备状态的特殊软件或硬件,每个代理都拥有自己本地的MIB。实际上,SNMP
的管理任务是移交给管理代理来执行的。代理翻译来自管理站的请求,验证操作的可执行性,通过直接与相应的功能实体通信来执行信息处理任务, 同时向管理站返回响应信息。

3 管理信息库

MIB信息为网管中被管资源,而网络管理中的资源是以对象表示的,每个对象表示被管资源的某方面属性,这些对象形成了MIB库。每个MIB变量记录了每个相连网络的状态、通信量统计数据、发生差错的次数以及内部数据结构的当前内容等。网络管理者通过对MIB库的存取访问,来实现五大管理功能。

3.1 MIB对象定义格式

ASN.1是一种用于描述结构化客体的结构和内容的语言,基于编码规则BER(Basic Encoding Rules)是ASN.1标准定义的一种传送文法。每个MIB变量格式是SMI规定的,用ASN.1描述如下:

OBJECTNAME BOJECT-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.2 MIB 树

每个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.3 MIB 对象及变量

Internet MIB是一树形结构的数据库, MIB-I定义了8个管理信息类别,MIB-Ⅱ是在MIB-I基础上的扩展,增加了SNMP和CMOT两项。MIB类别说明见表1。

表1 MIB类别表

MIB类别 包含有关信息

System 关于实体所在系统的数据

Interface 用于管理的网络接口信息

AT 地址转换信息

IP 网络协议

ICMP 为IP设备携带错误和控制的协议

TCP 传输控制协议

UDP 用户数据报协议

EGP 外部网关协议

CMOT 公共管理信息与服务协议

SNMP 简单网络管理协议

MIB库中每一个变量都符合ASN.1语法规则,MIB库中只使用了ASN.1诸多类型中的INTEGER,OCTET STRING,OBJECT IDENTIFIER,NULL作为基本类型,同时定义了IpAddress,Counter,Gauge,TimeTicks,Opaque类型,大体上说,MIB中变量可分为两大部分,简单变量(Simple variable)和表格(Table)。简单变量是常见的整型及字符串,也包括一些数据集合,通过在变量的对象标识符末尾附加.0来引用。表格对应一组数组,可包含变量的多个实例,表格中的每个表项可以用多个字段,这些字段本身可能是简单变量也可能是表格,表格不能直接进行存取。

4 MIB 访问实现

4.1 SNMP 报文操作

由于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

SNMP PDU

SNMP消息

PDU type

Request-id

0

0

Variable-bindings

Get-Request PDU,Get-Next-Request PDU,Set-Request PDU

PDU type

Request-id

Error-status

Error-status

Variable-bindings

Get-Response PDU

PDU type

Enterprise

Agent-addr

Generic-trap

Specific-trap

Time-stamp

Variable-bindings

Trap PDU

Name1

Value1

Name2

Value2

……..

Name n

Value n

图4 SNMP消息格式

(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.2 MIB访问流程及原理

首先根据自变量接收一个要访问的被管理对象主机名,并接收要查询的对象标识符的简略定义形式. 过程首先生成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 容错机(BSD UNIX 4.3)上运行通过。读者根据这个例子不难编写对MIB 库的其他变量的操作, 从而实现一个具体的网络管理系统。

# include 〈stdio.h〉

# include 〈sys/types.h〉

# include 〈sys/socket.h〉

# include 〈netinet/in.h〉

# include 〈netdb.h〉

# define snmp_port 161  /* SNMP UDP 端口号*/

# define destaddress  “192. 168. 1.16”  /* 访问目标机的IP 地址*/

struct sockaddr_in dest;

struct hostent *hp;

int sockfd;

register int i, n;

int fromlen;

int packsize= 43;

u_char sendpack [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_char recvpack [150];  /* 收到get_ response 报文编码*/

main( )

{

if ((hp=gethostbyname(destaddress))== 0)

{

    printf (“unknown host”) ;

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

{

    printf (“can`t create udp socket”) ;

    exit (1) ;

}

/* 以上生成udp 套接字*/

i= sendto (sockfd, sendpack, packsize, 0, (struct sockaddr* )&dest, sizeof (dest)) ;

if(i

{

    printf (“sendto error”) ;

    exit(1);

}

if (i!=packsize)

{

    printf(“wrote %d bytes, return= %d”, packsize, i) ;

    exit (1)

}

/* 发送udp 报文*/

puts (“receiving now ……”) ;

fromlen= sizeof(dest) ;

if ((n= recvfrom (sockfd, recvpack, sizeof ( recvpack) , 0, (struct sockaddr

*)&dest,&fromlen) )

{

    printf (“recv from error!”) ;

    exit (1) ;

}

/* 接收udp 报文*/

for ( i= 0; i

printf (“%X”,recvpack) ;

close(sockfd) ;

}

五 结束语

综上所述,阐述了对MIB的存取实现,优点是考虑到命令模块的可重用性,此方法而开发的网络管理系统基模块具备了发送网络管理查询请求到远程设备的能力,实现了对动态管理数据的收集,只有很好的实现对MIB的存取,网络管理系统才能更好的发挥作用,若对MIB 进行深入的分析,可以将其应用到流量监控、性能分析、访问控制等重要的网络管理功能。

参考文献

1 Case,J., Fedor,M.Schoffstall,M , and J. Davin. A Simple Network Management Protocol (SNMP). RFC 1157, SNM P Research, Performance Systems International, Performance Systems International, and M IT Laboratory for Computer Science, May 1990

2 Rose M , and K.Mc Cloghrie. Structure and Identification of Management Information for TCP/IP- based internets RFC 1155, Performance Systems International, Hughes LAN Systems ,May 1990

3 M.Rose. Management Information Base for Net-work Management of TCP/IP-based internets :M IB-Ⅱ RFC 1158, Performance Systems International, May 1990

4 Conne Xions , SMP/ SNMP Version 2 : the Evolution of SNMP ,1992 ,6 (10) :3~5

5 岑贤道,安常青. 网络管理协议及应用开发. 北京:清华大学出版社,1998

6 杨家海,任宪坤, 王沛瑜编. 网络管理原理与实现技术.北京:清华大学出版社出版,2000

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8048/showart_69066.html

SNMP的MIB
网友:linxh 发布于: 2007.07.01 00:16 (共有条评论) 查看评论 | 我要评论
原文摘自:

http://www.toplee.com/blog/archives/385.html

SNMP协议介绍

  简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

1. SNMP基本原理

  SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。下图10是NMS公司网络产品中SNMP协议的实现模型。

  SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。数据报结构如下图

  版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。

  团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息

  协议数据单元(PDU):其中PDU指明了SNMP的消息类型及其相关参数。

2. 管理信息库MIB

IETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。  

下图给出了NMS系统中SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构。

 下图给出了对一个DS1线路状态进行查询的OID设置例子。

3. SNMP的五种消息类型

  SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request、Trap

· Get-Request 、Get-Next-Request与Get-Response   

SNMP管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get- Next-Request用于和Get-Request组合起来查询特定的表对象中的列元素。如:首先通过下面的原语获得所要查询的设备的接口数:

{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifNumber(2)}

后再通过下面的原语,进行查询(其中第一次用Get-Request,其后用Get-Next-Request):

{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifTable(2)}

· Set-Request

SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。

· Trap

SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生。

SNMP管理信息库MIB

  管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP的管理信息库采用和域名系统DNS相似的树型结构,它的根在最上面,根没有名字。下图画的是管理信息库的一部分,它又称为对象命名(objectnamingtree)。

  管理信息库的对象命名举例

  对象命名树的顶级对象有三个,即ISO、ITU-T和这两个组织的联合体。在ISO的下面有4个结点,其中的饿一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是Internet(标号是1)。在只讨论Internet中的对象时,可只画出Internet以下的子树(图中带阴影的虚线方框),并在Internet结点旁边标注上{1.3.6.1}即可。在Internet结点下面的第二个结点是mgmt(管理),标号是2。再下面是管理信息库,原先的结点名是mib。1991年定义了新的版本MIB-
II,故结点名现改为mib-2,其标识为{1.3.6.1.2.1},或{Internet(1) .2.1}。这种标识为对象标识符。

  最初的结点mib将其所管理的信息分为8个类别,见表1。现在de mib-2所包含的信息类别已超过40个。

  表1 最初的结点mib管理的信息类别

  应当指出,MIB的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含SNMP代理软件,并保证在定义新的MIB项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的MIB的多个路由器。当然,一个没有新的MIB项目的路由器不能提供这些项目的信息。

  这里要提一下MIB中的对象{1.3.6.1.4.1},即enterprises(企业),其所属结点数已超过3000。例如IBM为 11.3.6.1.4.1.2},Cisco为{1.3.6.1.4.1.9},Novell为{1.3.6.1.4.1.23}等。世界上任何一个公司、学校只要用电子邮件发往iana-mib@isi.edu进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用 SNMP进行管理。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8780/showart_331729.html
MIB文件简单分析

AAC-MIB DEFINITIONS ::= BEGIN

****************************************************************************************************

MIB文件是以DEFINITIONS ::= BEGIN 开始,最后一行以END结束。

DEFINITIONS ::= BEGIN 前面是库名称,如这里的是AAC-MIB,这里库名称就像是一个系统中的

对象名,是唯一的!

****************************************************************************************************

IMPORTS

****************************************************************************************************

IMPORTS标识当前库文件需要引入其它的类文件,编译才不会出错.引入格式为[对象]FROM[库文件],像:

IpAddress

FROM RFC1155-SMI

MODULE-IDENTITY,OBJECT-TYPE

FROM SNMPv2-SMI

****************************************************************************************************

IpAddress

FROM RFC1155-SMI

MODULE-IDENTITY, OBJECT-TYPE

FROM SNMPv2-SMI

RowStatus,DisplayString

FROM SNMPv2-TC

MODULE-COMPLIANCE, OBJECT-GROUP

FROM SNMPv2-CONF

-- EntryStatus

-- FROM RMON-MIB

dlink-common-mgmt FROM DLINK-ID-REC-MIB;

****************************************************************************************************

要引人的对象

****************************************************************************************************

swDlinkAACMIB MODULE-IDENTITY

LAST-UPDATED "9911220000Z"

ORGANIZATION "Working Group"

CONTACT-INFO

" "

DESCRIPTION

"The Link AAC module MIB."

::= { dlink-common-mgmt 5}

swAACCtrl OBJECT IDENTIFIER ::= { swDlinkAACMIB 1 }

-- -------------------------------------------------------------

-- Textual Conventions

-- -------------------------------------------------------------

swAACAuthenAdminState OBJECT-TYPE

SYNTAX INTEGER {

other(1),

disabled(2),

enabled(3)

}

MAX-ACCESS read-write

STATUS current

DESCRIPTION

"This object indicates the Access Authentication is enable or

disable."

::= { swAACCtrl 1}

****************************************************************************************************

引入文件标识结束后就是本类的对象节点描述.

节点描述格式为:

NODENAME NODETYPE

[DATA]

::={PARENT_NODENAME id}

NODENAME为当前节点的名称,如sysDescs,这个名称应该是唯一的;

NODETYPE为当前节点的类型,如MODULE-IDENTITY,OBJECT-TYPE等等;

DATA为节点的内容说明,包含数据类型,访问模式,状态,描述;

PARENT_NODENAME为当前节点的父节点,这个父节点可能在本类中,也可以要引用的外部类中;

id为当前节点在父类中的索引顺序号.

****************************************************************************************************

END

****************************************************************************************************

最后一行以END结束

****************************************************************************************************

例子:

LOOGSON-MIB DEFINITIONS::=BEGIN

IMPORTS

enterprises,OBJECT-TYPE,Integer32,TimeTicks

FROM SNMPv2-SMI

OBJECT-GROUP, NOTIFICATION-GROUP

FROM SNMPv2-CONF

TEXTUAL-CONVENTION, DisplayString

FROM SNMPv2-TC;

loogson OBJECT IDENTIFIER ::= { enterprises 29881 }

cq8401 OBJECT IDENTIFIER ::= { loogson 3 }

test OBJECT IDENTIFIER ::= { cq8401 1 }

MachType OBJECT-TYPE

SYNTAX OCTET STRING

ACCESS read-only

STATUS current

DESCRIPTION "设备类型"

::={ test 1 }

END

转载地址:http://blog.163.com/wzk_1/blog/static/13654607320129100842384/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: