【1.8.5.1】SNMP协议

简单网络管理协议(Simple Network Management Protocol,SNMP)是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议(Simple Gateway Monitor Protocol,SGMP)制定的。

SNMP 可以使网络管理员通过一台工作站完成对计算机、路由器和其他网络设备的远程管理和监视。利用 SNMP 协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络设备,如监视网络状态、修改网络设备配置、接收网络事件警告等。

一、SNMP 协议

1.1 SNMP 协议概述

前面介绍的 Telnet 协议可以用于连接远程计算机,并进行管理与控制,如远程执行命令。这种情况下,执行的命令有一定的局限性,如只能执行远程主机上支持的命令。

由于网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP 应运而生。

SNMP 协议能够帮助网络管理员提高网络管理效率,及时发现和解决网络问题,对网络增长做好规划。网络管理员还可以通过 SNMP 协议,接收网络节点的通知消息和警告事件报告等,从而获知网络出现的问题。

SNMP 目前共有 3 个版本,分别为 v1、v2 和 v3,说明如下:

  • SNMP v1:是 SNMP 协议的最初版本,在 1988 年被制定,并被 Internet 体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案。
  • SNMP v2:是 1992 年发布的 SNMP 的第二个版本。它修订了第一版,并且在性能、安全、机密性和管理者之间通信等方面进行了大量改进。
  • SNMP v3:是目前最新的版本。它是 2004 年制定的,协议编号为 RFC3411-RFC3418(STD0062)。它为提升协议的安全性,增加了认证和密文传输功能。

1.2 SNMP 架构组成

SNMP 的架构由 3 部分组成,分别为社区、网络管理站和节点,如图所示。

社区、网络管理站和节点说明如下:

  • 社区:同一个管理框架下的网络管理站和所有节点的集合。
  • 网络管理站:一个管理控制台,也称为网络管理系统(Network Management System,NMS)。它是一台带有必要 SNMP 管理软件的普通计算机,主要用来管理与监控网络上的设备。
  • 节点:网络上的设备(被管理的设备)。例如,上图中的路由器、网关等都是节点设备。

1.3 工作原理

SNMP 可以用来发现、查询和监视网络中其他设备的状态信息。其工作流程如图所示。

上图中展现了管理员通过 NMS 获取网关监控数据的工作流程,其中涉及了一些 SNMP 协议的关键信息。

为了方便理解,下面先介绍这些信息的作用及含义。

  • MIB(管理信息库):任何一个被管理的设备都表示成一个对象,并称为被管理的对象。而 MIB 就是被管理对象的集合。它定义了被管理对象的一系列属性,如对象的名称、对象的访问权限和对象的数据类型等。每个设备都有自己的 MIB。MIB 是一种树状数据库,MIB 管理的对象,就是树的端节点,每个节点都有唯一位置和唯一名字。
  • SNMP 代理:是一种嵌入在被管理设备中的网络管理软件模块,主要用来控制本地机器的管理信息。它还负责将管理信息转换成 SNMP 兼容的格式,传递给 NMS。

上图所示的工作流程分为以下 4 个步骤:

  1. 当管理员查询被管理设备中的对象的相关值时,首先通过网络管理站 NMS 中的 MIB 找到相关对象。
  2. 网络管理站 NMS 向 SNMP 代理申请 MIB 中定义对象的相关值。
  3. SNMP 代理在自己的 MIB 库中进行查找。
  4. SNMP 代理将找到的对象相关值返回给网络管理站 NMS。

1.4 通信方式

SNMP 采用特殊的客户机/服务器模式进行通信。这里的客户端指的是网络管理站 NMS,服务器指的是 SNMP 代理。实际上它们的通信方式是网络管理站 NMS 与 SNMP 代理之间的通信,如图所示。

上图中的通信方式分为请求与应答两个步骤:

  1. 网络管理站 NMS 向 SNMP 代理发出请求,询问一个 MIB 定义的信息的参数值。
  2. SNMP 代理收到请求后,返回关于 MIB 定义信息的各种查询。

1.5 操作类型

SNMP 协议用来管理管理站 NMS 与 SNMP 代理之间的信息交互。因此,它提供了多种操作类型。

常用的 6 种操作类型如图所示。

上图中为 5 种信息交互形式的操作类型,一共有 6 种操作类型,每种操作类型含义如下:

  • get-request:网络管理站 NMS 从 SNMP 代理处提取一个或多个参数值。
  • get-response:返回一个或多个参数的值。
  • get-next-request:网络管理站 NMS 从 SNMP 代理处提取一个或多个参数的下一个参数值。
  • set-request:网络管理站 NMS 设置 SNMP 代理处 MIB 的相关参数值。
  • trap:SNMP 代理主动向网络管理站 NMS 发送报文消息。

二、SNMP报文格式剖析

SNMP 协议中提供了多种操作类型,但是它们的报文格式主要分为两种格式,下面详细介绍这两种报文格式。

2.1 第一种SNMP报文格式

在 SNMP 协议中,操作类型 get-request、get-response、get-next-request、set-request 或 informRequest 的报文格式基本是相同的。

报文格式如图所示。

报文中每个字段的含义如下:

  • 版本:版本字段,写入版本字段的是版本号减 1。例如,SNMP(即 SNMPV1)应写入 0。
  • 共同体:字符串形式,作为网络管理站 NMS 和 SNMP 代理之间的明文口令,默认为 public。
  • PDU 类型:SNMP 协议的操作类型。值为 0,表示 get-request 操作;值为 1,表示 get-next-request 操作;值为 2,表示 get-response 操作;值为 3,表示 set-request 操作;值为 7,表示 informRequest 操作。
  • 请求标识:管理站 NMS 设置的一个整数值。SNMP 代理在发送 get-response 报文时也要返回此请求标识符。
  • 差错状态:整数,由 SNMP 代理进行标注,指明有错误发生。可用的值及含义如下表所示。
  • 差错索引:当出现 noSuchName、badValue 或 readOnly 的错误时,由代理进程在回答时设置的一个整数。该数值指明引起错误的变量在变量列表中的偏移位置。
  • 名称:MIB 管理信息库中的 OID。
  • 值:OID 对应的值。

