SNMP 读书笔记.docx

上传人:b****1 文档编号:2342196 上传时间:2023-05-03 格式:DOCX 页数:24 大小:63.93KB
下载 相关 举报
SNMP 读书笔记.docx_第1页
第1页 / 共24页
SNMP 读书笔记.docx_第2页
第2页 / 共24页
SNMP 读书笔记.docx_第3页
第3页 / 共24页
SNMP 读书笔记.docx_第4页
第4页 / 共24页
SNMP 读书笔记.docx_第5页
第5页 / 共24页
SNMP 读书笔记.docx_第6页
第6页 / 共24页
SNMP 读书笔记.docx_第7页
第7页 / 共24页
SNMP 读书笔记.docx_第8页
第8页 / 共24页
SNMP 读书笔记.docx_第9页
第9页 / 共24页
SNMP 读书笔记.docx_第10页
第10页 / 共24页
SNMP 读书笔记.docx_第11页
第11页 / 共24页
SNMP 读书笔记.docx_第12页
第12页 / 共24页
SNMP 读书笔记.docx_第13页
第13页 / 共24页
SNMP 读书笔记.docx_第14页
第14页 / 共24页
SNMP 读书笔记.docx_第15页
第15页 / 共24页
SNMP 读书笔记.docx_第16页
第16页 / 共24页
SNMP 读书笔记.docx_第17页
第17页 / 共24页
SNMP 读书笔记.docx_第18页
第18页 / 共24页
SNMP 读书笔记.docx_第19页
第19页 / 共24页
SNMP 读书笔记.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

SNMP 读书笔记.docx

《SNMP 读书笔记.docx》由会员分享,可在线阅读,更多相关《SNMP 读书笔记.docx(24页珍藏版)》请在冰点文库上搜索。

SNMP 读书笔记.docx

SNMP读书笔记

SNMP读书笔记

1          SNMP协议简介

作为一个完备的系统,必须有一套反馈机制来调整系统的运行。

简单网络管理协议产生的目的,就是为了使松散的网络更加有效地运行。

它广泛的应用于监测网络的状态、网络设备的运行情况、各种电脑设备以及一些辅助的外围设备,使得网络管理员通过对节点的查询和设置,发现并定位故障,进而采取相应措施维护网络。

网络管理的研究已经发展了许多年,对于日益纷繁的需求,简捷性和扩展性仍是研究的主题。

本文档的目的是关于客户端代理的开发,不是对协议发展的探讨。

本文中协议相关资料可以参考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。

对应这些命令相应的SNMP结构框架实现如图1所示

 

从上图我们可以看到协议,消息传递方式等。

另外,在udp数据包中,发送信息是按ASN.1自解释方式编码的。

但对于许多小型被监管设备,可能会运行不同协议,或者运行完整代理花费很大,于是产生了代管设备,主代理和子代理的概念。

在小型设备上运行子代理,把数据发给主代理来完成snmp协议的通信。

1.2         管理信息库

SNMP以MIB(管理信息结构)为基础来描述被监管资源,由此建立的数据集和称之为MIB

库。

它是一种树型结构的数据库,被监管的对象都处于叶子节点上。

每个被监管对象都由一个唯一的对象标识符来识别。

对象信息的存储结构由MIB定义的简单变量和表来构造,它一般包含描述名(对象标识符)、数据类型、读写规则、功能描述、状态。

MIB的定义可以查询RFC1155,它定义了四种基本数据类型:

INTEGER,OCTETSTRING,OBJECTIDENTIFIER和NULL。

由这四种基本类型通过SEQUENCE构造列和表,以及新类型如:

NetworkAddress、IpAddress、Counter、Gauge、TimeTicks、Opaque等,以及宏定义。

当然,根据需要还可以构造自己的数据类型。

1.3        SNMP的版本

目前SNMP有三个版本snmpV1、snmpV2、snmpV3。

针对原始的V1版,93版的v2加入了安全机制,但用户对其并不感兴趣,在96版的v2中又删除了安全机制,99年开始酝酿的v3版开始提出一个snmp的统一架构,采用User-based安全模型和View-based访问控制模型提供SNMP网络管理的安全性。

安全机制是SNMPv3的最具特色的内容。

2          SNMP开发软件包

目前,开发SNMP的软件包有许多可以选择如SNMP++、AGENT++、NET-SNMP等。

这里我们选用的是NET-SNMP。

首先它是一个开源软件,其次基于C语言开发,便于移植。

ucd-snmp源自于卡耐基.梅隆大学的SNMP软件包CMUsnmp2.1.2.1,由加州大学Davis分校(UniversityofCaliforniaatDavis)开发与维护,所以命名为ucd-snmp。

2000年11月ucd-snmp项目转到由SourceForge()管理,并更名为net-snmp。

2.1        NET-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上编译安装的源代码。

在CygWin中,按照常规的configure,make,makeinstall三个步骤就可成功编译安装源代码。

在windows上的二进制包的安装就非常简单了,只需按提示就可完成。

源代码和二进制包可从-snmp.org网站下载,本文中所用的是net-snmp5.2.1.2的版本。

