现在的位置: 首页 > 综合 > 正文

SNMP大乱转

2013年10月16日 ⁄ 综合 ⁄ 共 20380字 ⁄ 字号 评论关闭

 1. 网络管理基本概念
  随着计算机和通信技术的飞速发展,网络管理技术已成为重要的前言技术。目前还没有对

网络管理的精确定义。例如,对公用交换网,网络管理通常指实时网络监控,以便在不利的条

件下(如过载、故障)使网络的性能仍能达到最佳。又如,狭义的网络管理仅仅指网络的通信

量管理,而广义的网络管理指网络的系统管理。网络管理功能可概括为OAM﹠P,即网络的运行

(Operation)、处理(Administration)、维护(Maintenance)、服务提供(Provisioning

)等所需要的各种活动。有时也考虑前三种,即把网络管理功能归结为OAM。

☆ SNMP术语和概念
ASN.1: 一个SNMP消息通过抽象语法记法1(Abstract Syntax Notation, version 1)
构造。ASN.1是一种形式语言。

BER : 将ASN.1描述表示成octet strings的基本编码规则

MIB : 管理信息库。下面是一个例子

sysUpTime OBJECT-TYPE
SYNTAX TimeTicks
ACCESS read-only
STATUS mandatory
DESCRIPTION
"距最后一次系统重启动的时间"

OID : 对象标识符是唯一的点分数字串,比如".1.3.6.1.2.1.4.3.0"

PDU : 协议数据单元是SNMP消息中的数据区。

SMI : 管理信息结构是一套描述SNMP如何访问信息的标准,它用ASN.1定义了MIB。
SMI要求每个数据项有name、syntax和encoding三部分。名字就是OID。语法
给出了数据类型,比如"integer"、"string of octets"等等。编码则指明为
了进行平台无关网络转输如何进行数据的序列化(RPC/XDR中存在类似概念)。

网络管理通常用到以下术语:

  网络元素(network element)
  网络中具体的通信设备或逻辑实体,又称网元。

  对象(object)
  通信和信息处理范畴里可标识的切拥有一定信息特性的资源。但应注意,这里所用的“对

象”与面向对象系统中所定义的对象并不完全一样。

  被管理对象(managed object)
  被管理对象指可使用管理协议进行管理和控制的网络资源的抽象表示。例如,一个层的实

体或一个连接。

  管理信息库MIB
  MIB是网络管理系统中的重要构件,它有一个系统内的许多被管对象及其属性组成。MIB这

个概念实际上就是一个虚拟数据库。这个数据库提供有关被管理网络元素的信息,而这些信息

由管理进程和各个代理进程共享。MIB由管理进程和各个代理进程共同使用。

  综合网络管理INM
  用统一的方法在一个异构网络中管理多厂商生产的计算机硬件和软件资源。这也称为一体

化网络管理。

  OSI很早就在OSI的总体标准中提出了网络管理标准的框架,即ISO 7498-4。ITU-T在网络管

理方面紧密地和ISO合作,制订了与ISO 7498-4相对应的X.700系列建议书。

  ISO 和ITU-T制订的两个重要标准是:
  (1)ISO 9595 ITU-T X.710 公共管理信息服务定义CMIS
  (2)ISO 9596 ITU-T X.711 公共管理信息协议规格说明CMIP

2. 简单网络管理协议SNMP概述  
2.1 SNMP的发展
  简单网络管理协议(SNMP)是目前TCP/IP网络中应用最为广泛的网络管理协议。1990年5月

,RFC 1157定义了SNMP(simple network management protocol)的第一个版本SNMPv1。RFC

1157和另一个关于管理信息的文件RFC 1155一起,提供了一种监控和管理计算机网络的系统方

法。因此,SNMP得到了广泛应用,并成为网络管理的事实上的标准。

  snmp在90年代初得到了迅猛发展,同时也暴露出了明显的不足,如,难以实现大量的数据

传输,缺少身份验证(Authentication)和加密(Privacy)机制。因此,1993年发布了SNMPv2

,具有以下特点:

  支持分布式网络管理
  扩展了数据类型
  可以实现大量数据的同时传输,提高了效率和性能
  丰富了故障处理能力
  增加了集合处理功能
  加强了数据定义语言

  但是,SNMPv2并没有完全实现预期的目标,尤其是安全性能没有得到提高,如:身份验证

(如用户初始接入时的身份验证、信息完整性的分析、重复操作的预防)、加密、授权和访问

控制、适当的远程安全配置和管理能力等都没有实现。1996年发布的SNMPv2c是 SNMPv2的修改

版本,功能增强了,但是安全性能仍没有得到改善,继续使用SNMPv1的基于明文密钥的身份验

证方式。IETF SNMPv3工作组于1998年元月提出了互联网建议RFC 2271-2275,正式形成SNMPv3

。这一系列文件定义了包含SNMPv1、SNMPv2所有功能在内的体系框架和包含验证服务和加密服

务在内的全新的安全机制,同时还规定了一套专门的网络安全和访问控制规则。可以说,

SNMPv3是在SNMPv2基础之上增加了安全和管理机制。

  Internet还有一个远期的网络管理标准CMOT(Common Management information service

and protocol Over TCP/IP),意思是 “在TCP/IP上的公共管理信息服务与协议”。虽然CMOT

