3、SNMP协议详解:SNMP版本(v1/v2c/v3)、MIB与OID结构、SNMP操作(Get/Set/Trap)
SNMP,说白了就是网络设备的「普通话」。没有它,你只能一台台设备登录上去看状态,有了它,所有交换机、路由器、防火墙都能统一汇报情况。我刚开始做运维那会儿,公司网络设备上百台,每天巡检全靠SSH连上去敲命令,效率低得想哭。后来上了SNMP,才真正体会到什么叫「躺着监控」。
今天咱们就把SNMP彻底聊透。从版本演进到MIB结构,再到三种核心操作,我会把我在项目中踩过的坑、总结的经验都抖出来。
3.1 SNMP的三个版本:v1、v2c、v3
SNMP从诞生到现在,主流就这三个版本。每个版本都有它的时代背景和适用场景,我一个个说。
3.1.1 SNMPv1——老前辈,但还能用
SNMPv1是1988年发布的,说实话,现在新项目基本不会用它了。但我在一些老旧设备上还是见过——比如某些银行的核心交换机,十年没升级过,跑的就是v1。
v1最大的问题是什么?安全机制基本为零。它用「社区字符串」(community string)来做认证,说白了就是一个明文密码。你抓个包就能看到,跟没穿衣服出门一样。
v1支持的操作也少,只有Get、GetNext、Set和Trap。没有批量获取的GetBulk,也没有通知确认的Inform。所以你要取100个接口的流量,就得发100次Get请求,效率很低。
3.1.2 SNMPv2c——最常用的版本
v2c是v1的增强版,1993年出来的。为什么叫v2c?因为它的社区字符串(community)机制跟v1一样,所以加了个"c"。
v2c最大的改进是加了两个好东西:
- GetBulk操作:一次请求可以取一大块数据。比如你要取一张路由表,以前要发N次GetNext,现在一次GetBulk搞定。我监控核心路由器的BGP路由条目时,这个功能帮了大忙。
- Inform操作:Trap的升级版。Trap是设备单向发告警,发完就不管了。Inform会要求接收方确认,没收到确认就重发,可靠性高很多。
现在绝大多数企业网络都在用v2c。它够用、简单、兼容性好。但安全方面,它跟v1一样拉胯——还是明文传密码。
3.1.3 SNMPv3——安全之王
v3是2002年发布的,解决了v1和v2c所有的安全问题。它提供了三个安全模块:
| 安全级别 | 认证 | 加密 | 说明 |
|---|---|---|---|
| noAuthNoPriv | 无 | 无 | 跟v2c一样,不推荐 |
| authNoPriv | MD5/SHA | 无 | 有认证,但数据明文传输 |
| authPriv | MD5/SHA | DES/AES | 认证+加密,最安全 |
我个人建议,只要条件允许,就用authPriv级别。虽然配置起来麻烦一点(要设用户名、认证密码、加密密码),但安全这东西,你永远不知道什么时候会出事。
我记得有一次帮一个金融客户做监控方案,他们要求所有监控流量必须加密。v2c直接pass,v3的authPriv是唯一选择。配置的时候确实多花了点时间,但客户验收时很满意。
3.2 MIB与OID结构——SNMP的灵魂
SNMP能监控什么?答案是:MIB里定义了什么,就能监控什么。
MIB(Management Information Base)就像一本字典,定义了设备上所有可管理的信息。而OID(Object Identifier)就是字典里每个词条的编号。
3.2.1 OID的树形结构
OID是树形的,从根节点开始,用数字表示路径。比如:
.1.3.6.1.2.1.1.1.0 → 系统描述(sysDescr)
.1.3.6.1.2.1.1.3.0 → 系统运行时间(sysUpTime)
.1.3.6.1.2.1.2.2.1.2 → 接口名称(ifDescr)
这串数字怎么来的?我画个图你就明白了。
你看,从根节点一路下来,.1.3.6.1就是Internet子树。再往下走:
.1.3.6.1.2→ mgmt(管理子树).1.3.6.1.2.1→ mib-2(标准MIB,几乎所有设备都支持).1.3.6.1.4→ private(私有MIB,厂商自定义)
实际工作中,你90%的时间都在跟.1.3.6.1.2.1(mib-2)打交道。比如:
.1.3.6.1.2.1.1 → system(系统信息)
.1.3.6.1.2.1.2 → interfaces(接口信息)
.1.3.6.1.2.1.4 → ip(IP层信息)
.1.3.6.1.2.1.6 → tcp(TCP连接信息)
.1.3.6.1.2.1.10 → transmission(传输层)
3.2.2 私有MIB——厂商的秘密武器
标准MIB能监控的东西有限。比如你想看华为交换机的CPU温度、风扇转速,标准MIB里没有。这时候就需要厂商的私有MIB。
私有MIB的OID通常以.1.3.6.1.4.1开头,后面跟着厂商的私有企业号。比如:
- 华为:
.1.3.6.1.4.1.2011 - 思科:
.1.3.6.1.4.1.9 - H3C:
.1.3.6.1.4.1.25506
我记得有一次监控思科交换机的堆叠状态,标准MIB根本查不到。后来去思科官网下载了私有MIB文件,用MIB Browser加载后,才找到对应的OID。折腾了大半天,但搞定之后一劳永逸。
3.3 SNMP的三种核心操作
SNMP就干三件事:读、写、告警。对应到操作就是Get、Set、Trap。
3.3.1 Get——读数据
Get是最常用的操作。NMS(网络管理系统)发一个Get请求,设备返回对应的OID值。
比如我想知道一台交换机的运行时间:
# 用snmpget命令
snmpget -v2c -c public 192.168.1.1 .1.3.6.1.2.1.1.3.0
# 返回结果
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12345678) 1 day, 10:17:36.78
这里有个细节要注意:OID末尾的.0。很多OID是标量对象(scalar),取值时必须加.0。如果是表格对象(tabular),比如接口表,就不加.0,而是用索引来定位具体行。
我刚开始学SNMP时,经常忘记加.0,结果返回"No Such Instance",排查了半天才发现是这个问题。嗯,这种坑踩过一次就不会再犯了。
3.3.2 Set——写数据
Set操作可以修改设备配置。比如远程重启一个接口:
# 将接口1的管理状态设为down(2)
snmpset -v2c -c private 192.168.1.1 .1.3.6.1.2.1.2.2.1.7.1 integer 2
3.3.3 Trap——设备主动告警
Trap是设备主动发消息给NMS。比如接口down了、CPU超了、风扇坏了,设备会主动发Trap通知你。
Trap的格式是这样的:
# 一个典型的链路down Trap
UDP: [192.168.1.1]:161->[192.168.1.100]:162
SNMPv2c Trap
.1.3.6.1.6.3.1.1.5.3 (linkDown)
.1.3.6.1.2.1.2.2.1.1.2 = 2 (接口索引)
.1.3.6.1.2.1.2.2.1.8.2 = 2 (操作状态: down)
收到Trap后,NMS会解析OID,判断是什么事件,然后触发告警。我一般会把Trap分为三个等级:
- Critical:设备宕机、链路中断、电源故障 → 立即电话通知
- Warning:CPU超80%、内存超90% → 发邮件+钉钉
- Info:配置变更、设备重启 → 记录日志,日报告警
分级管理很重要。不然一天收几百条Trap,你根本分不清哪些是紧急的。我见过一个客户,把所有Trap都设成最高级别,结果运维团队直接躺平——反正都是红色告警,看都不看了。
3.4 实战经验总结
聊了这么多,最后分享几个我这些年总结的经验:
- 版本选择:内网用v2c,外网用v3。别纠结,安全第一。
- 社区字符串:别用public/private,改成复杂点的。我习惯用
monitor_2024_ro这种格式,定期更换。 - Trap目标:至少配两个NMS服务器,主备切换。我曾经遇到过NMS服务器挂了,结果设备发了Trap没人收,故障延迟了半小时才发现。
- MIB管理:建一个MIB库,把所有设备的MIB文件统一管理。我用的工具是MIB Browser,免费好用。
- 性能监控:不要频繁轮询。一般5分钟一次就够了,关键指标可以缩短到1分钟。太频繁会把设备CPU打满。
公众号:蓝海资料掘金营,微信deep3321