SNMP(简单网络管理协议)简介

介绍 SNMP(简单网络管理协议)的基本概念,包括 SNMP manager、SNMP agent、MIB、OID、PDU 命令和 v1/v2c/v3 版本差异,帮助理解交换机、路由器、防火墙、UPS 等设备监控的基础。

作者 秦晓辉@快猫星云

核心要点摘要

  • SNMP 是 Simple Network Management Protocol,即简单网络管理协议,常用于交换机、路由器、防火墙、UPS、打印机、商业存储等设备监控。
  • SNMP 网络里通常有两个角色:SNMP manager 负责发起查询,SNMP agent 负责收集本地信息并响应请求。
  • MIB 是管理信息库,OID 是对象标识符;理解 MIB 树和 OID 是查询设备指标的基础。
  • SNMP 常见命令包括 Get、GetNext、GetBulk、Set、Response、Trap 和 Inform。
  • SNMPv1、SNMPv2c 和 SNMPv3 的主要差异之一在安全模型,实际使用时要结合设备支持和安全要求选择版本。

SNMP 是什么

作为一个系统管理员,很大一部分工作是收集关于你的服务器和基础设施的准确信息。有许多工具和选项用于收集和处理这种类型的信息。其中许多都是建立在一种叫做SNMP的技术上。

SNMP是简单网络管理协议的缩写。它是一种服务器可以分享其当前状态信息的方式,也是一个管理员可以修改预定义值的渠道(译者注:即可以查询,可以写入)。虽然协议本身非常简单,但实现SNMP的程序结构可能非常复杂。

在本指南中,我们将向你介绍SNMP协议的基本知识。我们将介绍它的用途,该协议在网络中的典型使用方式,其协议版本的差异,以及更多。

基本概念

SNMP是一个在网络堆栈的应用层实现的协议。该协议是以一种一致的标准化的方式,从不同的系统中收集信息。

SNMP协议有多个版本,许多联网的硬件设备实现了某种形式的SNMP访问。最广泛使用的版本是SNMPv1,但它在许多方面是不安全的。它的流行主要源于它的普遍性和在野外的长时间使用。除非你有强烈的理由不这样做,否则我们建议你使用SNMPv3,它提供了更先进的安全功能(译者注:IDC内的网络设备,大都是v2c版本)。

一般来说,SNMP 网络中最重要的是 SNMP agent。agent 是一个程序,它可以收集关于一个硬件的信息,将其组织成预定义的条目,并使用SNMP协议响应查询(译者注:Linux下可以安装snmpd,响应查询,这里的snmpd就相当于是SNMP agent)。

SNMP 网络中查询 agent 信息的组件被称为 SNMP manager。这些 manager 知道网络中有哪些设备支持 SNMP 协议,并可以发出请求来收集信息和设置某些属性。

SNMP manager:发起查询的一方

一个 SNMP manager 是一台被配置为轮询 SNMP agent 信息的计算机。当只讨论其核心功能时,管理组件实际上比 agent 的配置要简单得多,因为管理组件只是请求数据。

SNMP manager 可以是任何能够以正确的凭证向 SNMP agent 发送查询请求的机器。有时,这被实现为监控套件的一部分,而其他时候,这是一个管理员使用一些简单的工具来创建一个快速请求。

几乎所有在 SNMP 协议中定义的命令(我们将在后面详细介绍这些命令)都被设计成由一个管理组件来发送。这些命令包括 GetRequest、GetNextRequest、GetBulkRequest、SetRequest、InformRequest 和 Response。除了这些之外, manager还被设计为响应 Trap 和 Response 消息(译者注:SNMP manager除了可以查询 SNMP agent 之外,还可以响应 agent 发过来的消息,Trap 消息就是典型的一个场景,网络设备的一些严重故障会以 Trap 消息的方式通知 SNMP manager)。

SNMP agent:提供设备信息的一方

SNMP agent 做大部分的工作。它们负责收集有关本地系统的信息,并将它们以一种可以被查询的格式存储起来,更新一个叫做"管理信息库"的数据库,或称MIB(management information base)。