使用了OSI的网络管理标准CMIS/CMIP,但现在还未达到实用阶段。

  SNMP最重要的饿知道思想就是要尽可能简单,以便缩短研制周期。SNMP的基本功能包括监

视网络性能、检测分析网络差错和配置网络设备等。在网络正常工作时,SNMP可实现统计、配

置和测试等功能。当网络出故障时,可实现各种差错检测和恢复功能。虽然SNMP是在TCP/IP基

础上的网络管理协议,但也可扩展到其他类型的网络设备上。

2.2 SNMP的配置
  整个系统必须有一个管理站(management station),它实际上是网控中心。在管理站沙

锅内运行管理进程。在每个被管对象中一定要有代理进程。管理进程和代理继承利用SNMP报文

进行通信,而SNMP报文又使用UDP来传送。图中有两个主机和一个路由器。这些协议栈中带有阴

影的部分是原俩这些主机和路由器所具有的,而没有阴影的部分是为实现网络管理而增加的。

  有时网络管理协议无法控制某些网络元素,例如该网络元素使用的是另一种网络管理协议

。这是可使用委托代理(proxy agent)。委托代理能提供如协议转换和过滤操作的汇集功能。

然后委托代理来对管理对象进行管理。
  SNMP的网络管理由三部分组成,即管理信息库MIB、管理信息结构SMI以及SNMP本身。下面

简要介绍。

3. 管理信息库MIB
  管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。

MIB给出了一个网络中所有可能的被管理对象的集合的数据结构。 SNMP的管理信息库采用和域

名系统DNS相似的树型结构,它的根在最上面,根没有名字。图3画的是管理信息库的一部分,

它又称为对象命名(object naming tree)。

  对象命名树的顶级对象有三个,即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管理的信息类别
  
    类别           标号     所包含的信息
    system         (1)     主机或路由器的操作系统
    interfaces        (2)     各种网络接口及它们的测定通信量
    address translation  (3)   地址转换(例如ARP映射)
    ip            (4)     Internet软件(IP分组统计)
    icmp          (5)     ICMP软件(已收到ICMP消息的统计)
    tcp           (6)     TCP软件(算法、参数和统计)
    udp           (7)     UDP软件(UDP通信量统计)
    egp           (8)     EGP软件(外部网关协议通信量统计)

  应当指出,MIB的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在

产品(如路由器)中包含SNMP代理软件,并保证在定义新的 MIB项目后该软件仍遵守标准。用

户可以使用同一网络管理客户软件来管理具有不同版本的MIB的多个路由器。当然,一个没有新

的MIB项目的路由器不能提供这些项目的信息。

  这里要提一下MIB中的对象{1.3.6.1.4.1},即enterprises(企业),其所属结点数已超过

3000。例如IBM为{1.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进行管理。

4. SNMP的5种协议数据单元
  SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换

  get-request操作:从代理进程处提取一个或多个参数值
  get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值
  set-request操作:设置代理进程的一个或多个参数值
  get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面

三种操作的响应操作。
  trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。

  前面的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程

的,为了简化起见,前面3个操作今后叫做get、get-next 和set操作。图4描述了SNMP的这5种

报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用

熟知端口 162来接收trap报文。

  可见一个SNMP报文共有三个部分组成,即公共SNMP首部、get/set首部trap首部、变量绑定

  (1)公共SNMP首部

  共三个字段:
  a、版本
  写入版本字段的是版本号减1,对于SNMP(即SNMPV1)则应写入0。

  b、共同体(community)
  共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是6个字符

“public”。

  c、PDU类型
  根据PDU的类型,填入0~4中的一个数字,其对应关系如表2所示意图。

        表2 PDU类型

     PDU类型       名称

     0       get-request
      1       get-next-request
      2       get-response
      3       set-request
      4       trap

  (2)get/set首部
  a、请求标识符(request ID)
  这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求

标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能

后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文。

  b、差错状态(error status)
  由代理进程回答时填入0~5中的一个数字,见表3的描述。

              表3 差错状态描述

      差错状态    名字         说明

      0       noError      一切正常
      1       tooBig      代理无法将回答装入到一个SNMP报文之中
      2       noSuchName   操作指明了一个不存在的变量
      3       badValue    一个set操作指明了一个无效值或无效语法
      4       readOnly    管理进程试图修改一个只读变量
      5       genErr      某些其他的差错

  c、差错索引(error index)
  当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数

,它指明有差错的变量在变量列表中的偏移。

  (3)trap首部
  a、企业(enterprise)
  填入trap报文的网络设备的对象标识符。此对象标识符肯定是在图3的对象命名树上的

enterprise结点{1.3.6.1.4.1}下面的一棵子树上。

  b、trap类型
  此字段正式的名称是generic-trap,共分为表4中的7种。

          表4 trap类型描述

   trap类型   名字           说明

    0     coldStart         代理进行了初始化
    1     warmStart        代理进行了重新初始化
    2     linkDown         一个接口从工作状态变为故障状态
    3     linkUp          一个接口从故障状态变为工作状态
    4    authenticationFailure   从SNMP管理进程接收到具有一个无效共同体的

报文
    5    egpNeighborLoss     一个EGP相邻路由器变为故障状态
    6    enterpriseSpecific     代理自定义的事件,需要用后面的“特定代

码”来指明

  当使用上述类型2、3、5时,在报文后面变量部分的第一个变量应标识响应的接口。

   特定代码(specific-code)
  指明代理自定义的时间(若trap类型为6),否则为0。

  时间戳(timestamp)
  指明自代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms。例如时间戳为

1908表明在代理初始化后1908ms发生了该时间。

  (4)变量绑定(variable-bindings)
  指明一个或多个变量的名和对应的值。在get或get-next报文中,变量的值应忽略。

5.管理信息结构SMI
  SNMP中,数据类型并不多。这里我们就讨论这些数据类型,而不关心这些数据类型在实际

中是如何编码的。

  a、INTEGER
  一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量

定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),

