SNMP的工作原理&软件开发
SNMP(Simple Network Management Protocol,简单网络管理协议)首先是由IETF的研究小组为了解决Internet上的路由器管理问题而提出的。SNMP的设计原则是简单 性和扩展性。简单性是通过信息类型限制、请求响应或协议而取得。扩展性是通过将管理信息模型与协议、被管理对象的详细规定(MIB)分离而实现的。
网络管理体系结构
SNMP的网络管理模型包括以下关键元素:管理站、代理者、管理信息库、网络管理协议。管理站一般是一个分立的设备,也可以利用共享系统实现。管理站作为网络管理员与网络管理系统的接口,它的基本构成为:一组具有分析数据、发现故障等功能的管理程序; 一个用于网络管理员监控网络的接口; 将网络管理员的要求转变为对远程网络元素的实际监控的能力; 一个从所有被管网络实体的MIB中抽取信息的数据库。
网络管理系统中另一个重要元素是代理者。装备了SNMP的平台,如主机、网桥、路由器及集线器均可作为代理者工作。代理者对来自管理站的信息请求和动作请求进行应答,并随机地为管理站报告一些重要的意外事件。
网络资源被抽象为对象进行管理。但SNMP中的对象是表示被管资源某一方面的数据变量。对象被标准化为跨系统的类,对象的集合被组织为管理信息库(MIB)。MIB作为设在代理者处的管理站访问点的集合,管理站通过读取MIB中对象的值来进行网络监控。管理站可以在代理者处产生动作,也可以通过修改变量值改变代理者处的配置。
管理站和代理者之间通过网络管理协议通信,SNMP通信协议主要包括以下能力。
Get:管理站读取代理者处对象的值。
Set:管理站设置代理者处对象的值。
Trap:代理者向管理站通报重要事件。
在标准中,没有特别指出管理站的数量及管理站与代理者的比例。一般地,应至少要有两个系统能够完成管理站功能,以提供冗余度,防止故障。
网络管理协议环境
SNMP为应用层协议,是TCP/IP协议族的一部分。它通过用户数据报协议(UDP)来操作。在分立的管理站中,管理者进程对位于管理站中心的MIB的访问进行控制,并提供网络管理员接口。管理者进程通过SNMP完成网络管理。SNMP在UDP、IP及有关的特殊网络协议(如Ethernet、FDDI、X.25)之上实现。
每个代理者也必须实现SNMP、UDP和IP。另外,有一个解释SNMP的消息和控制代理者MIB的代理者进程。
图1描述了SNMP的协议环境。从管理站发出3类与管理应用有关的SNMP的消息GetRequest、GetNextRequest、SetRequest。3类消息都由代理者用GetResponse消息应答,该消息被上交给管理应用。另外,代理者可以发出Trap消息,向管理者报告有关MIB及管理资源的事件。
共同体和安全控制
网络管理是一种分布式的应用。与其他分布式的应用相同,网络管理中包含有一个应用协议支持的多个应用实体的相互作用。在SNMP网络管理中,这些应用实体就是采用SNMP的管理站应用实体和被管理站的应用实体。
SNMP网络管理具有一些不同于其他分布式应用的特性,它包含一个管理站和多个被管理站之间一对多的关系。
反过来,我们也要看到SNMP网络管理中还包含另外一种一对多的关系,即一个被管理站和多个管理站之间的关系。每个被管理站控制着自己的本地MIB,同时必须能够控制多个管理站对这个本地MIB的访问。这里所说的控制有以下三个方面:认证服务将对MIB的访问限定在授权的管理站的范围内;访问策略对不同的管理站给予不同的访问权限;代管服务提的是一个被管理站可以作为其他一些被管理站(托管站)的代管,这就要求在这个代管系统中实现为托管站服务的认证服务和访问权限。
以上这些控制都是为了被管系统保护它们的MIB不被非法地访问。SNMP通过共同体(community)的概念提供了初步和有限的安全能力。
SNMP用共同体来定义一个代理者和一组管理者之间的认证、访问控制和代管的关系。共同体是一个在被管系统中定义的本地概念。被管系统为每组可选的认证、访问控制和代管特性建立一个共同体。每个共同体被赋予一个在被管系统内部唯一的共同体名,该共同体名要提供给共同体内的所有管理站,以便它们在get和set操作中应用。代理者可以与多个管理站建立多个共同体,同一个管理站可以出现在不同的共同体中。
由于共同体是在代理者处本地定义的,因此不同的代理者处可能会定义相同的共同体名。共同体名相同并不意味者共同体有什么相似之处,因此,管理站必须将共同体名与代理者联系起来加以应用。
网管系统软件
Manager:
管理员使用的工作站,通过网管软件查看和分析网管数据。
Agent
网管代理。网管代理一般分为两个功能模块和一个公用模块MIB库
查询/设置模块
此模块接受来自Manager的查询和设置指令,并根据指令处理相关数据,如将被查询的数据返回给Manager,或使设置的数据对相关Device生效。
对于SNMP Agent,此模块至少需要实现以下协议接口:
n get-request
n set-request
n get-next-request
n get-reponse
告警模块
告警模块将设备产生的告警发送给Manager。对于SNMP Agent.此模块至少需要实现Trap协议接口。
MIB库
MIB(管理信息库)保存被管理设备的相关管理信息。在SNMP Agent里, MIB通常用文本文件格式保存。
一个MIB描述了包含在数据库中的对象或表项。每一个对象或表项都有以下四个属性:
n 对象类型(Object Type)
n 语法(Syntax)
n 存取(Access)
n 状态(Status)
在SNMP规范之一的管理信息结构与标识(SMI;RFC 1155/1065)规范中定义了这些属性。SMI对于MIB来说就相当于模式对于数据库。
Device
被管理设备,可以是一台一个进程,计算机,或者分布式的系统。这些设备负责产生和收集诸如配置,性能和业务数据以及告警,是网管数据的来源,同时负责原始数据的整理和统计。Device和Agent之间的交互协议可以不受SNMP协议限制,可以采用任何一种协议交换数据。
Agent设计
可见Agent在网管系统结构的位置相当于管理器和被管设备之间的网关和协议转换器。对Agent的功能需求的范围应该为:
n 协议转换。将SNMP协议和被管设备之间的协议互相转换
n 转发请求。包括向被管设备转发查询,设置请求。向Manager转发设备产生的告警
通过MIB库维护被管设备的信息结构
对Manager提供一个统一的网管接口,无论被管设备有多复杂,对Manager来说只需要和Agent交互就可以获得所有被管设备的网管信息
不需要牵涉诸如轮巡,告警策略等网管业务逻辑。也不参与被管设备本身对网管数据的处理流程。这些由被管设备的网管业务逻辑层自行处理。
不需要对数据进行统计分析
不需要保存历史或实时网管数据
可见对于网管系统来说,Agent功能明确,结构相对简单,虽然必不可少但并非核心部件,并且SNMP Agent已经是事实上的工业标准,有大量的开发包帮助开发人员快速的实现Agent,可以让开发人员将精力投入到网管业务逻辑上。
什么是 SNMP?
SNMP是一系列协议组和规范,其提供了一种从网络中的设备中收集网络管理信息的方 法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。其网络管理主 要分为四部分被管理节点(设备)、代理、网络管理工作站、网络管理协议。
SNMP主要部分
被管理节点(设备)网络管理协议 |
被监控设备 |
代理 |
用来跟踪被管理设备状态的特殊软件或固件 |
网络管理工作站 |
与在不同的被管理节点中的代理通信,并且显示这些代理状态的中心设备 |
网络管理协议 |
被网络管理工作站和代理用来交换信息的协议 |
代理的概念及所提供的服务
管理代理(agent)是一种特殊的软件(或固件),它包含了关于一个特殊设备及该设备所处环境的信息。
其提供的服务:
l 网络管理工作站可以从代理中获得相关设备的信息。
l 网络管理工作站可以修改、增加或者删除代理中的相关表项。
l 网络管理工作站可以为一个特定的自陷设置阈值。
l 代理可以向网络管理工作站发送自陷。
MIB概念
MIB被称为管理信息库,一个MIB描述了包含在数据库中的对象或表项。
简单网络管理协议
SNMP请求/响应报文
简单网络管理协议允许网络管理工作站软件与被管理设备中的代理进行通信。这种通信可以包括来自管理工作站的询问消息、来自代理的应答消息或者来自代理给管理工作站的自陷消息。
SNMPv1实现起来很简单,其包含5个请求/响应原语:
l get-request
l set-request
l get-next-request
l get-response
l trap
报文格式
IP首部 |
UDP首部 |
版本 |
共同体 |
PDU类型(0-3) |
请求标识 |
差错状态(0-5) |
差错索引 |
名称 |
值 |
名称 |
值 |
... |
PDU类型4 |
企业 |
代理地址 |
Trap类型(0-6) |
特定代码 |
时间戳 |
名称 |
值 |
... |
PDU类型 |
名称 |
0 |
Get-request |
1 |
Get-next-request |
2 |
Get-response |
3 |
Set-request |
4 |
Trap |
SNMP开发工具
开发工具的使用
AdventNet所提供的的开发工具包,支持多种平台。
- Agent++
- SNMP++
Microsoft Virtual Studio 6.0,Windows下c++语言的开发包。MS自身提供一组称为WinSNMP的API(在MSDN中提供详细文档),而且MS提供基于Agent Service的SNMP Extension Agent开发。
ucd-snm(net-snmp)p是Linux平台下著名的C语言SNMP开发包,公开源码,是最常用的开发Agent的软件包。
辅助工具的使用
AdventNet所提供的对mib开发一系列开发工具包,包括:
- Mib Browser
- Mib Editor
- Mib Compiler
熟悉SNMP的开发过程
SNMP开发流程
Mib的创建和源码生成
首先第一步是Mib设计,开始Mib设计的时候要确定将被管理的对象纳入管理信息库,最终实现asn.1的文档,在此可以使用AdventNet所提供的Mib Editor来实现。通过Mib编译器将asn.1的文档编译成c文件和头文件,可以使用Mib Compiler编译。
Agent的开发
Agent++支持多种平台,主要有solaris, hp unix,
windows等。使用方法稍有不同,但原理一致,即生成库文件,进行开发应用时使用头文件及库文件即可。
unix下直接进行make,如果有问题对makefile中的一些宏/变量进行调整。在solaris下基本没有问题。Ø
windows下vc6编译请参考附录Ø
Snmpapp的开发
snmp++支持多种平台,主要有solaris, hp unix, windows等。使用方法稍有不同,但原理一致,即生成库文件,进行开发应用时使用头文件及库文件即可。
- unix下直接进行make,如果有问题对makefile中的一些宏/变量进行调整。在solaris下基本没有问题。新版本支持snmpv3,需要用到libdes或其他加解密库。
- windows下vc6编译请参考附录
附录:windows下vc6编译
创建项目,加入所有的源文件和头文件后。
要在PROJECT的SETTING中设置如下项:
1 在C++页,/I 项加入AGENT++的INCLUDE和SNMP++的INCLUDE 目录
2、设置成MTd 多线程DEBUG模式。
3、 编译运行。
以上用来编译AGENT++库。
对于AGENT++的例子,要在PROJECT的SETTING中设置如下项:
1、创建WIN32的控制台程序;
2、加入程序代码;
3、加入SNMP++.LIB和AGENT++.LIB;
4、 在C++页,/I 项加入AGENT++的INCLUDE和SNMP++的INCLUDE 目录
5、设置成MTd 多线程DEBUG模式。
6、在LINK页,加入Ws2_32.lib
7、加入/nodefaultlib:"libcmtd.lib"
8、编译运行。