SNMP概述–运维必知的协议基础

一、什么是SNMP?
 
SNMP是  “Simple Network Management Protocol” 的缩写,中文意思是简单网络管理协议,它是由互联网工作小组在RFC1157中定义的应用层协议,用于在网络实体或节点之间交换管理或监控信息。
 
二、为什么需要SNMP?
 
作为运维人员,我们很大一部分的工作就是为了保证我们的网络能够正常、稳定的运行。因此监控,控制,管理各种网络设备成了我们日常的工作。在网络兴起的早期,维护方式就是运维人员蹲在近端对设备进行各种操作,当网络设备越来越多,网络规模越来越大时,管理工作会变得越来越单调乏味,这样的近端维护方式也近乎不可能。因此,远程管理网络的需求日益迫切,SNMP应运而生。使用SNMP,一个运行网管软件的工作站就能对成千上万的网络设备进行监控和信息采集,这些信息可以用来构建网络或者定位网络中的问题。
 
三、SNMP的优点
如其名字所述,这个协议简单易懂,部署的开销成本也小。正因为它足够简单,所以被广泛的接受,事实上它已经成为了主要的网络管理标准。在一个网络设备上实现SNMP的管理比绝大部分其他管理方式都简单直接。
 
使用SNMP将带来如下好处:
标准化的协议:SNMP是TCP/IP网络的标准网络管理协议。互联网标准协议是由互联网组织志愿贡献的开放、非专利性的,SNMP的维护及将来所有的增强都将基于现有的协议标准。
广泛认可:所有主流供应商都支持SNMP。所有SNMP管理的设备使用相同的管理接口以支持通用的管理消息集合。
可移植性:SNMP独立于操作系统和编程语言。SNMP的功能设计同样是可移植的。同时它定义了一套核心操作集,所有支持SNMP的设备都需要支持这套操作。
轻量级:SNMP增强对设备的管理能力的同时不会对设备的操作方式或性能产生冲击。网络设备可以以极小的资源消耗和些微的负载作为代价增加SNMP的管理支持。
可扩展性:在所有SNMP管理的设备上都会支持相同的一套核心操作集。SNMP也支持计算机网络设备中各种类型的设备信息的交互,设备加入网络也变得简单。
广泛部署:SNMP是最流行的管理协议,最为受设备供应商关注,被广泛部署在各种各样的设备上。
 
四、SNMP的关键特征
SNMP一般主要由三个组件构成,这三个组件分别是:
网络设备:一般是指网络中需要监控和管理的设备或管理对象。
Agent:agent是网络设备和管理组件的中间件,是驻留在网络设备中的程序进程,它收集设备的管理信息并与管理组件交互。
一个典型的agent应有如下特征:
   ●支持完整的SNMP协议
   ●保存与检索定义在MIB中的管理信息
   ●收集与维护本地设备的信息
   ●发送事件给管理组件
   ●作为某些非SNMP可管理的节点上的代理
管理组件:一个管理组件或者说管理系统是一个远程部署的独立实体(区别于agent部署于被管理设备上)。一般典型可视为一台部署了管理组件的计算机,并且可能从地理位置上都与网络设备相隔甚远,管理者只需要通过这台计算机就能够对设备进行各种监控与管理操作。
一个典型的管理组件应有如下特征:
   ●实现网络管理系统
   ●支持完整的SNMP协议
   ●查询agent,获取agent 的响应消息,设置agent的变量,告知agent异步事件已收到等
 
通讯:管理组件与agent之间以协议数据单元进行通讯( Protocol Data Units,PDUs),数据在进行网络传输前必须进行分块和封装,SNMP传输的过程中,数据首先会被封装成PDU,PDU再被UDP协议封装进行传输。
SNMP消息的格式可以参考下图
1.msgVersion 指定SNMP的版本
2.msgID 指定SNMP消息唯一辨识符
3.msgMaxSize 指定交互SNMP实体所能接收的最大消息大小
4.msgFlags 指定消息的安全级别
5.msgSecurityModel 指定消息所使用的安全模式.SNMPv3为USM
6.msgAuthoritativeEngineID 此消息交互的SNMP实体的 SNMP EngineID
7.msgAuthoritativeEngineBoots 此消息交互的SNMP实体启动的次数
8.msgAuthoritativeEngineTime 此消息交互的SNMP实体自上次启动后所过去的时间
9.msgUserName 此消息交互的SNMP实体所使用的用户名
10.msgAuthoritaticationParameters 认证协议的参数
11.msgPrivacyParameters 加密协议的参数
12.contextEngineID 作为实现了某个具体管理功能上下文的唯一辨识符
13.contextName 用来标记一个上下文的名称
14.pdu SNMP实体间通信数据单元
 
管理模式:SNMP 对于管理组件和agent的实现一般可划分为如下三个层面:
   ●协议,定义SNMP的基本操作和管理组建与agent间消息交换的格式
   ●管理信息结构(Structure of Management Information (SMI)),定义SNMP该以何种形式访问管理对象的规则集合
   ●管理信息库(Management Information Base (MIB)),定义管理对象属性的集合
 