有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号就从0到65535)。

  b、OCTER STRING
  0或多个8 bit字节,每个字节值在0~255之间。对于这种数据类型和下一种数据类型的BER

编码,字符串的字节个数要超过字符串本身的长度。这些字符串不是以NULL结尾的字符串。

  c、DisplayString
  0或多个8bit字节,但是每个字节必须是ASCII码。在MIB-II中,所有该类型的变量不能超

过255个字符(0个字符是可以的)。

  d、OBJECT IDENTIFIER

  e、NULL
  代表相关的变量没有值。例如,在get或get-next操作中,变量的值就是NULL,因为这些值

还有待到代理进程处去取。

  f、IpAddress
  4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。

  g、PhysAddress
  OCTER STRING类型,代表物理地址(例如以太网物理地址为6个字节长度)。

  h、Counter
  非负的整数,可从0递增到232—1(4294976295)。达到最大值后归0。

  i、Gauge
  非负的整数,取值范围为从0到4294976295(或增或减)。达到最大值后锁定直到复位。例如

,MIB中的tcpCurrEstab就是这种类型的变量的一个例子,它代表目前在ESTABLISHED或

CLOSE_WAIT状态的TCP连接数。

  j、TimeTicks
  时间计数器,以0.01秒为单位递增,但是不同的变量可以有不同的递增幅度。所以在定义

这种类型的变量的时候,必须指定递增幅度。例如,MIB中的sysUpTime变量就是这种类型的变

量,代表代理进程从启动开始的时间长度,以多少个百分之一秒的数目来表示。

  k、SEQUENCE
  这一数据类型与C程序设计语言中的“structure”类似。一个SEQUENCE包括0个或多个元素

,每一个元素又是另一个ASN.1数据类型。例如,MIB中的UdpEntry就是这种类型的变量。它代

表在代理进程侧目前“激活”的UDP数量(“激活”表示目前被应用程序所用)。在这个变量中

包含两个元素:

  IpAddress类型中的udpLocalAddress,表示IP地址。
  INTEGER类型中的udpLocalPort,从0到65535,表示端口号。
  SEQUENDEOF,这是一个向量的定义,其所有元素具有相同的类型。如果每一个元素都具有

简单的数据类型,例如是整数类型,那么我们就得到一个简单的向量(一个一维向量)。但是

我们将看到,SNMP在使用这个数据类型时,其向量中的每一个元素是一个SEQUENCE(结构)。

因而可以将它看成为一个二维数组或表。

6. SNMPv2协议
  简单性是SNMP标准取得成功的主要原因。因为在大型的、多厂商产品构成的复杂网络 中,

管理协议的明晰是至关重要的,但同时这又是SNMP的缺陷所在——为了使协议简单易行,SNMP简

化了不少功能,如:

   没有提供成批存取机制,对大块数据进行存取效率很低;
  没有提供足够的安全机制,安全性很差;
  只在TCP/IP协议上运行,不支持别的网络协议;
  没有提供manager与manager之间通信的机制,只适合集中式管理,而不利于进行分布式管

理;
  只适于监测网络设备,不适于监测网络本身。

  针对这些问题,对它的改进工作一直在进行。如1991年11月,推出了RMON(Remote Netw ork

Monitoring)MIB,加强SNMP对网络本身的管理能力。它使得SNMP不仅可管理网络设备, 还能收集

局域网和互联网上的数据流量等信息。1992年7月,针对SNMP缺乏安全性的弱点,又 公布了S-

SNMP(Secure SNMP)草案。

  到1993年初,又推出了SNMP Version 2即SNMPv2(推出了SNMPv2以后,SNMP就被称为SNM Pv1)

。SNM-Pv2包容了以前对SNMP所做的各项改进工作,并在保持了SNMP清晰性和易于实现的特点以

外,功能更强,安全性更好,具体表现为:

  提供了验证机制、加密机制、时间同步机制等,安全性大大提高,
  提供了一次取回大量数据的能力,效率大大提高;
  增加了manager和manager之间的信息交换机制,从而支持分布式管理结构。由中间(

intermediate)manager来分担主manager的任务,增加了远地站点的局部自主性。
  可在多种网络协议上运行,如OSI、Appletalk和IPX等,适用多协议网络环境(但它的缺省网

络协议仍是UDP)。

  根据Carnegie-Mellin大学(SNMPv2标准的制定者之一)的Steven Waldbusser测试结果

