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