核心要点摘要
- 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.1 或 iso.org.dod.internet 部分是定义互联网资源的 OID。在我们的基本路径中的2或mgmt是指管理子类别。下面的1或mib-2定义了MIB-2规范。这里给一个 MIB 树的样例:

这里有一篇 内容,可以让你熟悉 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 版本。
译者注
你没有看错,这个文章是机翻的,原文地址在这里,所以句法上读起来不是太通顺,我给做了些修改和备注,应该不耽误理解了。快猫星云会持续输出监控、稳定性保障相关的技术文章,欢迎投稿哈。