,SNMPv2的处理能力明显强于SNMPv1,大约是SNMPv1的15倍。

  SNMPv2一共由12份协议文本组成(RFC1441-RFC1452),已被作为Internet的推荐标准予 以公

布。
  可看出它支持分布式管理。一些站点可以既充当 manager又充当agent,同时扮演两个角色

。作为agent,它们接受更高一级管理站的请求命令 ,这些请求命令中一部分与agent本地的数据

有关,这时直接应答即可;另一部分则与远地ag ent上的数据有关。这时agent就以manager的身

份向远地agent请求数据,再将应答传给更高一级的管理站。在后一种情况下,它们起的是proxy(

代理)的作用。

  下面将SNMPv2标准加以详细介绍,包括SNMPv2标准的中的安全机制,SNMPv2标准中的Pa rty

实体,以及如何从通信协议操作、SMI、MIB三方面来看SNMPv2标准。

6.1 SNMPv2标准中的安全机制
  SNMPv2对SNMPv1的一个大的改进,就是增强了安全机制。对管理系统安全的威胁主要有下面

几种:
  (1)信息篡改(modification)
  SNMPv2标准中,允许管理站(manager)修改agent上的一些被管理对象的值。破坏者可能会将

传输中的报文加以改变,改成非法值,进行破坏。因此,协议应该能够验证收到的报文是 否在传

输过程中被修改过。

  (2)冒充(masquerade)
  SNMPv2标准中虽然有访问控制能力,但这主要是从报文的发送者来判断的。那些没有访 问

权的用户可能会冒充别的合法用户进行破坏活动。因此 ,协议应该能够验证报文发送者 的真实

性,判断是否有人冒充。

  (3)报文流的改变(message stream modification)
  由于SNMPv2标准是基于无连接传输服务的,报文的延迟、重发以及报文流顺序的改变都是可

能发生的。某些破坏者可能会故意将报文延迟、重发,或改变报文流的顺序,以达到破坏的目的

。因此,协议应该能够防止报文的传输时间过长,以给破坏者留下机会。

  (4)报文内容的窃取(disclosure)
  破坏者可能会截获传输中的报文,窃取它的内容。特别在创建新的SNMPv2 Party时,必 须保

证它的内容不被窃取,因为以后关于这个Party的所有操作都依赖于它。因此,协议应该 能够对

报文的内容进行加密,保证它不被窃听者获取。

  针对上述安全性问题,SNMPv2中增加了验证(Authentication)机制、加密(Privacy)机 制,

以及时间同步机制来保证通信的安全。

6.2 SNMPv2 Party
  SNMPv2标准中增加了一种叫做Party的实体。Party是具有网络管理功能的最小实体,它 的

功能是一个SNMPv2 entity(管理实体)所能完成的全部功能的一个子集。每个manager和 agent

上都分别有多个Par-ty,每个站点上的各个Party彼此是平等的关系,各自完成自己的功能。实际

的信息交换都发生在Party与Party之间(在每个发送的报文里,都要指定发送方和接收方的Par-

ty)。每个Party都有一个唯一的标识符(party identity)、一个验证算法和参数以及一个加密

算法和参数。Party的引入增加了系统的灵活性和安全性,可以赋予不同的人员以不同的管理权

限。 SNMPv2中有三种安全性机制:验证(authentication)机制、加 密(privacy)机制和访问控

制(access control)机制。这些机制都工作在Party一级,而不是 manager/agent一级。

6.3 SNMPv2协议操作
  SNMPv2标准的核心就是通信协议———它是一个请求/应答式的协议。
  这个协议提供了在manager与agent、manager与manager之间交换管理信息的直观、基本的

方法。
  每条SNMPv2的报文都由一些域构成:
  如果发送方、接收方的两个Party都采用了验证(authentication)机制,它就包含与验证有

关的信息;否则它为空(取NULL)。验证的过程如下:发送方和接收方的Party都分别有一 个验证

用的密钥(secret key)和一个验证用的算法。报文发送前,发送方先将密钥值填入图中digest域

,作为报文的前缀。然后根据验证算法,对报文中digest域以后(包括digest域) 的报文数据进行

计算,计算出一个摘要值(digest),再用摘要值取代密钥,填入报文中的dig est域。接收方收到

报文后,先将报文中的摘要值取出来,暂存在一个位置,然后用发送方的密钥放入报文中的digest

。将这两个摘要值进行比较,如果一样,就证明发送方确实是srcP arty域中所指明的那个Party,

报文是合法的;如果不一样,接收方断定发送方非法。验证机制可以防止非法用户冒充某个合法

Party来进行破坏。
  authInfo域中还包含两个时间戳(time stamp),用于发送方与接收方之间的同步,以防 止报

文被截获和重发。
  SNMPv2的另一大改进是可以对通信报文进行加密,以防止监听者窃取报文内容。除了

privDst域外,报文的其余部分可以被加密。发送方与接收方采用同样的加密算法(如DES)。
  通信报文可以不加任何安全保护,或只进行验证,也可以二者都进行。

7. SNMPv3的体系结构RFC 2271定义的SNMPv3体系结构,体现了模块化的设计思想,可以简单地

实现功能的增加和修改。其特点:
   适应性强:适用于多种操作环境,既可以管理最简单的网络,实现基本的管理功能,又能

