SNMP(简单网络管理协议)是什么?基础概念解析

管理员如何在一个屏幕上同时掌握几十甚至几百台网络设备的状态,答案就是SNMP。这里讲清它传输什么、怎么用,以及如何避免留下安全隐患。

什么是SNMP

在企业或数据中心这种需要管理几十甚至几百台网络设备的环境中,逐一登录每台设备查看状态并不现实。SNMP(简单网络管理协议)是一种历史悠久的网络管理标准,它让设备用统一的方式上报自身状态信息(流量、温度、错误次数等),使管理员能在一个界面上汇总查看所有设备的情况。它在1990年前后首次标准化,至今仍被路由器、交换机、防火墙、打印机、UPS电源和服务器广泛支持。

管理站-代理架构

负责发起查询的管理软件称为“管理站”(Manager),运行在每台设备上负责提供信息的软件称为“代理”(Agent),两者配对工作。当监控服务器(管理站)向路由器或交换机(代理)查询“这个端口现在的流量是多少”时,代理会读取自己保存的数值并回应。一个管理站可以同时向众多代理发起查询并汇总结果,从而构建出能一眼掌握整个网络状态的仪表盘。

MIB和OID:指向具体数值的编址体系

设备能够提供的所有信息项的清单称为MIB(管理信息库),其中每一项则由一个用点号分隔的数字编号——OID(对象标识符)——来唯一标识。查询某个OID可能得到设备的运行时长,查询另一个OID则可能得到某端口的接收字节数;管理员只要知道所需信息对应的OID,无论设备来自哪个厂商,都能用同样的方式读取到数值。例如,1.3.6.1.2.1.1.3.0是系统运行时间的标准OID。

标准MIB与厂商私有MIB

标准MIB(例如应用广泛的MIB-II)定义了接口计数器、系统描述等几乎所有设备都支持的通用数值。各厂商还会针对自家硬件的特有信息发布私有MIB,例如风扇转速、CPU温度或某项专有功能的状态。要读取厂商专有的数值,通常需要把厂商的MIB文件导入监控工具,让工具把数字形式的OID翻译成可读的名称。

基本操作:Get、Set与遍历

Get请求用于读取某个具体OID的值,GetNext或GetBulk请求则按顺序取回后续的值,监控工具“遍历”整个设备树就是这样实现的。Set请求用于修改设备上可配置的数值,功能强大,因此也是最敏感的操作。许多部署会把监控设置为只读模式,除非确有需要,否则不开启写入权限。

SNMPv1、v2c的社区字符串

早期版本的SNMP仅依靠一个类似密码的“社区字符串”来控制访问权限,按惯例读取权限常用“public”、写入权限常用“private”。由于这个字符串以明文形式在网络上传输,很容易被窃听,这一直是被广泛指出的重大弱点。尽管如此,一些老旧设备或封闭的内部网络仍然因为其简单性而继续使用SNMPv1、v2c。SNMPv2c还加入了64位计数器,这对高速链路很重要,因为32位计数器在高速下很快就会溢出归零。

SNMPv3:增强的身份验证与加密

SNMPv3引入了基于用户的身份验证,并可以对查询和响应内容本身进行加密,弥补了旧版本依赖社区字符串所带来的安全弱点。它提供三种安全级别:不认证、仅认证、认证加上加密。在安全性要求较高的环境中,建议尽可能使用开启认证与加密的SNMPv3而非v1、v2c,如今大多数新设备也都同时支持这三个版本,可以按需选择。MD5、DES等较旧的算法被认为强度不足,设备支持时应优先选择基于SHA的认证和AES加密。

所用端口与陷阱(Trap)

管理站向代理发起的查询使用UDP 161端口,而代理主动上报异常情况的陷阱(Trap)则使用UDP 162端口。通常情况下,管理站会按固定周期向代理请求数值(轮询);但如果在两次轮询之间发生设备宕机、端口故障等紧急情况,代理可以不等管理站询问,直接主动发送陷阱通知。轮询和陷阱两种方式结合,既能覆盖常规的状态检查,又能对突发情况做出快速响应。另一种叫做Inform的消息会得到接收方的确认,比普通陷阱更可靠。