MIB和SMI使用一种叫做ASN.1(Abstract Syntax Notation One)的表示法来描述,这是一种以ASCII文本格式清晰描述数据的表示法。MIB的数据通过SNMP消息进行网络传输,传输前会通过简单编码规则( Basic Encoding Rules (BER))进行编码。
 
五、SNMP的基本操作
SNMP是一个请求-响应式的协议,它的基本操作可以分类如下:
   ●检索数据
   ●修改变量
   ●接收主动上报消息
检索数据:管理组件向agent发送请求以获取数据,有如下操作类型:
   ●GET:GET请求用以从agent上获取指定OID对应的一条或多条值。
   ●GETNEXT:与GET请求类似,最明显的区别是GETNEXT获取指定OID在系统树种所处位置的下一个OID。
   ●GETBULK:用于从agent上获取大表中的大量数据。
 
修改变量:管理组件有时会希望能够修改设备上的一些变量:
   ●SET:管理组件使用这个命令来修改设备的一些配置值。
 
接收主动上报消息:
   ●TRAP: 当agent遇到数据传输问题,或设备出现故障希望上层管理组件知晓时,使用TRAP操作上报此信息。
 
六、SNMP的版本
SNMP发展到目前,一共经历了三个主要版本,SNMPv1,SNMPv2c,SNMPv3。对于当今互联网迅猛发展的今天,信息安全已经是一个关乎产品命运的重要问题,曾经的SNMP由于缺乏足够的安全性而被人诟病甚至弃用,因此SNMPv3版本做了大量关于安全性的增强,这里我们也主要关注于SNMPv3版本的特性。
SNMPv3的主要目的如下:
1.校验收到的SNMP消息在网络传输过程中是否被篡改。
2.校验收到的SNMP消息其身份证明是否已经被创建。
3.检测收到的SNMP消息是否包含管理消息,是否是即时创建的。
4.保护每个收到的消息的内容不会被公开。
为实现上述目标,SNMP为系统提供了一个安全的管理环境,涉及以下内容:
   ●SNMP实体的身份证明以增强SNMP实体间的通信——每一个SNMP实体都会有一个叫SNMP EngineID的身份标识符,SNMP通信只能发生在已知身份的SNMP实体间(TRAP和Notification不受此规则限制。)
   ●支持安全模式——一个安全模式定义了管理域或内部网络中的安全策略,SNMP包含USM安全模式的实现。
   ●定义消息安全的校验服务规范:
       ○反信息篡改:保护校验通过的实体所生成的消息在传输过程中不会被未经校验的SNMP实体所修改。
       ○反伪装:防止SNMP实体通过伪装成其他实体的身份来越权执行某些操作。
       ○反消息流篡改:防止SNMP消息流被恶意重排序,推迟或重复从而施加未经校验的管理操作。
       ○反消息泄露:防止SNMP实体通信的信息被窃听。
   ●USM的规格定义——USM一般由如下几个通信机制组成:
       ○非认证不加密通信
       ○认证不加密通信
       ○认证加密通信
   ●定义不同的认证与加密协议——目前USM支持MD5和SHA认证协议,DES和AES加密协议。
   ●定义发现流程:可以通过通信地址发现SNMP实体的SNMP EngineID
   ●定义时间同步流程:增强远程SNMP实体间认证通信。
   ●定义SNMP 框架 MIB——增强对SNMP实体的管理和配置。
   ●定义USM的MIB——增强远程配置与管理的安全模式。
   ●定义VACM 的MIB——增强远程配置与管理的访问控制。
 
七、SNMP的实现工具
上面讲了很多关于SNMP原理的内容,了解完之后肯定是要具体使用,才有价值,这里介绍一个Linux上的SNMP实现工具。
1.安装net_snmp服务,这里我使用yum安装
2.检查安装情况
3.启动并检查SNMP的运行状态
4.验证SNMP服务
1)安装snmp管理工具:
2)执行SNMP命令查询系统主机名:
5.配置SNMP服务
出于安全考虑,我们创建SNMPv3的安全用户
1).停止SNMP服务,并增加SNMPv3用户,这里创建的用户默认是MD5认证和DES加密
2).将认证和加密协议分别修改为SHA和AES,提高安全性,然后启动SNMP服务
 
3).测试该用户的通信消息,成功获取。
4).一些其他功能
查看系统内存总量OID:.1.3.6.1.4.1.2021.4.5.0
查看当前可用内存OID:.1.3.6.1.4.1.2021.4.6.0
查看当前CPU负载OID:.1.3.6.1.4.1.2021.10.1.3.1
如果是远程查询,将localhost修改成目标主机的IP并指定SNMP的端口即可。
此外还有更多关于SNMP配置与开发,例如可以配置用户访问的内容,访问的权限,以及自定义MIB等,这里就不再一一赘述了,如果有兴趣可以去查阅相关资料进行研究。
转:IT技术博客大学习http://blogread.cn/it/article/7478?f=wb

 

posted @ 2016-02-01 09:54  呆虫  阅读(5686)  评论(0编辑  收藏  举报