够提供强大的网络管理功能,满足复杂网络的管理需求。
  扩充性好:可以根据需要增加模块。
  安全性好:具有多种安全处理模块。

  SNMPv3主要有三个模块:信息处理和控制模块、本地处理模块和用户安全模块。  
  (1)信息处理和控制模块
  信息处理和控制模块(Message Processing And Control Model)在RFC 2272中定义,它

负责信息的产生和分析,并判断信息在传输过程中是否要经过代理服务器等。在信息产生过程

中,该模块接收来自调度器(Dispatcher)的PDU,然后由用户安全模块在信息头中加入安全参

数。在分析接收的信息时,先由用户安全模块处理信息头中的安全参数,然后将解包后的PDU送

给调度器处理。

  (2)本地处理模块
  本地处理模块(Local Processing Model)的功能主要是进行访问控制,处理打包的数据

和中断。访问控制是指通过设置代理的有关信息使不同的管理站的管理进程在访问代理时具有

不同的权限,它在PDU这一级完成。常用的控制策略有两种:限定管理站可以向代理发出的命令

或确定管理站可以访问代理的MIB的具体部分。访问控制的策略必须预先设定。SNMPv3通过使用

带有不同参数的原语使用来灵活地确定访问控制方式。

  (3)用户安全模块
  与SNMPv1和 SNMPv2相比,SNMPv3增加了三个新的安全机制:身份验证,加密和访问控制。

其中,本地处理模块完成访问控制功能,而用户安全模块(User Security Model)则提供身份

验证和数据保密服务。身份验证是指代理(管理站)接到信息时首先必须确认信息是否来自有

权的管理站(代理)并且信息在传输过程中未被改变的过程。实现这个功能要求管理站和代理

必须共享同一密钥。管理站使用密钥计算验证码(它是信息的函数),然后将其加入信息中,

而代理则使用同一密钥从接收的信息中提取出验证码,从而得到信息。加密的过程与身份验证

类似,也需要管理站和代理共享同一密钥来实现信息的加密和解密。

  下面简要介绍身份验证和加密的数学工具。SNMPv3使用私钥(privKey)和验证密钥

(authKey)来实现这两种功能。

  身份验证:RFC2104中定义了HMAC,这是一种使用安全哈希函数和密钥来产生信息验证码的

有效工具,在互联网中得到了广泛的应用。SNMP使用的 HMAC可以分为两种:HMAC-MD5-96和

HMAC-SHA-96。前者的哈希函数是MD5,使用128位authKey作为输入。后者的哈希函数是SHA-1,

使用160位authKey作为输入。

  加密:采用数据加密标准(DES)的密码组链接(CBC)码,使用128位的privKey 作为输入

8. 公共管理信息CMIP
  CMIP协议是在OSI制订的网络管理框架中提出的网络管理协议。与其说它是一个网络管理协

议,不如说它是一个网络管理体系。这个体系包含以下组成部分:一套用于描述协议的模型,一组

用于描述被管对象的注册、标识和定义的管理信息结构,被管对象的详细说明以及用于远程管理

的原语和服务。CMIP与SNMP一样,也是由被管代理和管理者、管理协议与管理信息库组成。在

CMIP中,被管代理和管理者没有明确的指定,任何一个网络设备既可以是 被管代理,也可以是管

理者。

  CMIP 管理模型可以用三种模型进行描述:组织模型用于描述管理任务如何分配;功能模型描

述了各种网络管理功能和它们之间的关系;信息模型提供了描述被管对象和相关管理信息的准则

。从组织模型来说,所有CMIP的管理者和被管代理者存在于一个或多个域中,域是网络管理的基

本单元。从功能模型来说,CMIP主要实现失效管理、配置管理、性能管理、记帐管理和安全性管

理。每种管理均由一个特殊管理功能领域(SMFA,Special Management F unctional Area)负责

完成。从信息模型来说,CMIP的MIB库是面向对象的数据存储结构,每 一个功能领域以对象为MIB

库的存储单元。

  CMIP是一个完全独立于下层平台的应用层协议,它的五个特殊管理功能领域由多个系统管理

功能(SMF)加以支持。相对来说,CMIP是一个相当复杂和详细的网络管理协议。它的设计宗旨与

SNMP相同,但用于监视网络的协议数据报文要相对多一些。CMIP共定义了11类PDU 。在CMIP中,

变量以非常复杂和高级的对象形式出现,每一个变量包含变量属性、变量行为 和通知。CMIP中

的变量体现了CMIP MIB库的特征,并且这种特征表现了CMIP的管理思想,即基于事件而不是基于

轮询。每个代理独立完成一定的管理工作。

CMIP的优点在于:
  它的每个变量不仅传递信息,而且还完成一定的网络管理任务。这是CMIP协议的最大 特点,

在SNMP中是不可能的。这样可减少管理者的负担并减少网络负载。
  完全安全性。它拥有验证、访问控制和安全日志等一整套安全管理方法。

  但是,CMIP的缺点也同样明显:
  它是一个大而全的协议,所以使用时,其资源占用量是SNMP的数十倍。它对硬件设备的要求

比人们所能提供的要高得多。

  由于它在网络代理上要运行相当数量的进程,所以大大增加了网络代理的负担。
  它的MIB库过分复杂,难于实现。迄今为止,还没有任何一个符合CMIP的网络管理系统。