MIB是一个分层的、预先定义的结构,它存储了可以查询或设置的信息。这可用于格式良好的SNMP请求,这些请求来自于用正确凭证认证的主机(SNMP manager)。

agent 侧会配置权限,控制谁可以访问、可以访问哪些信息。SNMP agent 对协议所定义的大多数命令作出反应。这些包括 GetRequest、GetNextRequest、GetBulkRequest、SetRequest 和 InformRequest。此外,agent 也被设计用来发送 Trap 信息。

MIB 和 OID:SNMP 查询的地址体系

SNMP系统中最难理解的部分可能是MIB,即管理信息库。MIB是一个数据库,SNMP manager和SNMP agent都遵从MIB统一标准来处理数据。它是一个层次结构,在许多方面是全球标准化的,但也有足够的灵活性,允许供应商添加特定的内容(译者注:不同的网络设备,有不同的MIB,因为供应商通常都会有自定义的内容,而且不同的供应商定义方式不同)。

MIB结构最好被理解为一个自上而下的分层树。每个分叉的分支都标有识别数字(从1开始)和识别字符串,这些数字和字符串对该层级来说是唯一的。你可以交替使用这些字符串和数字。

要引用树上的一个特定节点,你必须追踪从树的无名根到有关节点的路径。其父级ID(数字或字符串)的脉络被串起来,从最一般的开始,形成一个地址。在这个符号中,层次结构中的每个结点都用一个点来表示,所以地址最终是一系列用点分隔的ID字符串或数字。这整个地址被称为对象标识符,或OID。

在设备中嵌入SNMP agent的硬件供应商有时会用他们自己的字段和数据点实现自定义分支。然而,有一些标准的MIB分支被很好地定义,可以被任何设备所使用。

我们将讨论的标准分支都在同一个父分支结构下。该分支定义了遵守MIB-2规范的信息,该规范是对兼容设备的修订标准。

这个分支的基本路径是:

1.3.6.1.2.1

这也可以用字符串表示,如:

iso.org.dod.internet.mgmt.mib-2

1.3.6.1iso.org.dod.internet 部分是定义互联网资源的 OID。在我们的基本路径中的2mgmt是指管理子类别。下面的1mib-2定义了MIB-2规范。这里给一个 MIB 树的样例:

MIB Tree

这里有一篇 内容,可以让你熟悉 MIB 树的知识。这个页面对应的是 OID 1.3.6.1.2.1 相关的信息,你可以点击页面里边的一些链接,查看这个 OID 的父节点或子节点。

另一个类似的工具是由思科提供的 SNMP对象导航器,这可以用来深入层次结构,找到你需要的信息。

基本上,如果我们想查询设备的信息,大部分路径都会以1.3.6.1.2.1开始。您可以浏览树状界面,了解有哪些信息可供查询和设置。

联系我们交流

SNMP 协议命令

SNMP被大量采用的原因之一是可用命令的简单性。要实现或记住的操作非常少,但它们足够灵活,可以满足协议的实用性要求。

下面的PDU,即协议数据单元,描述了协议所允许的确切的信息传递类型。

  • Get: 一个Get消息是由manager发送给agent的,以请求一个特定的OID的值。这个请求会得到一个响应消息的回答,这个响应消息会带着数据被送回给 manager。
  • GetNext: GetNext消息允许 manager 请求 MIB 中的下一个连续对象。这是一种可以遍历MIB结构的方式,不用担心要查询哪些OID。
  • Set: manager向agent发送"设置"消息,以改变agent上的一个变量所持有的值。这可以用来控制配置信息或修改远程主机的状态。这是该协议定义的唯一写操作。
  • GetBulk: 这个 manager 对 agent 的请求的功能就像发出多个GetNext请求一样。返回给 manager 的回复将包含数据包允许的尽可能多的数据(在请求设定的限制范围内)。
  • Response: 该消息由 agent 发送,用于将任何请求的信息送回给 manager。它既是请求的数据的传输,也是对收到请求的确认。如果请求的数据不能返回,响应包含错误字段,可以用进一步的信息来设置。对于上述任何请求以及Inform消息,必须返回一个响应消息。
  • Trap: Trap消息一般由agent发送至manager。Trap是异步通知,因为它们不是由接收它们的 manager 主动发出的。它们主要是由agent用来通知管理人员在他们管理的设备上发生了某个事件。
  • Inform: 为了确认收到一个Trap,manager会向agent发送一个Inform消息。如果agent没有收到这个消息,它可以继续重新发送Trap消息。