之所以要先安装一个可运行的net-snmp系统,是因为我们开发程序运行环境的配置文件,是按照默认安装路径内部设定搜索的;另外,还可以利用其提供的配置工具来生成配置文件,利用提供的查询工具来测试程序。

2.2        NET-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用来设置代理陷阱,本文没有讨论陷阱。

配置文件可以放在三个地方,一是盘符根目录下,二是~\usr\etc\snmp目录下,三是~\usr\snmp\persist,按标准路径最好是第二种方式。

另外,snmpconf和mib2c工具都是基于perl脚本的,在windows下需要安装perl才能运行。

按照帮助文档的提示,下载ActivePerl安装。

并按照帮助文档中perl的安装要求,下载在win32环境下所需的其他组件,配置并测试perl模块,使snmpconf和mib2c能正常运行。

2.3        NET-SNMP工具的使用

当环境设置好后,运行snmpd.exe,即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

……

1)snmpget.exe——snmpget[OPTIONS]AGENTOID[OID]...用来查询叶子节点

实例:

snmpget–v2c–cpubliclocalhost.1.3.6.1.2.1.1.5.0

-v2c:

使用的是2c的snmp版本,可选1|2c|3

-cpublic:

community名为public

localhost:

代理的地址,这里因为代理运行在本机上,所以可用localhost

.1.3…….0:

这里查询的是.iso.org.dod.internet.mgmt.mib-2.system.sysName,其Oid为.1.3.6.1.2.1.1.5,使用这个命令使叶子节点要在后面加.0。

2)snmpgetnext.exe——snmpgetnext[OPTIONS]AGENTOID[OID]...通过父节点查询叶子节点

实例:

snmpgetnext–v2c–cpubliclocalhost.1.3.6.1.2.1.1

这个命令假设不知道叶子节点,但知道父节点,则可遍历到第一个叶子节点。

此例结果等同于上一个例子。

Oid也可输入.1.3.6.1.2,因为它是按字典顺序遍历的。

3)snmptable.exe——snmptable[OPTIONS]AGENTTABLE-OID用来查询表对象

实例:

snmptable–v2c–cpubliclocalhost.1.3.6.1.2.1.4.20

这个命令查询表对象,本例中查询的是.iso.org.dod.internet.mgmt.mib-2.ip.ipAddrTable

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

5)mib2c用来把mib库文件编译成.c和.h模版。

具体使用在下面章节的应用中介绍

3.安装

1、安装

./configure

make

makeinstall

2、配置参数/文件

只有适当的配置snmpd.conf文件,snmpd才能运行起来。

位置:

可以在./configure的时候指定配置文件所在的位置,也可以用--with-persistent-directory="path"的命令行指定配置文件所在的位置。

文件的配置:

配置文件对于net-snmp的运行十分重要,net-snmp中提供了一个EXAMPLE.conf。

可以在EXAMPLE.conf的基础上进行修改,需要修改的地方主要包括:

1)com2sec设置可访问的IP地址,访问的口令以及分组

#    sec.name               source                 community

com2seclocal             localhost                 private

com2secmynetwork   10.8.0.0/16             private

2)group  设置安全用户名的组

#             sec.model         sec.name

group        MyRWGroupv1        local

group        MyRWGroupv2c       local

group        MyRWGroupusm       local

group        MyROGroupv1        mynetwork

group        MyROGroupv2c       mynetwork

group        MyROGroupusm       mynetwork

3)view 可以对哪些MIB子树进行访问

#              incl/excl               subtree                         mask

viewall         included             .1

4)access  指定各个组对MIB子数的读写权限

#      contextsec.model sec.level match            read write notif

accessMyROGroup""     any      noauth   exact all   none   none

accessMyRWGroup""     any      noauth   exact all   all   none

3、命令行

在./configure;make;makeinstall之后在net-snmp/agent目录下会生成一系列的可执行文件。

可以用命令行调用这些执行文件,主要用于测试。

主要的命令包括:

先在一个窗口中执行./snmpd

1、snmptable

再打开另一个窗口执行snmptable–v1–cdemopublic-Oslocalhost sysORTable,会显示sysORTable的详细信息。

(获得table的信息)

2、snmpget

可以执行snmpget–v1–cpubliclocalhostSNMPv2-MIB:

:

sysUpTime.0,会得到sysUpTime变量的值。

(获得普通变量的信息)。

3、......

自己查吧:

http:

//net-

4、创建私有MIB文件

想要扩展agent吗?

先学写MIB文件。

MIB文件的格式比较简单,参照标准MIB文件写就OK了,之后可以用MG-soft编译。

在archlinux上MIB文件库是放在/usr/share/snmp/mibs/下面。

几点注意的问题:

1、注意IMPORTS私有mib的上级节点

2、注意IMPORTS变量的类型名,如DisplayString,直接使用的话是不能识别的。

3、注意大小写。

4、注意编译的时候一定把error和warning全都消灭掉。

5、扩展agent

到这里你已经应该正确的写出了一个私有的MIB文件,你需要把它放置到系统的MIB文件库中。