9. SNMP与CMIP的比较
  
  SNMP与CMIP是网络界最主要的两种网络管理协议。在未来的网络管理中,究竟哪一种将占据

优势,一直是业界争论的话题。

  总的来说,SNMP和CMIP两种协议是同大于异。两者的管理目标、基本组成部分都基本相同。

在MIB库的结构方面,很多厂商将SNMP的MIB扩展成与CMIP的MIB结构相类似,而且两种协 议的定

义都采用相同的抽象语法符号(ASN.1)。

  不同之处,首先,SNMP面向单项信息检索,而CMIP则面向组合项信息检索。其次,在信息获得

方面,SNMP主要基于轮询方式,而CMIP主要采用报告方式。再次,在传送层支持方面,SN MP基于无

连接的UDP,而CMIP倾向于有连接的数据传送。此外,两者在功能、协议规模、性能、标准化、产

品化方面还有相当多的不同点。

10.网络管理协议的前景

  在网络界,除SNMP、SNMP v2、CMIP以外,现在正兴起一些新的网络管理协议和环境。其中,

以分布式计算环境(DME,Distributed Management Environment)最为著名。DME是由OS F(开放

软件基金会)提出的。OSF是一个非盈利的研究和开发组织,其目标是提供一个软件解决方案,使

来自不同厂家的计算机可以协同工作于一个真正的开放系统计算环境下。其文档以RFT(Request

for Technology)的形式提供。

  DME代表了一种结构。在此结构下,管理系统和网络可以很好地结合。它可以构成分布式系

统管理的基础,并保持与现有网络管理方案的结合。它独立于操作系统,并支持事实上的和正式

的网络与系统管理标准。DME的结构有许多新颖之处。以前,无论是网络管理还是系统管理,管理

员通过修改与一个资源或服务相关的数据、通过对一些服务和数据进行操作来进行管理。而在

DME环境下,信息和操作都被划分为对象。DME以对象为单位对系统进行管 理。所有DME管理操作

有一个一致的界面和风格:通过与对象通信。这种设计的很大好处是模块性很强,完全是一种面

向对象的管理方式,系统易于管理和开发。ISV们可以建立自己的某些特定管理功能的对象库或

被管对象库,然后将其加入到已有的管理应用程序中。这一切 由于DME面向对象的管理方式而变

得简单。

  DME有两个关键概念:应用程序服务和框架(Framework)。应用程序服务提供一些最重要的系

统管理功能,而框架则提供开发系统管理应用程序所用的构造模块(building block)。这种设计

提供了与现有解决方案的一致性,并可在多厂商分布式网络环境中进行互操作。D ME应用程序服

务包括软件管理(Software Management)、许可权管理(License Management )、打印服务

(Printing Services)和事件管理(Event Management)。它们以一组模块和A PI的形式提供,有

一个一致的用户界面。DME还提供机制,使开发商可以很容易地加入新的服务。DME框架由一组功

能全面的构造模块组成,使新网管应用程序的开发变得简单。这些组成是:

  管理请求代理 (MRB,Management Request Brokers) MRB是DME框架的核心组成。在 DME下

,所有对对象的请求都被MRB接收。MRB负责找到这个对象在网络中的位置,然后转发请求。MRB

支持现有的网络管理协议SNMP、CMIP,用它们收集网络中的设备信息。MRB还支持基 于RPC

(Remote Procedure Call)的管理协议。

  对象服务器对象服务器用来管理和维护网络中的对象。DME提供两种类型的对象服 务器,一

个用于短期任务(如更换口令等),另一个用于长期任务(如监视一个网络)。

  事件管理服务当网络中出现问题或发生变化时,需要通知管理应用程序。DME的事件管理服

务提供了转发、登录和过滤这类通知的功能,可以对过滤器进行编程来分析一个事件通告的属性

,并将此事件与某个特定的动作联系起来。另外,为了使此服务易于使用,DME还 提供了用于定义

事件的高级模板语言。

  数据管理服务DME提供了一个管理数据库,用来存放网络被管对象的有关数据信息。此管理

数据库存放在磁盘上。

  目前,DME的主要问题是缺乏支持,尚未得到进一步的实践检验。

1 简介

1.1
作者

snmp++由hp公司开发。

1.2 网址

原来网站为:http://rosegarden.external.hp.com/snmp++/,现已关闭,原因不明。但开发仍

在继续。新版本在http://www.agentpp.com/index.html。想要看原版遗迹可到http://www.sa

-ha.de/snmp/。

1.3 版本

1.3.1 旧版本(v2.8及以前)

snmp++ 2.8及以前的版本在unix和windows下的支持不同,即是说有专门for
VC的windows版本(此时需要内带的wsnmp32.lib),有安装程序。

另外还有专门for windows的mib browser例程(,以及for
unix 的????例程),可供参考。新版本没有。

hp snmp++实现详细的说明文档snmp_pp.doc也只在旧版本中提供。

1.3.2 新版本

 

吐血推荐新版本,消灭不少害虫,增加些许功能。新旧版本的差别主要有:

 

新的发布不再有单独的windows版

新版本支持snmpv3(需要用到libdes库)

新版本支持多线程

 

