2. 网络接口与链路层观测
聊到网络监控,SNMP 几乎是绕不开的。我刚开始做网络运维那会儿,觉得 SNMP 就是个「黑盒子」——设备能出数据,但怎么出的、出的是什么,完全不清楚。后来踩了几次坑,才老老实实把协议基础啃了一遍。今天咱们就把它拆开看看。
SNMP 架构:三个角色一台戏
SNMP 的架构其实特别简单,就三个角色:NMS、Agent、MIB。你想想看,这不就是「管理者—被管理者—管理手册」的关系吗?
- NMS(网络管理系统):负责发号施令、收数据、展示图表。比如你搭的 Zabbix、Prometheus,或者商业的 SolarWinds,都属于 NMS。
- Agent(代理):跑在网络设备上的一个小程序。交换机、路由器、防火墙里都有它。它的任务就是听 NMS 的指令,然后去读或写设备上的参数。
- MIB(管理信息库):说白了就是一本「字典」。它定义了设备能提供哪些数据,每个数据叫什么名字、是什么类型、怎么取值。
我在项目中遇到过一种情况:新买的设备,NMS 怎么都取不到数据。查了半天,发现是 Agent 默认没开启,或者 MIB 文件没加载。嗯,这种问题其实很常见,别慌。
一句话总结:NMS 是老板,Agent 是员工,MIB 是员工手里的工作手册。老板按手册问员工要数据,员工照着手册给答案。
MIB 与 OID:数据怎么定位?
MIB 里的每个数据项都有一个唯一的编号,叫 OID(对象标识符)。OID 是树状结构的,像文件路径一样。比如:
.1.3.6.1.2.1.1.5.0 → 系统名称(sysName)
.1.3.6.1.2.1.2.2.1.2 → 接口描述(ifDescr)
.1.3.6.1.2.1.4.20.1.1 → IP 地址(ipAdEntAddr)
你可能会问:「这串数字怎么记?」其实不用记。大部分 NMS 工具都内置了 MIB 浏览器,你点选树节点就行。但我个人习惯把常用的 OID 记在笔记本里,排查问题时直接敲命令,比翻界面快得多。
小技巧:用 snmpwalk 命令可以遍历整个 MIB 树,看看设备到底支持哪些 OID。我第一次用这个命令时,发现设备居然暴露了 2000 多个 OID,吓一跳。
SNMP 版本:v1、v2c、v3 怎么选?
SNMP 有三个主流版本,我按时间线给你捋一遍。
| 版本 | 特点 | 安全性 | 适用场景 |
|---|---|---|---|
| v1 | 最早版本,只支持简单认证(团体名) | 极低,团体名明文传输 | 基本淘汰,别用了 |
| v2c | 改进了性能,支持批量取数(GetBulk) | 仍然低,团体名明文 | 内网监控、实验室环境 |
| v3 | 增加了加密和认证(USM) | 高,支持 MD5/SHA 认证 + DES/AES 加密 | 生产环境、跨公网监控 |
我曾经在一个客户现场,发现他们的核心交换机用的是 v1 版本,团体名还是 public。我当场就建议他们升级到 v2c 至少换个复杂团体名,最好直接上 v3。你想想看,明文团体名等于把设备密码写在门上,谁都能进来读数据。
注意:v2c 虽然叫「v2c」,但它和 v2 不兼容。v2 基本没人用,市面上说的「v2」默认就是 v2c。别搞混了。
SNMP 操作:Get、Set、Trap
SNMP 的操作就三种,不多。我画了张图帮你理解它们的关系。
Get 操作
这是最常用的操作。NMS 发一个 Get 请求,带上 OID,Agent 返回对应的值。比如:
snmpget -v2c -c public 192.168.1.1 .1.3.6.1.2.1.1.5.0
# 返回:SNMPv2-MIB::sysName.0 = STRING: Core-Switch-01
还有一种叫 GetBulk,v2c 开始支持。它可以一次取一大片数据,比如遍历整个接口表。我监控 100 台交换机时,用 GetBulk 比一个个 Get 快了不止 10 倍。
Set 操作
Set 用来写配置。比如远程重启一个端口:
snmpset -v2c -c private 192.168.1.1 .1.3.6.1.2.1.2.2.1.7.1 i 2
# 把接口 1 的管理状态设为 down(2 表示 down)
注意:Set 操作很危险。我曾经在生产环境上误操作,把一个核心交换机的端口给 shutdown 了,导致业务中断 5 分钟。从那以后,我写脚本时都会加一个「确认弹窗」或者先做 snmpget 读一下当前值。
Trap 操作
Trap 是 Agent 主动发起的。比如设备温度过高、链路断开,Agent 会立刻发一条 Trap 给 NMS。NMS 收到后可以弹窗、发邮件、甚至自动执行脚本。
我记得有一次凌晨 3 点,监控系统突然弹出几十条 Trap,全是「端口 Down」。我远程一看,原来是施工队把光纤挖断了。要不是 Trap 及时告警,业务中断到早上都没人知道。
建议:生产环境一定要配 Trap 接收器。别只依赖 NMS 轮询,轮询周期通常是 5 分钟,这 5 分钟里可能已经出大事了。
版本选择建议
说了这么多,到底用哪个版本?我个人的经验是这样的:
- 内网、实验室、非关键业务:用 v2c 就够了。团体名设复杂点,比如
MyC0mp!exC0mmunity,别用public。 - 生产环境、跨公网、安全要求高:必须上 v3。虽然配置比 v2c 麻烦一点(要配用户名、认证密码、加密密码),但值得。
- 老旧设备:有些老交换机只支持 v1,那就没办法了。建议用 ACL 限制 SNMP 的源 IP,只允许 NMS 服务器访问。
你想想看,如果 SNMP 被攻击者利用,他能读到你的设备型号、版本、接口流量、路由表,甚至能改配置。所以安全这块,千万别偷懒。
核心要点回顾:
- SNMP 架构 = NMS + Agent + MIB,三者缺一不可
- OID 是数据的「身份证」,树状结构,从 .1.3.6.1 开始
- v1 已淘汰,v2c 够用但明文,v3 安全但配置复杂
- 三种操作:Get(读)、Set(写)、Trap(主动告警)
- 生产环境优先用 v3,至少用 v2c + 复杂团体名 + ACL