基于SNMP构建的监控软件

许多开源和商用的网络监控工具都以SNMP作为主要的数据采集方式,把设备状态转化为图表和仪表盘。管理员通常只需在这类工具中登记每台设备的IP地址和社区字符串(或SNMPv3的认证信息),就能自动持续采集流量走势、设备温度、错误率等数值并绘制成图表,还可以设置超过阈值时向管理员发出告警,从而在故障扩大之前及时应对。

如何合理设置轮询间隔

常见的起点是每一到五分钟轮询一次接口计数器。轮询过于频繁会加重监控服务器和设备本身的负担,繁忙交换机的CPU也可能受到大量GetBulk遍历的影响。由于流量计数器只会不断累加,工具是通过比较两次轮询之间的差值来计算速率的,因此较长的间隔会把短时间的突发流量平滑掉,而较短的间隔则能看到更多细节。

SNMP在网络体系中处于什么位置

SNMP是一种应用层协议,和网页浏览器、邮件客户端一样运行在底层网络协议之上,但它是专门为设备与设备之间的管理通信而设计,而非面向人类用户。它使用UDP而非TCP进行通信,更看重轻量、快速的交互而非可靠送达保证,这正好契合它频繁重复轮询的使用场景。如果某次轮询丢失,管理站在下一个周期再询问一次即可。

SNMP的基本安全防护要点

如果把社区字符串保留为默认的“public”、“private”,同时又把SNMP端口暴露在公网上,任何人都可以查询甚至在最坏情况下修改设备的配置。暴露在外的SNMP服务还曾被用于反射攻击:攻击者发送伪造来源地址的小请求,设备则向受害者回复大得多的响应。至少应该修改默认字符串、通过防火墙规则或访问控制列表把SNMP访问限制在特定的管理IP地址范围内、关闭用不到的写入权限,并在设备支持的前提下尽量使用具备真正身份验证和加密能力的SNMPv3。

一份简单的排障清单

如果设备对轮询没有响应,可以依次检查:设备上是否启用了SNMP服务;社区字符串或SNMPv3用户是否完全一致;防火墙或访问控制列表是否允许监控服务器访问UDP 161;管理站上配置的版本与代理的版本是否一致。常见SNMP软件包里自带的snmpwalk、snmpget等命令,可以直接对单台设备进行测试。超时通常意味着防火墙或凭据有问题,而“no such object”通常说明设备不支持该OID。

常见问题

家庭网络中也会用到SNMP吗?

部分高端路由器和NAS设备也支持SNMP监控功能,但它在需要管理大量设备的企业和数据中心环境中应用要广泛得多。

社区字符串保持默认值会有风险吗?

会。如果把“public”、“private”这类默认值原样保留,同时把SNMP端口暴露在互联网上,任何人都可能查询到设备信息,最坏情况下甚至能修改设备配置,因此务必修改默认值,并把访问权限限制在特定的可信IP地址范围内。

陷阱和轮询有什么区别?

轮询是管理站按计划向设备索取数值,陷阱则是设备在事件发生时主动发出告警。轮询能提供用于绘制图表的连续记录,陷阱能更快地提示突发问题。大多数监控方案会同时使用两者。

应该选用哪个SNMP版本?

在设备支持的前提下,开启认证与加密的SNMPv3是最安全的选择。SNMPv2c因为简单,在封闭的内部网络中很常见,但它的社区字符串是明文传输的,应当只限于可信的管理网络。

SNMP只能用于网络设备吗?

不是。服务器、打印机、UPS电源和环境传感器往往也内置SNMP支持,所以只要各设备提供了相应的MIB,一个监控工具就可以管理多种多样的设备。