如想知道snmp++的版本变化,可以看网站上的信息以及各版发布中的changes文件。

以下只介绍snmp++v3.2.2的使用方法。不要再问低版本的问题啦,偶不会的说~~~~~~

1.4 版权

以下摘自snmp_pp.doc(一定要看!!!):

Permission to use, copy, modify, distribute
and/or sell this software and/or its documentation is hereby granted
without fee. User agrees to display the above copyright notice and
this license notice in all copies of the software and any
documentation of the software. User agrees to assume all liability for
the use of the software; Hewlett-Packard makes no representations
about the suitability of this software for any purpose. It is provided
"AS-IS without warranty of any kind, either express or implied.
User hereby grants a royalty-free license to any and all derivatives
based upon this software code base.

Agent++及AgentX++的版权声明不同,请自行了解。

2 使用

snmp++支持多种平台,主要有solaris, hp
unix, windows等。使用方法稍有不同,但原理一致,即生成库文件,进行开发应用时使用头文

件及库文件即可。

2.1 unix

 

直接进行make,如果有问题对makefile中的一些宏/变量进行调整。在solaris下基本没有问题

新版本支持snmpv3,需要用到libdes加解密库,但也可以进行配置成不支持v3,修改config.h

文件注释掉相应开关选项即可。

 

 

2.2 windows

2.2.1
VC

 

推荐生成dll,在此基础上进行自己的SNMP开发。

初期版本需要wsnmp32.lib,新版本不用。

2.2.1.1 方法一:直接使用源文件

在自己的项目中,将snmp++及libdes的源文件加入进行编译即可。注意事项:

 

若不需要支持snmpv3,可加入宏定义_NO_SNMPv3,此时不需要libdes

有一些文件并不需要加入,如snmp++中有warning字样的文件和libdes中有main函数的文件

 

 

2.2.1.2 方法二:生成DLL
mso-hansi-"Times New Roman"">再使用

新版本没有带支持windows的makefile或dsw/dsp文件。作为替代,可以使用以下面提供的

snmp_pp.dsp文档生成DLL(感谢alwayscy提供原版的SnmpPP.DSP,下面的版本在其基础上修改而

成;还有一些VC下可用的project文件,但不保证能用)。

使用方法(够傻瓜了,不要再问了)为:

 

解压snmp++v3.2.2.tar.gz

 

将snmp++v3.2.2.tar.gz解压成snmp++文件夹,含有src,
include, lib等子文件夹。

 

解压libdes-l-4.01.tar.gz

 

将libdes-l-4.01.tar.gz解压到snmp++的libdes子目录下。

 

建立DLL
project

 

在snmp++下新建文件夹DLL。将snmp_pp.dsp放置到DLL下,用VC打开即可。如果出现了source
safe,干掉它!

 

调整

 

如果不需要snmpv3,可定义_NO_SNMPv3宏。这时不再需要libdes包。不过留着也无大碍。还有

一个重要工作是(也许更新的版本就不需要啦):

将smi.h中的宏定义

#define DLLOPT
__declspec(dllexport)

 

替换成

#ifdef
SNMP_PP_IMPORT

 

#define DLLOPT
__declspec(dllimport)

 

#else

 

#define DLLOPT
__declspec(dllexport)

 

#endif

 

在mp_v3.h中,在USM
* mpGetUsm();加上一个DLLOPT,即

DLLOPT USM*
mpGetUsm();

 

编译

 

F7。

 

使用

 

例如,在snmp++下新建一snmpGet子目录和snmpGet项目。在使用到snmp++的一切东东的文件中

保证包含snmp_pp.h;在setting中加入/D
"SNMP_PP_IMPORT"
/I "../include";在setting的link中加入../lib/snmp_pp.lib,运行的时候要能找得着

snmp_pp.dll。

2.2.2 c++ builder

暂缺。 

 

 

2.2.3 cygwin

暂无必要。

 

 

3 文档

在snmp++2.8版本带有文档snmp_pp.doc,但以后的发布不带。

据偶所知,文档没有更新。如果哪位发现有更新版本或其他有用的文档,麻烦告知一声,谢先

~~~

4 例程

 

 

开发包所带例子足以说明问题,请自己研究。别人不大可能提供更好的帮助。

console例程为各种平台共有。例子位于consoleExamples下,大致是

 

snmpBulk

snmpGet

snmpNext

snmpSet

snmpTrap

snmpWalk

 

主要演示各种PDU/函数的基本和衍生用法,也是几乎标准的snmp命令。

4.1 windows的spp28br例程

snmp++ 2.8版本有windows的例子。新版的可以继续利用。

这是一个mib browser的示例程序:SNMP++
2.8 Browser for Win32。

因为在3.2.2中,不再有pdu_cont.h文件,需要把相关的代码去掉。

4.2 unix

有unix下的例子。

5 其他

