什么是 SNMP
简介
简单网络管理协议 SNMP(Simple Network Management Protocol)用于网络设备的管理。网络设备种类多种多样,不同设备厂商提供的管理接口(如命令行接口)各不相同,这使得网络管理变得愈发复杂。为解决这一问题,SNMP 应运而生。SNMP 作为广泛应用于 TCP/IP 网络的网络管理标准协议,提供了统一的接口,从而实现了不同种类和厂商的网络设备之间的统一管理。
SNMP 协议分为三个版本:SNMPv1、SNMPv2c 和 SNMPv3。
SNMPv1 是 SNMP 协议的最初版本,提供最小限度的网络管理功能。SNMPv1 基于团体名认证,安全性较差,且返回报文的错误码也较少。
SNMPv2c 也采用团体名认证。在 SNMPv1 版本的基础上引入了 GetBulk 和 Inform 操作,支持更多的标准错误码信息,支持更多的数据类型(Counter64、Counter32)。
SNMPv3 主要在安全性方面进行了增强,提供了基于 USM(User Security Module)的认证加密和基于 VACM(View-based Access Control Model)的访问控制。SNMPv3 版本支持的操作和 SNMPv2c 版本支持的操作一样。
SNMP 系统组成
SNMP 系统由网络管理系统 NMS(Network Management System)、SNMP Agent、被管对象 Management object 和管理信息库 MIB(Management Information Base)四部分组成。NMS 作为整个网络的网管中心,对设备进行管理。
每个被管理设备中都包含驻留在设备上的 SNMP Agent 进程、MIB 和多个被管对象。NMS 通过与运行在被管理设备上的 SNMP Agent 交互,由 SNMP Agent 通过对设备端的 MIB 进行操作,完成 NMS 的指令。
NMS
NMS 是网络中的管理者,是一个采用 SNMP 协议对网络设备进行管理/监视的系统,运行在 NMS 服务器上。
NMS 可以向设备上的 SNMP Agent 发出请求,查询或修改一个或多个具体的参数值。
NMS 可以接收设备上的 SNMP Agent 主动发送的 SNMP Traps,以获知被管理设备当前的状态。
SNMP Agent
SNMP Agent 是被管理设备中的一个代理进程,用于维护被管理设备的信息数据并响应来自 NMS 的请求,把管理数据汇报给发送请求的 NMS。
SNMP Agent 接收到 NMS 的请求信息后,通过 MIB 表完成相应指令后,并把操作结果响应给 NMS。
当设备发生故障或者其它事件时,设备会通过 SNMP Agent 主动发送 SNMP Traps 给 NMS,向 NMS 报告设备当前的状态变化。
Managed Object
Managed object 指被管理对象。每一个设备可能包含多个被管理对象,被管理对象可以是设备中的某个硬件,也可以是在硬件、软件(如路由选择协议)上配置的参数集合。
MIB
MIB 是一个数据库,指明了被管理设备所维护的变量。MIB 在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。MIB 也可以看作是 NMS 和 SNMP Agent 之间的一个接口,通过这个接口,NMS 对被管理设备所维护的变量进行查询/设置操作。
MIB 是以树状结构进行存储的,如图 1-2 所示。树的节点表示被管理对象,它可以用从根开始的一条路径唯一地识别,这条路径就称为 OID,如 system 的 OID 为 1.3.6.1.2.1.1,interfaces 的 OID 为 1.3.6.1.2.1.2。
子树可以用该子树根节点的 OID 来标识。如以 private 为根节点的子树的 OID 为 private 的 OID——{1.3.6.1.4}。
用户可以配置 MIB 视图来限制 NMS 能够访问的 MIB 对象。MIB 视图是 MIB 的子集合,用户可以将 MIB 视图内的对象配置为 exclude 或 include。exclude 表示当前视图不包含该 MIB 子树的所有节点;include 表示当前视图包含该 MIB 子树的所有节点。
SNMP 查询
SNMP 查询是指 NMS 主动向 SNMP Agent 发送查询请求,如图 1-3 所示。SNMP Agent 接收到查询请求后,通过 MIB 表完成相应指令,并将结果反馈给 NMS。
SNMP 查询操作有三种:Get、GetNext 和 GetBulk。SNMPv1 版本不支持 GetBulk 操作。
Get 操作:NMS 使用该操作从 SNMP Agent 中获取一个或多个参数值。
GetNext 操作:NMS 使用该操作从 SNMP Agent 中获取一个或多个参数的下一个参数值。
GetBulk 操作:基于 GetNext 实现,相当于连续执行多次 GetNext 操作。在 NMS 上可以设置被管理设备在一次 GetBulk 报文交互时,执行 GetNext 操作的次数。
SNMP 查询操作的报文
SNMPv1 和 SNMPv2c 查询报文格式如图 1-4 所示。SNMPv1 和 SNMPv2c 的报文主要由版本、团体名、SNMP PDU 组成。各类 SNMP 操作的报文封装在 SNMP PDU 中。
报文中的主要字段如下:
版本:表示 SNMP 的版本,如果是 SNMPv1 报文则对应字段值为 0,SNMPv2c 则为 1。
团体名:用于在 SNMP Agent 与 NMS 之间完成认证,字符串形式,用户可自行定义。团体名包括“read”和“write”两种,执行 SNMP 查询操作时,采用“read”团体名进行认证;执行 SNMP 设置操作时,则采用“write”团体名进行认证。
Request ID:用于匹配请求和响应,SNMP 给每个请求分配全局唯一的 ID。
Non repeaters/Max repetitions:GetBulk 操作基于 GetNext 操作实现,相当于多次执行 GetNext 操作,这两个参数用于设置执行 GetNext 操作次数。
Error status:用于表示在处理请求时出现的状况。
Error index:差错索引。当出现异常情况时,提供变量绑定列表(Variable bindings)中导致异常的变量的信息。
Variable bindings:变量绑定列表,由变量名和变量值对组成。
通过捕获报文工具获取设备发送的 SNMPv2c 版本 Get 请求报文如图 1-5 所示,SNMPv2c 版本 GetNext 请求报文如图 1-6 所示。SNMPv2c 版本 GetBulk 请求报文如图 1-7 所示。
SNMPv3 查询报文格式如图 1-8 所示,SNMPv3 报文主要由版本、MsgID、MaxSize、Flags、Security Model、Security Parameters、Context EngineID、Context Name 和 SNMP PDU 组成。SNMPv3 报文的 SNMP PDU 的格式与 SNMPv2c 的一致。SNMPv3 版本的报文可以使用鉴权机制,会对 Context EngineID、Context Name 和 SNMP PDU 进行加密。
报文中的主要字段定义如下:
版本:表示 SNMP 的版本,如果是 SNMPv3 报文则对应字段值为 3。
MsgID:请求报文的序列号。
MaxSize:消息发送者所能够容纳的消息最大字节,同时也表明了发送者能够接收到的最大字节数。
Flags:消息标识位,占一个字节,有三个特征位:reportableFlag,privFlag 和 authFlag。
reportableFlag=1,在能够导致 Report PDU 生成的情况下,SNMPv3 报文接收方必须向发送方发送 Report PDU;reportableFlag=0,SNMPv3 报文接收方不发送 Report PDU。只有在 SNMP PDU 部分不能被解密时(比如由于密钥错误导致解密失败等)才会用到 Report。
privFlag=1,对 SNMPv3 报文进行加密;privFlag=0,不对 SNMPv3 报文进行加密。
authFlag=1,对 SNMPv3 报文进行鉴权;authFlag=0,不对 SNMPv3 报文进行鉴权。
SecurityModel:消息采用的安全模型,发送方和接收方必须采用相同的安全模型。
SecurityParameters:安全参数,包含 SNMP 实体引擎的相关信息、用户名、鉴权参数、加密参数等安全信息。
Context EngineID:SNMP 唯一标识符,和 PDU 类型一起决定应该发往哪个应用程序。
Context Name:用于确定 Context EngineID 对被管理设备的 MIB 视图。
SNMPv3 提供了鉴权机制,推荐用户使用 SNMPv3 版本。通过捕获报文工具获取设备发送的 SNMPv3 版本加密的 Get 请求报文如图 1-9 所示,SNMPv3 版本不加密的 Get 请求报文如图 1-10 所示。
SNMP 查询操作的工作原理
不同版本的 SNMP 查询操作的工作原理基本一致,唯一的区别是 SNMPv3 版本增加了身份验证和加密处理。下面以 SNMPv2c 版本的 Get 操作为例介绍 SNMP 查询操作的工作原理。
假定 NMS 想要获取被管理设备 MIB 节点 sysContact 的值,使用可读团体名为 public,过程如下所示:
NMS:向 SNMP Agent 发送 Get 请求报文。报文中各字段的设置如下:版本号为所使用的 SNMP 版本;团体名为 public;PDU 中 PDU 类型为 Get 类型,绑定变量填入 MIB 节点名 sysContact。
SNMP Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,SNMP Agent 根据请求查询 MIB 中的 sysContact 节点,得到 sysContact 的值并将其封装到 Response 报文中的 PDU,向 NMS 发送响应;如果查询不成功,SNMP Agent 会向 NMS 发送出错响应。
SNMP 设置
SNMP 设置是指 NMS 主动向 SNMP Agent 发送对设备进行 Set 操作的请求,如图 1-11 所示。SNMP Agent 接收到 Set 请求后,通过 MIB 表完成相应指令,并将结果反馈给 NMS。
SNMP 设置操作只有一种 Set,NMS 使用该操作可设置 SNMP Agent 中的一个或多个参数值。
SNMP Set 操作的报文
SNMPv1 和 SNMPv2c 的 Set 操作报文格式如图 1-12 所示。一般情况下,SNMPv3 的 Set 操作信息是经过加密封装在 SNMP PDU 中,其格式与 SNMPv2c 的 Set 操作报文格式一致。
报文中主要字段的含义如下:
Request ID:用于匹配请求和响应,SNMP 给每个请求分配全局唯一的 ID。
Error status:用于表示在处理请求时出现的状况。
Error index:差错索引。当出现异常情况时,提供变量绑定列表(Variable bindings)中导致异常的变量的信息。
Variable bindings:变量绑定列表,由变量名和变量值对组成。
通过捕获报文工具获取设备发送的 SNMPv2c 版本 Set 请求报文如图 1-13 所示。
SNMP Set 操作的工作原理
不同版本的 SNMP Set 操作的工作原理基本一致,唯一的区别是 SNMPv3 版本增加了身份验证和加密处理。下面以 SNMPv3 版本的 Set 操作为例介绍 SNMP Set 操作的工作原理。
假定 NMS 想要设置被管理设备 MIB 节点 sysName 的值为 HUAWEI,过程如下所示:
NMS:向 Agent 发送不带安全参数的 Set 请求报文,向 SNMP Agent 获取 Context EngineID、Context Name 和安全参数(SNMP 实体引擎的相关信息)。
SNMP Agent:响应 NMS 的请求,并向 NMS 反馈请求的参数。
NMS:再次向 SNMP Agent 发送 Set 请求,报文中各字段的设置如下:
版本:SNMPv3
报文头数据:指明采用鉴权、加密方式。
安全参数:NMS 通过配置的算法计算出鉴权参数和加密参数。将这些参数和获取的安全参数填入相应字段。
PDU:将获取的 Context EngineID 和 Context Name 填入相应字段,PDU 类型设置为 Set,绑定变量填入 MIB 节点名 sysName 和需要设置的值 HUAWEI,并使用已配置的加密算法对 PDU 进行加密。
SNMP Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,SNMP Agent 根据请求设置管理变量在管理信息库 MIB 中对应的节点,设置成功后向 NMS 发送响应;如果设置不成功,Agent 会向 NMS 发送出错响应。
SNMP Traps
SNMP Traps 是指 SNMP Agent 主动将设备产生的告警或事件上报给 NMS,以便网络管理员及时了解设备当前运行的状态。
SNMP Agent 上报 SNMP Traps 有两种方式:Trap 和 Inform。SNMPv1 版本不支持 Inform。Trap 和 Inform 的区别在于,SNMP Agent 通过 Inform 向 NMS 发送告警或事件后,NMS 需要回复 InformResponse 进行确认,如图 1-14 所示。
SNMP Traps 报文格式
SNMPv1 的 Trap 操作报文格式如图 1-15 所示,Trap PDU 由 PDU type、enterprise、Agent addr、Generic trap、Specific trap、Time stamp 和 Variable bindings 组成。
报文中的主要字段定义如下:
enterprise:Trap 源(生成 Trap 的设备)的类型。
Agent addr:Trap 源的地址。
Generic trap:通用 Trap 类型,包括 coldStart、warmStart、linkDown、linkUp、authenticationFailure、egpNeighborLoss、enterpriseSpecific。
Specific trap:企业私有 Trap 信息。
Time stamp:上次重新初始化网络实体和产生 Trap 之间所持续的时间。
Variable bindings:变量绑定列表,由变量名和变量值对组成。
通过捕获报文工具获取设备发送的 SNMPv1 版本 Trap 报文如图 1-16 所示。
SNMPv2c 的 Trap 操作的报文格式和 Inform 操作的报文格式如图 1-17 所示。一般情况下,SNMPv3 的 Trap 操作或 inform 操作是经过加密封装在 SNMP PDU 中,其格式与 SNMPv2c 的 Trap 操作或 inform 操作的报文格式一致。
报文中的主要字段定义如下:
Request ID:用于匹配请求和响应,SNMP 给每个请求分配全局唯一的 ID。
Variable bindings:变量绑定列表,由变量名和变量值对组成。
通过捕获报文工具获取设备发送的 SNMPv2 版本 Trap 报文如图 1-18 所示,SNMPv2 版本 Inform 报文如图 1-19 所示。
SNMP Traps 工作原理
Trap 操作工作原理
Trap 不属于 NMS 对被管理设备的基本操作,它是被管理设备的自发行为。当被管理设备达到告警的触发条件时,会通过 SNMP Agent 向 NMS 发送 Trap 消息,告知设备侧出现的异常情况,便于网络管理人员及时处理。例如被管理设备热启动后,SNMP Agent 会向 NMS 发送 warmStart 的 Trap。
这种 Trap 信息是受限制的。只有在设备端的模块达到模块预定义的告警触发条件时,SNMP Agent 才会向管理进程报告。这种方法的好处是仅在严重事件发生时才发送 Trap 信息,减少报文交互产生的流量。
Inform 操作工作原理
Inform 操作也是被管理设备向 NMS 主动发送告警。与 Trap 告警不同的是,被管理设备发送 Inform 告警后,需要 NMS 进行接收确认。如果被管理设备没有收到确认信息则:
将告警或事件暂时保存在 Inform 缓存中。
重复发送该告警或事件,直到 NMS 确认收到该告警或者发送次数达到最大重传次数。
被管设备上会生成相应的告警或事件日志。
由此可知,使用 Inform 操作会占用较多的系统资源。
SNMP 端口号
SNMP 报文是普通的 UDP 报文,协议中规定有两个默认端口号:
端口号 161:NMS 发送 Get、GetNext、GetBulk 和 Set 操作请求以及 SNMP Agent 响应这些请求操作时,使用该端口号。
端口号 162:SNMP Agent 向 NMS 发送 Trap 或 Inform 时,使用该端口号。
关注公众号:网络技术平台,回复 “ *资料* ” 获取视频、培训教程、实验手册、电子书。
评论