我的系统的MIB库路径是/usr/share/snmp/mibs/。

然后开始学习使用MIB2C这个强大的工具,它的作用是把你写好的一个MIB文件,转化成一个或多个在net-snmp下可以使用的.c/.h文件。

一个简单的例子:

当你写成了一个叫做ucdDemoPublic的私有MIB文件。

mib2c-cmib2c.scalar.conf ucdDemoPublic就可以生成ucdDemoPublic.c和ucdDemoPublic.h

MIB2C有很多版本,也有很多参数可供选择,可以在netsnmp的官网上查到:

http:

//net-

重要的参数是–c后面的那个.conf值:

mib2c.mfd.conf

mib2c.scalar.conf

mib2c.int_watch.conf

mib2c.iterate.conf

mib2c.create-dataset.conf

mib2c.array-user.conf

mib2c.column_defines.conf

mib2c.column_enums.conf

一个重要的问题:

在使用mib2c时,需要配置一个mib2c的配置文件:

snmp.conf

我的配置文件路径是:

/var/net-snmp/snmp.conf

在配置文件中要加入类似下面的语句,表示我要把XXX-MIB.txt这个mib文件转化成c文件。

mibfile/usr/share/snmp/mibs/XXX-MIB.txt

简单变量的代码生成

用mib2c.scalar.conf生成简单MIB变量的XXX.c和XXX.h,如上例。

生成MIB之后需要自己根据具体参数的含义,修改get或set时的动作。

在XXX.c中包含两个重要的函数:

init_XXX()和handle_XXX(),需要在init_XXX中修改oid,在handle_XXX中的caseMODE_GET和caseMODE_SET_ACTION中设置GTE和SET的函数。

Table变量的代码生成

用mib2c.mfd.conf生成table类型的MIB文件,生成的文件比较多,包括:

XXX.c/.h;XXX_data_access.c/.h;XXX_data_get.c/.h;XXX_data_set.c/.h;XXX_enums.h;XXX_interface.c/.h;XXX_oids.h;

Snmpget的修改:

需要修改的是XXX_data_access.c中的XXX__container_load函数,修改XXXTable中的变量值。

Snmpset的修改:

需要修改的是:

XXX_data_set.c:

XXXTable_commit中设置rowreq_ctx->column_set_flags的值,表示已经修改了XXXTable中的某一项。

XXX_data_set.c:

中所有的XXX_set.c中指定自己想要的值。

代码集成     

生成了正确的.c/.h文件之后,需要把代码继承到snmpd中,有两种比较靠谱的方法:

1、 把所扩展的agentMIB,静态的集成到snmpd中。

方法:

把所生成的.c/.h文件拷贝到/net-snmp/agent/mibgroup下面,然后重新./configure--with-mib-modules="XXX";make;makeinstall,好了你的私有MIB已经被静态集成到snmpd里面了,最后用命令行snmpget;snmpset试验一下。

2、 是动态加载的方式,自己写一个makefile,把所有生成的.c/.h编译成为一个.so,把这个.so放到一个特定的路径下面,并在snmpd.conf文件中指明.so的位置。

1)编译的时候除指定-fPIC-shared-O0参数之外,还需要指定=-I.`net-snmp-config--cflags`,在最后链接成.so的时候还需要指定`net-snmp-config--libs`参数

2)在需要在snmpd.conf文件中指定.so的位置:

dlmodexampleTable/usr/lib/exampleTable.so

3)在运行./snmpd的时候需要指定所需的.so如:

./snmpd–f–L–Dexample,DLmod,

这样也可以实现对agent的动态扩展。

6、扩展trap

net-snmp的trap也是可以扩展的,我用的方法是把写好的trap代码(.c)放到snmp/snmplib下面,修改一下snmplib的Makefile,make;makeinstall,即可

其代码的样例如下:

viewplaincopytoclipboardprint?

#include  

#include  

config_require(util_funcs)          

int TrapSendTest()  

{  

   netsnmp_sessionsession,*ss;  

   netsnmp_pdu*pdu;  

   longsysuptime;  

   charcsysuptime[20];  

   intstatus=0;  

   oidoid_sysuptime[]={1,3,6,1,2,1,1,3,0};  

   char*cp1="10.8.72.1",*cp2="public";   

 

   snmp_sess_init(&session);  

   session.version=SNMP_VERSION_2c;  

   session.peername=cp1;  

   session.remote_port=162;  

   munity=(unsignedchar*)cp2;  

   munity_len=strlen((char*)munity);  

   session.retries=3;  

   session.timeout=2000;  

   session.sessid=0;  

 

   SOCK_STARTUP;  

   ss=snmp_add(&session,netsnmp_transport_open_client("snmptrap",   

       session.peername),  

       NULL,   

       NULL);  

   if(ss==NULL)   

   {  

       snmp_sess_perror("snmptable",&session);  

       SOCK_CLEANUP;  

   }  

   pdu=snmp_pdu_create(SNMP_MSG_TRAP2);    

   sysuptime=get_uptime();  

   sprintf(csysuptime,"%ld",sysuptime);   

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2