通过这七种数据单元类型,SNMP就能够查询和发送有关你的网络设备的信息了。

PDU 类型 发起方 主要用途
Get manager 查询指定 OID 的值
GetNext manager 查询 MIB 中下一个连续对象
GetBulk manager 批量获取数据,类似多个 GetNext
Set manager 修改 agent 上某个变量的值
Response agent 返回请求数据或错误信息
Trap agent 主动向 manager 发送异步事件通知
Inform manager 确认收到 Trap

协议版本

SNMP协议自从被引入以来已经经历了许多变化。最初的规范是在1988年制定的RFC 1065、1066和1067。由于它已经存在了这么久,这个版本仍然被广泛支持。然而,该协议有许多安全问题,包括以纯文本进行认证,所以非常不鼓励使用它,特别是在没有保护的网络上使用。

该协议的第二版工作于1993年启动,在早期标准的基础上提供了一些实质性的改进。在这个版本中包括了一个新的 “party-based” 的安全模型,旨在解决先前版本中固有的安全问题。然而,新的模型并不是很受欢迎,因为它很难理解和实施。

正因为如此,第二版的一些 “衍生产品” 被创造出来,每个版本都保留了第二版的大部分改进,但换掉了安全模型。在SNMPv2c中,重新引入了基于社区的认证,与v1中使用的模型相同。这是V2协议最流行的版本。另一个实现,称为SNMPv2u,使用了基于用户的安全,尽管这从来都不是很流行。这允许对每个用户进行认证设置。

1998年,SNMP协议的第三个(也是目前的)版本作为一个规范提案进入。从用户的角度来看,最相关的变化是采用了一个基于用户的安全系统。它允许你将用户的认证要求设置为这些模式之一。

  • NoAuthNoPriv:以这个级别连接的用户没有认证,他们发送和接收的信息没有隐私。
  • AuthNoPriv:使用这种模式的连接必须进行认证,但消息的发送没有任何加密。
  • AuthPriv:需要认证,并且消息是加密的。

除了认证,还实施了访问控制机制,以提供对用户可以访问哪些分支的细化控制。第3版还能够利用传输协议提供的安全性,如SSH或TLS。

总结

现在你对协议的运作有了一个很好的了解,你已经有了在自己的基础设施中实施SNMP所需的基础。最后再附赠大家一个SNMP的小PPT,供大家学习参考。

如果只记住一条主线,可以这样理解:SNMP manager 带着认证信息去问 SNMP agent,agent 按 MIB 定义返回某个 OID 对应的数据。后续所有采集器配置、OID 查询、MIB 文件加载、Trap 接收,基本都围绕这条主线展开。

FAQ

Q1:SNMP manager 和 SNMP agent 有什么区别? A:SNMP manager 是发起查询的一方,通常是监控系统或采集器;SNMP agent 是响应查询的一方,通常运行在网络设备、服务器或支持 SNMP 的硬件上。

Q2:MIB 和 OID 分别是什么? A:MIB 是管理信息库,定义了可以查询或设置的信息结构;OID 是对象标识符,是 MIB 树上某个具体节点的地址。

Q3:为什么很多网络设备监控都用 SNMP? A:因为大量联网硬件设备都实现了某种形式的 SNMP 访问,SNMP 命令少、模型相对统一,适合做设备状态和性能信息采集。

Q4:SNMPv3 一定比 v2c 更好吗? A:从安全能力看,SNMPv3 提供了更先进的认证和加密能力;但实际环境中也要看设备支持、既有配置和 IDC 内部网络情况。原文译者注里也提到,IDC 内的网络设备大都是 v2c 版本。

译者注

你没有看错,这个文章是机翻的,原文地址在这里,所以句法上读起来不是太通顺,我给做了些修改和备注,应该不耽误理解了。快猫星云会持续输出监控、稳定性保障相关的技术文章,欢迎投稿哈。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 SNMP
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云