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
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就能够查询和发送有关你的网络设备的信息了。
协议版本
SNMP协议自从被引入以来已经经历了许多变化。最初的规范是在1988年制定的RFC 1065、1066和1067。由于它已经存在了这么久,这个版本仍然被广泛支持。然而,该协议有许多安全问题,包括以纯文本进行认证,所以非常不鼓励使用它,特别是在没有保护的网络上使用。
该协议的第二版工作于1993年启动,在早期标准的基础上提供了一些实质性的改进。在这个版本中包括了一个新的 “party-based” 的安全模型,旨在解决先前版本中固有的安全问题。然而,新的模型并不是很受欢迎,因为它很难理解和实施。
正因为如此,第二版的一些 “衍生产品” 被创造出来,每个版本都保留了第二版的大部分改进,但换掉了安全模型。在SNMPv2c中,重新引入了基于社区的认证,与v1中使用的模型相同。这是V2协议最流行的版本。另一个实现,称为SNMPv2u,使用了基于用户的安全,尽管这从来都不是很流行。这允许对每个用户进行认证设置。
1998年,SNMP协议的第三个(也是目前的)版本作为一个规范提案进入。从用户的角度来看,最相关的变化是采用了一个基于用户的安全系统。它允许你将用户的认证要求设置为这些模式之一。
- NoAuthNoPriv:以这个级别连接的用户没有认证,他们发送和接收的信息没有隐私。
- AuthNoPriv:使用这种模式的连接必须进行认证,但消息的发送没有任何加密。
- AuthPriv:需要认证,并且消息是加密的。
除了认证,还实施了访问控制机制,以提供对用户可以访问哪些分支的细化控制。第3版还能够利用传输协议提供的安全性,如SSH或TLS。
总结
现在你对协议的运作有了一个很好的了解,你已经有了在自己的基础设施中实施SNMP所需的基础。最后再附赠大家一个SNMP的小PPT,供大家学习参考。
译者注
你没有看错,这个文章是机翻的,原文地址在这里,所以句法上读起来不是太通顺,我给做了些修改和备注,应该不耽误理解了。快猫星云会持续输出监控、稳定性保障相关的技术文章,欢迎投稿哈。