SNMP基础概念
一、什么是SNMP?
SNMP=Simple Network Management Protocol (简单网络管理协议)
SNMP是被广泛接受并投入使用的工业标准,提供了一个框架来定义管理信息以及用于这些信息交换的协议。它是一个应用层协议,作为TCP/IP协议组的一部分,在UDP(User Datagram Protocol,用户数据报协议)上操作。它采用轮询机制,提供最基本的功能集。最适合小型、快速、低价格的环境使用。
SNMP模型假设存在管理者和代理。管理者是管理系统中的软件模块,代表网络管理应用程序和用户负责管理一部分或全部的配置;代理是被管设备中的软件模块,负责维护本地的管理信息,并通过SNMP向管理者传递这些信息。管理信息交换可以由管理者引发(通过调查),也可以由代理来引发(通过捕获)。
SNMP管理的数据包括被管理对象、代理和网络管理系统(NMS)三个主要组件。被管理设备是网络节点,包括一个驻留的SNMP代理(Agent);NMS监测并控制被管理设备。
二、SNMP能作什么?
SNMP用于在网络设备间交换管理信息,保证管理信息在任意两点中传送,便于网络管理员在网络上的任何节点检索信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成,使网络管理人员能够管理网络,发现并解决网络问题,规划网络的发展。
三、SNMP的优势是什么?
1、SNMP协议的最大优势就是设计简单,既不需要复杂的实现过程,也不会占用太多的网络资源,非常便于使用;
2、使用非常广泛,几乎所有的网络管理人员都喜欢使用简单的SNMP来完成工作操作。这就促使各大网络硬件产品商在设计和生产网桥、路由器等网络设备时都加入了对SNMP协议的支持;
3、良好的可扩展性是SNMP协议的另外一个可取之处。因为协议本身非常简单,所以对协议的任何升级或扩展也非常方便,从而能够满足今后网络的发展需求。
四、SNMP存在什么不足?
1、 SNMP协议存在一些安全漏洞,网络入侵者很容易获取正在通过网络传递的各种信息,设置可以关闭某些终端。新版本SNMPv2中增加了一些安全机制,可以有效的解决以下几种安全性问题:数据的保密性——可以防止网络入侵者获取网络信息;验证——可以防止网络入侵者通过网络发送虚假数据;访问控制——限制不同用户可以使用的变量类型,从而避免由于单个用户的错误操作所引发的网络崩溃;
2、SNMP协议的最大问题还是由于太过简单而无法处理各种细节信息,无法满足当今日益膨胀的网络的发展需要。新版本SNMPv2允许使用更多、更加详细的变量规范,并且加入了两种新的PDU可以对方便数据读取的表数据结构对象进行管理和控制。SNMPv2使协议规范从最初的36页猛增到416页,已经丧失了原先的简单性;
3、SNMPv2仍然只停留在理论阶段,SNMPv2的失败主要应当归因于开发商不能在关键性的问题上达成一致。此外,目前也很难找到能够全面支持SNMPv2协议各种扩展功能的产品。事实上,SNMP所获得的空间成功从某种意义上也影响了SNMPv2的进一步发展,无论是SNMPv2还是更高版本的SNMPv3似乎都无法成为SNMP的合格继承者;
4、由于调查性能的局限,SNMP可能不适合真正大型网络的管理。使用SNMP,必须发送一个包来获得一个包的信息,这种类型的调查结果导致大量的路由消息并产生不可能接受的响应时间问题;
5、SNMP并不完全适合接受大量的数据,例如整个路由表;
6、SNMP trap不被确认。在典型的用UDP/IP来递交消息的情况下,代理不能够确认关键消息是否已经到达管理工作站;
7、基本的SNMP标准只提供了基本的鉴别。因此,基本的SNMP只适合于监视,而不适合于控制;
8、SNMP并不直接支持命令式的命令。在代理引发事件的唯一途径是通过设定对象的取值间接实现的,这是比某种类型的远程过程调用更不灵活和无力的方案,远程过程调用要报告参数、条件、状态和结果;
9、SNMP MIB模型有局限性,并不容易支持那些真正基于对象的类型和取值来进行复杂查询的应用程序;
10、SNMP不支持管理站到管理站之间的通信。例如,没有一种机制允许管理系统知道有另外一套管理系统管理的设备和网络的情况。
五、什么是SMI?
SMI=Structure of Management Information(管理信息结构)
SMI确定了可用于MIB中的数据类型并说明对象在MIB内部怎样表示和命名。它只能检索标量,包括表中的单个条目,不支持复杂数据结构的创建检索。原因在于MIB内部鼓励简单性和可扩展性。
SMI通过定义一个宏OBJECT-TYPE,规定了管理对象的表示方法,从这个意义上说,它是ASN.1的一个子集。
六、什么是MIB?
MIB=Management Information Base(网络管理信息库)
MIB是网络管理数据的标准,在这个标准里规定了网络代理设备必须保存的数据项目,数据类型,以及允许在每个数据项目中的操作。通过对这些数据项目的存取访问,就可以得到该网关的所有统计内容。再通过对多个网关统计内容的综合分析即可实现基本的网络管理。
MIB是管理对象信息的集合,本质上是一个分层组织的树形结构数据库。网络中的每个设备都是一个对象元素,MIB由被管理对象组成,并有对象标识。对象标识在MIB树中唯一标识一个被管理对象。
作为访问集,MIB的职能就是为管理工作站指定代理。可以通过修改变量来改变代理中配置的设置。
七、什么是ASN.1?
ASN.1是由CCITT(X.208)和ISO(ISO 8824)开发和标准化的正式语言,是一种可以用来定义数据结构的语言。他可用于定义应用程序数据的抽象语法、定义应用程序结构和表示PDU、为SNMP和OSI系统管理定义管理信息库。
抽象语法:描述独立于任何用于表示数据的编码技术的通用数据结构,该语法允许定义数据类型并规定这些类型的取值。
ASN.1规范的基本组成单元是模块(module)。结构定义以命名模块的形式来进行,然后模块的名称就可以被用来引用该结构。
模块的基本形式为
<modulereference> DEFINITIONS ::=
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
Modulereference是模块名称,后面可以跟一个对象标识符来标识该模块。EXPORTS结构表示该模块中的一个定义可以由其他模块引入;IMPORTS接口表示有其他模块中的哪一些类型和取值定义要被引人到该模块中。如果没有包括该模块的对象标识符,就没有IMPORTS或EXPORTS结构。最后赋值列表由类型赋值、取值赋值和宏定义组成。
类型和取值赋值有下面的形式 <name>::=<description>
宏定义:
八、SNMP支持的操作有哪些?
SNMP支持的操作仅仅是对变量的修改和检查,对标量对象有三种一般用途的操作:
Get:管理站从被管理站中检索标量对象的取值。
Set:管理站更新被管理站的标量对象的取值。
Trap:被管理站向管理站主动发送标量对象取值。
通过添加或删除对象实例来改变MIB的结构是不可能的,发送一个命令要求执行一定的动作也是不可能的。在对象标识符树中,只提供对终端对象的访问,不可能通过一个具有基本特性的动作来访问整个表或表中的一行。这些限制极大简化了SNMP的实现,但另一方面也限制了网络管理系统的性能。
九、什么是community?
管理系统需要保护自己和自己的MIB不被授权的访问所访问,SNMP为这些安全问题提供了基本的有限的功能,概念上称之为公用体。
公共体指定义验证、访问控制和代理特征的SNMP管理者与SNMP代理之间的关系。公共体是本地概念,在被管理系统中定义。被管理系统为每个被要求的验证、访问控制和代理特征的组合建立一个公共体,每个公共体被赋予一个(在代理内部)公共体名。
由于公共体代理本地定义,不同的代理可以使用相同的名称。
用途:
鉴别服务——确保通信是可信的,community的功能和密码一样。
访问策略——访问控制有两方面,SNMP MIB视图(MIB内部对象的一个子集)和SNMP访问模式(READ-ONLY和READ-WRITE),两者的组合称为SNMP公共体轮廓。可以通过community指定访问策略。
代理服务器服务——代理系统为代表的每一个设备保留一个community从而控制对每一个设备的访问策略。
十、什么是对象、对象标识符、对象实例?
对象(Object):在SNMP上下文中代表某一资源或被管理设备的其他方面的数据变量,也指被管理对象。
对象标识符(OID):在MIB内部唯一确定一个对象。对象标识符是由点号隔开的整数序列,该序列定义对象在树型结构的MIB中的位置,该对象本身也是该树型结构的一部分。
对象实例:确定要取某一具体数值的对象类型的某一具体实例。
表中的列对象:一个表有多个实例,表通过INDEX对象来区分每一列的多个对象,简单的表只有一个INDEX对象,对于更复杂的情况,例如tcp组中的tcpConnTable,该表含有四个INDEX对象,因此表中五个列对象的任何一个列对象的实例标识符就由该对象的标识符串接四个INDEX对象为特定行的取值组成的。更一般的描述:给定其对象标识符为y的对象和表中的INDEX对象i1、i2、……、iN,则特定行中一个对象实例的实例标识符为y.i1.i2.…….iN
字典序:对象标识符是反映MIB中对象的层次或树型结构的整数序列,给定MIB的树型结构,特定对象的对象标识符可以通过从根到该对象的路径衍生出来。父结点的子结点总是按升序描述
十一、SNMP的协议规范
管理工作站和代理之间的信息交换以SNMP消息的形式进行,每一条消息包含指示SNMP版本的版本序列和5种协议数据单元(GetRequest、GetNextRequest、SetRequest、GetResponse、Trap)类型中的一种。
1、SNMP格式
(a)SNMP message
Version |
Community |
SNMP PDU |
(b)GetRequest PDU、GetNextRequest PDU、SetRequest PDU
PDU type |
request-id |
0 |
0 |
variablebindings |
(c)GetResponse PDU
PDU type |
request-id |
error-status |
error-index |
variablebindings |
(d)Trap PDU
PDU type |
enterprise |
agent-addr |
generic-trap |
specific-trap |
time-stamp |
variablebindings |
(e)variablebindings
name1 |
value1 |
name2 |
value2 |
…… |
namen |
valuen |
2、SNMP的运行过程
驻留在被管设备上的AGENT从UDP端口161接受来自网管站的串行化报文,经解码、团体名验证、分析得到管理变量在MIB树中对应的节点,从相应的模块中得到管理变量的值,再形成响应报文,编码发送回网管站。网管站得到响应报文后,再经同样的处理,最终显示结果。
(1) SNMP消息的传输
第一:使用ASN.1的结构来构造PDU;
第二:该PDU来源及目的传输层地址和公共体名称一起被送往鉴别服务,鉴别服务对这些交换执行要求的变换,例如加密或包含鉴别密码,然后返回结果;
第三:协议实体构造消息,包括版本字段、公共体名称和从第二步返回的结果;
第四:新的ASN.1对象使用BNR对其编码,然后送往传输服务。
(2) SNMP消息的接收者
第一:解码生成用内部数据结构表示的报文,解码依据ASN.1的基本编码规则,如果在此过程中出现错误导致解码失败则丢弃该报文,不做进一步处理;
第二:将报文中的版本号取出,如果与本Agent支持的SNMP版本不一致,则丢弃该报文,不做进一步处理。当前北研的数据通信产品只支持SNMP版本1;
第三:将报文中的团体名取出,此团体名由发出请求的网管站填写。如与本设备认可的团体名不符,则丢弃该报文,不做进一步处理,同时产生一个陷阱报文。SNMPv1只提供了较弱的安全措施,在版本3中这一功能将大大加强;
第四:从通过验证的ASN.1对象中提出协议数据单元PDU,如果失败,丢弃报文,不做进一步处理。否则处理PDU,结果将产生一个报文,该报文的发送目的地址应同收到报文的源地址一致。
根据不同的PDU,SNMP协议实体将做不同的处理:
1)、GetRequestPDU:
第一种情况:如果PDU中的变量名在本地维护的MIB树中不存在,则接受到这个PDU的协议实体将向发出者发送一个GetResponse报文,其中的PDU与源PDU只有一点不同:将ERROR-STATUS置为noSuchName,并在ERROR-INDEX中指出产生该变量在变量LIST中的位置。
第二种情况:如果本地协议实体将产生的响应报文的长度大于本地长度限制,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为tooBig,ERROR-INDEX置为0以外,与源PDU相同。
第三种情况:如果本地协议实体因为其他原因不能产生正确的响应报文,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为genErr,ERROR-INDEX置为出错变量在变量LIST中的位置,其余与源PDU相同。
第四中情况:如果上面的情况都没有发生,则本地协议实体向该PDU的发出者发送一个GetResponse报文,该PDU中将包含变量名和相应值的对偶表,ERROR-STATUS为noError,ERROR-INDEX为0,request-id域的值应与收到PDU的request-id相同。
2)、GetNextRequestPDU
GetNextRequestPDU的最重要的功能是表的遍历,这种操作受到了前面所说的管理变量的表示方法的支持,从而可以访问一组相关的变量,就好象他们在一个表内。
有如下一个表:
ipRouteDest |
ipRouteMetric1 |
ipRouteNextHop |
9.1.2.3 |
3 |
99.0.0.3 |
10.0.0.51 |
5 |
89.1.1.42 |
10.0.0.99 |
5 |
89.1.1.42 |
假设管理工作站希望能构检索整个表,但当前不知道其中的内容,甚至表中的行数。管理工作站可以发送一个包含所有列对象名称的GetNextRequest: GetNextRequest(ipRouteDest,ipRouteMetric1,ipRouteNextHop)
代理将会返回表中的第一行的取值:
GetResponse((ipRouteDest.9.1.2.3=9.1.2.3),(ipRouteMetric1.9.1.2.3=3),(ipRouteNextHop.9.1.2.3=99.0.0.3))
管理工作站可以存储这些结果并用下面的语句来检索第二行:
GetNextRequest(ipRouteDest.9.1.2.3,ipRouteMetric1.9.1.2.3,ipRouteNextHop.9.1.2.3)
SNMP代理响应为:
GetResponse((ipRouteDest.10.0.0.51=10.0.0.51),(ipRouteMetric1.1.0.0.0.51=5),(ipRoute NextHop.10.0.0.51=89.1.1.42))
接下来出现一下交换:
GetNextRequest(ipRouteDest.10.0.0.51,ipRouteMetric1.10.0.0.51,ipRouteNextHop.10.0.0.51)
GetResponse((ipRouteDest.10.0.0.99=10.0.0.99),(ipRouteMetric1.10.0.0.99=5),(ipRouteNextHop.10.0.0.99=89.1.1.42))
管理工作站不知道这是表的末尾,因此继续:
GetNextRequest(ipRoutDest.10.0.0.99,iprouteMetric1.10.0.0.99,ipRouteNextHop.10.0.0.99)
然而表中再没用更多的行了,因此代理返回MIB视图中按字典顺序的下一个对象:
GetResponse((ipRouteMeric1.9.1.2.3=3),(ipRouteNextHop.9.1.2.3=99.0.0.3),(ipNetToMediaInIndex.1.3=1))
由于响应列表中对象的名称与请求不匹配,这就指示管理工作站已经到达了路由表的末端。
3)、GetResponsePDU
GetResponsePDU只有当受到getRequestGetNextRequestSetRequest才由协议实体产生,网管站收到这个PDU后,应显示其结果。
4)、SetRequestPDU
SetRequestPDU除了PDU类型标识以外,和GetRequest相同,当需要对被管变量进行写操作时,网管站侧的协议实体将生成该PDU。
对SetRequest的响应将根据下面情况分别处理:
(1).如果是关于一个只读变量的设置请求,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为noSuchName,errorindex的值是错误变量在变量list中的位置。
(2).如果被管设备上的协议实体收到的PDU中的变量对偶中的值,类型、长度不符和要求,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为badValue,errorindex的值是错误变量在变量list中的位置。
(3).如果需要产生的GetReponse报文长度超过了本地限制,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为tooBig,errorindex的值是0。
(4).如果是其他原因导致SET失败,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为genErr,errorindex的值是错误变量在变量list中的位置。
如果不符合上面任何情况,则agent将把管理变量设置收到的PDU中的相应值,这往往可以改变被管设备的运行状态。同时产生一个GetResponsePDU,其中errorstatus置为noError,errorindex的值为0。
十二、在 Windows XP 上安装SNMP
1、以管理员的身份登陆;
2、点击开始,指向设置,点击控制面板, 双击添加或删除程序, 然后点击添加/删除 Windows 组件;
3、点击管理和监视工具 (但不要选择或清除其复选框), 然后点击详细信息;
4、选择简单网络管理协议复选框,并点击确定,点击下一步;
5、插入相应的CD 或指定文件存储位置的完整路径,然后点击继续;
6、SNMP 会在安装后自动启动;这样将完成安装过程。
十三、使用NET-SNMP包开发程序
1、在windows平台下编译NET-SNMP
只需把源码下的win32目录中的几个库的工程编译就行了。但注意,要把netsnmp.lib放在最后编译,否则编译结果不一样。最后用编译出来的四个库文件:netsnmp.lib , netsnmpagent.lib , netsnmphelpers.lib , netsnmpmibs.lib,来编译netsnmp.dll。注意还要加上wsock32.lib。如果编译出错,提示跟VC默认的库有冲突,按提示在编译环境中用NODEFAULTLIB:XXX来去掉VC的缺省库文件。
2、设置编译环境
A、工程放在开发包的win32文件夹下;
B、打开VC++6.0编译器,Project->C/C++->Category选择Preprocessor,在Additional include directories下填写.,..,..\..\snmplib,..\..,..\..\include,这是include的路径,不填此项在编译时会报错找不到<netsnmp/**.h>;
C、Project->Link->Category选择General,在Object/library modules下添加netsnmp.lib netsnmpagent.lib netsnmphelpers.lib netsnmpmibs.lib netsnmptrapd.lib Ws2_32.lib,其中前五个正是编译NET-SNMP包时得到的.lib库文件,最后一个是Windows下socket编程所要包含的库文件;然后在Project->Link->Category选择Input,在Additional library path下填写../lib/debug,这是那五个库文件的路径。这一步设置解决链接时的错误。
十四、NET-SNMP包中的命令
1、snmpget ——通过给出主机名、访问权限及对象标识符从远程主机获取其相关数据
例如:snmpget -c demopublic -v 2c test.net-snmp.org system.sysUpTime.0
结果:system.sysUpTime.0 = Timeticks: (586731977) 67 days, 21:48:39.77
其中test.net-snmp.org 是将要访问的主机名,demopublic 是SNMP的community,OID是system.sysUpTime.0. 早期的ucd-snmp默认使用的是SNMPv1,而且community在主机名后.
注意不能少后缀‘0’,否则会出错,版本1和版本2的报错不同:
snmpget -v 1 -c demopublic test.net-snmp.org sysUpTime
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
This name doesn't exist: system.sysUpTime
Snmpget -v 2c -c demopublic test.net-snmp.org sysUpTime
system.sysUpTime = No Such Instance currently exists
可以同时访问多个变量:
snmpget -v 2c -c demopublic test.net-snmp.org sysUpTime.0 ucdDemoUserList.0
system.sysUpTime.0 = Timeticks: (586903243) 67 days, 22:17:12.43
enterprises.ucdavis.ucdDemoMIB.ucdDemoMIBObjects.ucdDemoPublic.ucdDemoUserList.0 = " noAuthUser MD5User MD5DESUser SHAUser SHADESUser"
2、snmptable ——获取SNMP中的表信息。
snmptable -v 1 -c public 202.117.11.141 ip.ipNetToMediaTable
注意OID只写到表名,而不写到Entry,也不在末尾加‘.0’
BUGS
The test for TABLE-OID actually specifying a table is rather heuristic.
Note also that the test requires the defining MIB file to be loaded.
3、snmpbulkget——获取设备大批MIB信息
snmpbulkget -v 2c -Cn<NUM> -Cr<NUM> -c public 202.117.11.141 system ifTable
-Cn用来指定对前<NUM>个OID各只进行一次get操作,其余的都从所给OID的下一个对象开始反复执行get以获取若干个对象的信息。默认值为0,即所有列出的OID均可重复多次get;
-Cr用来指定在Cn限制之外的OID分别能顺序获取<NUM>个对象信息。默认值为10,即所有列出的OID默认重复10次get获取10个对象信息。
4、snmpbulkwalk——作用和用法与snmpwalk类似,读取子 信息,区别在于一个用于SNMPv2,一个用于SNMPv1
snmpbulkget也能像snmpbulkwalk一 实现子 的遍历,两者的区别在于前者对获取的每一个变量作单独转换,而后者则是收集到子 的所有信息之后做一次转换,可见snmpbulkwalk比snmpbulkget高效。
十五、什么是VLAN
VLAN(Virtual Local Area Network)即虚拟局域网,是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的新兴技术。VLAN的划分有三种方式:基于端口(Port)、基于MAC地址和基于IP地址。通过划分虚拟网,可以把广播限制在各个虚拟网的范围内,从而减少整个网络范围内广播包的传输,提高了网络的传输效率;同时各虚拟网之间不能直接进行通讯,而必须通过路由器转发,为高级的安全控制提供了可能,增强了网络的安全性。虽然VLAN并非最好的网络技术,但这种用于网络结点逻辑分段的方法正为许多企业所使用。VLAN采用多种方式配置于企业网络中,包括网络安全认证、使无线用户在802.11b接入点漫游、隔离IP语音流在不同协议的网络中传输数据等虚拟局域网(VLAN)的出现打破了传统网络的许多固有观念,使网络结构变得灵活、方便