Snmp++是一套强大的网络管理应用开发包。它提供了Snmp网管协议所描述的所有命令,并且提供SMI数据类型的解析。MIB数据包含普通数据和表数据。在提取表数据时,由于表项的数量和Oid都不确定,所以不能通过某个特定的Oid直接获得取值。通常,关于Snmp的书上都会介绍使用GetNext命令来实现表的遍历,这种方法比较简单,这里主要讨论该算法的原理和如何用Snmp++实现。
MIB表是通过行和列来描述的。其中列表头是各个表项的原始Oid,而行表头则是index。这样以来一个Oid和一个index就唯一地确定了表中的一项。比如在接口表中,ifDescr(Oid为1.3.6.1.2.1.2.2.1.2)为一列,而具体对于某一个接口则为一行。这样,某一具体表项的Oid就表示为:列Oid+index的形式。下图形象地描述了一张表的格式。
  ifIndex
1.3.6.1.2.1.2.2.1.1 ifDescr
1.3.6.1.2.1.2.2.1.2 ifType
1.3.6.1.2.1.2.2.1.3 ifMtu
1.3.6.1.2.1.2.2.1.4 Ifspeed
1.3.6.1.2.1.2.2.1.5
Index0 xxx xxx xxx xxx xxx
Index1 xxx xxx xxx xxx xxx
Index2 xxx xxx xxx xxx xxx

按照协议描述,最基本的方法是通过index来获取某一表项。但事实上,index本身也是一个表项,再加之有些表需要多个index,并且各种index的数据类型不同,比如要手工处理ip地址类型的index就比较困难,所以这种方法具有很难的操作性。因此,在实际编程时,可以采取一些比较技巧化的方法。
从Snmp中对于GetNext命令的描述可知,如果GetNext的参数为一个表中某一列的表头Oid,比如前面的ifDescr(1.3.6.1.2.1.2.2.1.2),则得到的值为该列第一行元素值,并可得到该值的Oid。再对取得的Oid使用GetNext就可获得该列第二行的值。如此下去,如果到了该列的最后一行,那么用GetNext将得到下一列的第一行。如果到了该表的最后一个元素,那么用GetNext将得到按MIB树所得的下一个元素值。显然,在越界的情况下,其Oid的前部分已不同于本列表头的Oid,所以,可以通过得到的Oid值来判断是否越界。
以下为其主要的代码:
 
/*从代理提取某一特定表项,即表中的一列*/
void get_Table(Oid *item_oid, CTarget *target)
{
   GenAddress address;
   target->get_address( address);
             Oid full_oids[MAX_INDEX];       //用来保存得到的所有oid
   int index_count=0;                //该列的行数
   bool tag=true;                    //标志循环是否结束
   for(;tag==true;)
   {
      Pdu pdu;
      Vb vb;
      vb.set_oid(item_oid);
      pdu += vb;
      int status;
      if ((status=snmp->get_next( pdu, *target))== SNMP_CLASS_SUCCESS)
      {
         pdu.get_vb( vb,0);
Oid full_oid;       //该表项的Oid
            vb.get_oid(full_oid);    
            //判断是否已越界,如果是则结束循环
            if(item_oid ->nCompare(item_oid ->len(), full_oid)==0)
            {
               vb.get_oid(full_oids[index_count]);
               index_count++;
               /*
               在这里进行数据处理
               */
            }
            else
            {
               tag=false;
            }
      }
      else
      {
         tag=false;
      }
   }
}
 
以上的算法是从表中提取一列,那么如何提取一行呢?对于上述算法可以加以改进以适应我们的需要。但是,GetNext命令是按列遍历的,当我们要用它获得一行的时候还是必须先至少获得一列的信息,也就是说,在行遍历算法中还是要包含上述代码。这种方法经过实践是成功的,在这里仅对算法进行一下描述。
首先还是要执行上述代码,但是,在数据处理的时候必须保存所得到的完整Oid。我们知道,得到的Oid实际上是由列Oid+index构成,而列Oid是已知的,那么如果我们将得到的Oid前面的列Oid部分替换为另外的列Oid就可以获得该行另一列的完整Oid。在多数情况下,同一表中不同的列Oid仅相差一个数字,所以,替换方法也比较简单。这里假设我们只需替换一位(其它情况下只需做修改即可),算法如下:
 
//按行提取表数据
Oid row_oid[MAX_OID_NUM];
/*
首先在此处包含前面按列提取的代码,
并在数据处理处将full_oid保存在数组row_oid
*/
   //假设前面已经将第一列的所有表项Oid保存在数组row_oid中了
   //按行循环
for(int i=0; i<index_count; i++)
   {
      Oid oid;     
      //获取该行中每一列的数据
      for(oid=第一列oid; oid<最后一列oid; oid=下一列的oid)
      {
         Pdu pdu;
         Vb vb;
         //替换,如有需要,可以采用其它方法,这里选取最简单的情况只替换一位
            row_oid[i][oid.len()-1]=oid[oid.len()-1];
            vb.set_oid(row_oid[i]);
         pdu += vb;
            int status;
         if ((status=snmp->get( pdu, *target))== SNMP_CLASS_SUCCESS)
            {
            pdu.get_vb( vb,0);
            /*
            在这里进行数据处理
            */
            }
            else
            {
               cout << snmp->error_msg( status) << "/n";
            }
   }
实际上,SNMP提取表数据的方法有很多,这里介绍的是最简单最基础的一种方法。而且对于不同的开发包,还有更好的对表支持的方法,比如AdventSnmp开发包就有直接的表操作函数。无论采用何种方法,了解最基本的工作原理都非常有帮助。

【上篇】
【下篇】

抱歉!评论已关闭.