错误状态

错误状态 名称 含义
0 noError 一切正常
1 tooBig 代理无法将回答封装到一个 SNMP 报文之中
2 noSuchName 操作使用了一个不存在的变量
3 badValue 一个 set 操作使用了一个无效值或无效语法
4 readOnly 管理进程试图修改一个只读变量
5 genErr 其他错误

2.2 第二种SNMP报文格式

在 SNMP 协议中,trap 操作类型的报文格式基本是相同的。

报文格式如图所示。

报文中每个字段的含义如下:

  • 版本:版本字段。
  • 共同体:作为管理进程和代理进程之间的明文口令,默认为 public。
  • PDU 类型:SNMP 协议的操作类型。这里值为 4。
  • 企业:填入 trap 报文的网络设备的 OID。该 OID 必须在 1.3.6.1.4.1 的节点上。
  • SNMP 代理地址:SNMP 代理的 IP 地址。
  • trap 类型:trap 类型可用的类型及含义如下表所示。
  • 特定代码:指明代理自定义的时间。
  • 时间戳:指明从代理进程初始化到 trap 报告的事件发生所经历的时间,单位为 10ms。例如,时间戳为 1908 表明在代理初始化后 19080ms 发生了该事件。
  • 名称:MIB 管理信息库中的 OID。
  • 值:OID 对应的值。

trap 类型

trap 类型 名称 含义
0 coldStart 代理进行了初始化
1 warmStart 代理进行了重新初始化
2 linkDown 一个接口从工作状态变为故障状态
3 linkUp 一个接口从故障状态变为工作状态
4 authenticationFailure 从网络管理站 NMS 接收到一个具有无效共同体的报文
5 egpNeighborLoss 一个 EGP 相邻站变为故障状态
6 enterpriseSpecific 代理自定义的事件,在这个特定的代码字段中查找 trap 信息

三、SNMP MIB(信息管理库)格式剖析

MIB 是一个信息管理库,在该库中包含了大量的对象,这些对象有自己唯一的位置和名字。那么它们是如何进行区分的呢?本节将介绍这些信息格式。

3.1 对象标识符(OID)

管理信息库 MIB 指明了网络元素所维持的变量,即能够被管理进程查询和设置的信息。MIB 给出了网络中所有可能的被管理对象集合的数据结构。

SNMP 的管理信息库采用和域名系统 DNS 相似的树形结构,如图所示。

上图所示为管理信息库中的一部分信息。最上面部分为根,没有名字,其余部分都是节点,由一个专用的名字和数字这两部分构成。这些名字不是随便分配的,而是由一些权威组织进行管理和分配的。

上图中的每一个节点表示一个被管理的对象,每一个对象都可以从根开始找出一条唯一的路径,这个路径就是对象标识符 OID,它是以点.进行分隔的整数序列。例如,对象标识符 1.3.6.1.2.1,表示对象 iso.org.dod.internet.mgmt.mib。

3.2 对象下面的分组

在管理信息库 MIB 中,管理对象下面会被分为若干个组。例如,管理对象 mib 的分组如图所示。

其中,mib 下的分组有 system 组、interfaces 组和 at 组等。

3.3 数据类型(值类型)

管理信息库 MIB 用于收集和储存管理信息(管理对象的状态和统计信息),并且能够使 NMS 通过 SNMP 代理查询对象信息或进行设置。而 MIS 用于定义通过 SNMP 协议可访问对象的规则,它定义在 MIB 中使用的数据类型。

常用的数据类型及含义如下:

  • Integer:整数类型,有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值。例如,IP 的转发标志只有允许转发或者不允许转发。有些整型变量定义包含特定的范围,如 UDP 和 TCP 的端口号从 0~65535。
  • OCTER STRING:0 或多个 8bit 字节,每个字节值在 0~255 之间。
  • Display String:0 或多个 8bit 字节,但是每个字节必须是 ASCII 码。在 MIB-II 中,所有该类型的变量不能超过 255 个字符,但可以为 0 个字符。
  • OBJECT IDENTIFIER:对象标识符。
  • NULL:表示相关的变量没有值。例如,在 get 或 get-next 操作中,变量的值就是 NULL。因为这些值还没有获取。
  • IpAddress:以网络序表示的 IP 地址。因为它是一个 32 位的值,所以定义为 4 个字节。
  • PhysAddress:OCTER STRING 类型,代表物理地址。例如,以太网物理地址为 6 个字节。
  • Counter:以网络序表示的 IP 地址。它是一个 32 位的值,被定义为 4 个字节。
  • Gauge:非负整数,取值范围为 0~4294976295(或增或减)。达到最大值后锁定,直到复位。例如,MIB 中的 tcpCurrEstab 就是这种类型,它代表目前在 ESTABLISHED 或 CLOSE_WAIT 状态的 TCP 连接数。
  • TimeTicks:时间计数器,以 0.01 秒为单位递增,但是不同的变量可以有不同的递增幅度。所以在定义这种类型变量时,必须指定递增幅度。
  • SEQUENCE:用于列表。这一数据类型与大多数程序设计语言中的 structure 类似。一个 SEQUENCE 包括 0 个或多个元素,每一个元素可以是另一个 ASN.1 数据类型。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn