简介
作为系统管理员的重要工作之一是收集关于服务器和基础设施的准确信息。有许多工具和选项可用于收集和处理这种类型的信息。其中许多工具都是建立在一种称为SNMP的技术之上。
SNMP代表简单网络管理协议。这是服务器可以共享有关其当前状态的信息的一种方式,也是管理员可以修改预定义值的通道。虽然协议本身非常简单,但实现SNMP的程序的结构可能非常复杂。
在本指南中,我们将向您介绍SNMP协议的基础知识。我们将介绍其用途,协议在网络中的典型使用方式,协议版本之间的差异等。
基本概念
SNMP是实现在网络堆栈的应用层上的协议(点击这里了解网络层)。该协议被创建为一种以一致的方式从非常不同的系统中收集信息的方式。尽管它可以与各种系统连接,但查询信息的方法和相关信息的路径是标准化的。
SNMP协议有多个版本,许多网络硬件设备实现了某种形式的SNMP访问。最广泛使用的版本是SNMPv1,但在许多方面它是不安全的。它的流行主要源于其无处不在和长期存在。除非您有充分的理由不这样做,我们建议您使用提供更高级安全功能的SNMPv3。
一般来说,由SNMP进行配置文件的网络主要由包含SNMP 代理的设备组成。代理是一个可以收集有关硬件的信息,将其组织成预定义条目,并使用SNMP协议响应查询的程序。
在这个模型中,用于向代理查询信息的组件称为SNMP 管理器。这些机器通常具有其网络中所有支持SNMP的设备的数据,并可以发出请求以收集信息和设置某些属性。
SNMP管理器
SNMP管理器是配置为轮询SNMP代理以获取信息的计算机。在仅讨论其核心功能时,管理组件实际上比客户端配置要简单得多,因为管理组件只是请求数据。
管理器可以是任何能够使用正确凭据向SNMP代理发送查询请求的计算机。有时,这是作为监控套件的一部分实现的,而其他时候,这是管理员使用一些简单的实用程序来快速创建请求。
在SNMP协议中定义的几乎所有命令(我们稍后将详细介绍这些)都是设计为由管理器组件发送。这些包括GetRequest
、GetNextRequest
、GetBulkRequest
、SetRequest
、InformRequest
和Response
。除此之外,管理器还被设计为响应Trap
和Response
消息。
SNMP代理
SNMP代理完成了大部分工作。它们负责收集有关本地系统的信息并将其存储在可以查询的格式中。更新名为“管理信息库”或MIB的数据库。
MIB是一个分层的、预定义的结构,用于存储可以查询或设置的信息。这些信息可以由已经使用正确凭据(即SNMP管理器)进行的良好形式的SNMP请求访问。
代理计算机配置了哪些管理器可以访问其信息。它还可以充当中间人,报告它可以连接到但未配置为SNMP流量的设备的信息。这为使组件在线并且可通过SNMP访问提供了很大的灵活性。
SNMP代理响应协议定义的大多数命令。这些包括GetRequest
、GetNextRequest
、GetBulkRequest
、SetRequest
和InformRequest
。此外,代理被设计为发送Trap
消息。
理解管理信息库
SNMP系统中最难理解的部分可能是MIB,或管理信息库。MIB是一个数据库,遵循管理器和代理遵循的标准。它是一个分层结构,在许多领域是全球标准化的,但也足够灵活,可以允许供应商特定的添加。
MIB结构最好理解为自上而下的分层树。每个分支都带有一个标识号(从1开始)和一个唯一的标识字符串,用于该层次结构的标识。您可以互换使用字符串和数字。
要引用树的特定节点,必须从树的未命名根到所讨论的节点的路径。其父ID(数字或字符串)的血统被串在一起,从最一般的开始,形成一个地址。层次结构中的每个交叉点在此表示中由一个点表示,因此地址最终成为一系列由点分隔的ID字符串或数字。整个地址被称为对象标识符,或OID。
将SNMP代理嵌入其设备的硬件供应商有时会实现具有自己字段和数据点的自定义分支。但是,有一些标准的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树的好资源。这个特定页面代表了我们一直在谈论的交叉点的连接节点。您可以通过检查“上级”和“下级”引用来查看树的更上层和更下层的内容。
思科提供的SNMP对象导航器是另一个类似的工具。这可以用于深入了解层次结构,以找到您需要的信息。SolarWinds也提供了类似的树。
基本上,如果我们想要查询我们的设备以获取信息,大多数路径将以1.3.6.1.2.1
开头。您可以浏览树界面以了解可以查询和设置的信息类型。
SNMP 协议命令
SNMP 被广泛采用的一个原因是其命令的简单性。虽然要实现或记住的操作很少,但它们足够灵活,以满足协议的实用要求。
以下的协议数据单元(PDU)描述了协议允许的确切消息类型:
- Get:管理器向代理发送 Get 消息,以请求特定 OID 的值。这个请求将通过 Response 消息回复给管理器,并携带数据。
- GetNext:GetNext 消息允许管理器请求 MIB 中的下一个顺序对象。这是一种可以遍历 MIB 结构而不必担心要查询哪些 OID 的方法。
- Set:管理器向代理发送 Set 消息,以更改代理上变量的值。这可用于控制配置信息或以其他方式修改远程主机的状态。这是协议定义的唯一写操作。
- GetBulk:这个管理器到代理的请求的功能就好像进行了多个 GetNext 请求。回复给管理器的数据将尽可能多(在请求设置的约束内),以适应数据包的大小。
- Response:代理发送的这个消息用于将任何请求的信息发送回管理器。它既作为请求的数据的传输,也作为对请求接收的确认。如果无法返回请求的数据,响应将包含可以设置进一步信息的错误字段。对于上述任何请求以及 Inform 消息,都必须返回一个响应消息。
- Trap:Trap 消息通常由代理发送给管理器。Trap 是异步通知,即接收到它们的管理器是未经请求的。它们主要用于代理通知管理器其受管设备上正在发生的事件。
- Inform:为了确认接收到一个 Trap,管理器向代理发送 Inform 消息。如果代理没有收到此消息,它可能会继续重新发送 Trap 消息。
有了这七种数据单元类型,SNMP 能够查询并发送关于您网络设备的信息。
协议版本
自首次引入以来,SNMP 协议经历了许多变化。最初的规范是在 1988 年的 RFC 1065、1066 和 1067 中制定的。由于它已经存在了很长时间,因此仍然得到广泛支持。然而,该版本存在许多安全问题,包括以明文进行身份验证,因此在未受保护的网络上使用时,其使用是极不鼓励的。
协议的第二个版本工作始于 1993 年,并对早期标准进行了一些重大改进。这个版本包括一个新的“基于 party”的安全模型,旨在解决先前版本固有的安全问题。然而,这个新模型并不是很受欢迎,因为它难以理解和实现。
因此,版本 2 的一些“分支”被创建,每个分支保留了版本 2 的大部分改进,但替换了安全模型。在 SNMPv2c 中,重新引入了基于社区的认证,这是 v1 中使用的相同模型。这是 v2 协议中最受欢迎的版本。另一个实现称为 SNMPv2u,使用基于用户的安全性,尽管这从未很受欢迎。这允许针对每个用户进行身份验证设置。
1998 年,SNMP 协议的第三个(也是当前的)版本作为规范提案进入。从用户的角度来看,最相关的变化是采用了基于用户的安全系统。它允许您将用户的身份验证要求设置为以下模型之一:
- NoAuthNoPriv:使用此级别连接的用户没有进行身份验证,也没有消息的隐私。
- AuthNoPriv:使用此模型的连接必须进行身份验证,但消息是未加密的。
- AuthPriv:需要身份验证并且消息是加密的。
除了身份验证外,还实施了访问控制机制,以提供对用户可以访问哪些分支的细粒度控制。版本 3 还具有利用传输协议(如 SSH 或 TLS)提供的安全性的能力。
结论
现在您对协议的运作方式有了很好的了解,您已经具备了在自己的基础设施中实施 SNMP 所需的基础。
在下一个指南中,我们将讨论如何安装和配置必要的组件,以利用系统上的 SNMP。