第126篇:SNMP v1/v2c/v3:网络管理协议演进
关键词:SNMP、v1/v2c/v3、Community String、USM、网络管理、网管系统、Trap、华为
一、引言
SNMP(Simple Network Management Protocol,简单网络管理协议)自 1988 年诞生以来,一直是网络管理的基石协议。无论是 Zabbix、Prometheus、SolarWinds 还是华为 eSight,几乎所有网管系统都依赖 SNMP 采集设备指标、监控接口状态、接收设备告警。
从最初的 SNMPv1 到当前的 SNMPv3,协议经历了三次重大演进,每一次都针对前一代的安全缺陷进行改进。理解各版本的区别,特别是安全性方面的差异,对于网络管理系统的规划和部署至关重要。
二、核心概念
2.1 SNMP 基本架构

| 组件 | 说明 |
|---|---|
| Manager(管理器) | 网管系统,发起查询和接收告警 |
| Agent(代理) | 被管设备上的 SNMP 进程,响应查询和发送告警 |
| MIB(管理信息库) | 定义可管理对象的树状结构 |
| OID(对象标识符) | MIB 中每个对象的唯一标识路径 |
2.2 SNMP 版本对比
| 特性 | SNMPv1 | SNMPv2c | SNMPv3 |
|---|---|---|---|
| 发布年份 | 1988(RFC 1157) | 1993(RFC 1901) | 2002(RFC 3411) |
| 认证方式 | Community String(明文) | Community String(明文) | USM(用户名 + 认证密码 + 加密密码) |
| 加密 | 无 | 无 | DES / 3DES / AES-128/192/256 |
| GetBulk 操作 | 不支持 | 支持(批量获取,效率高) | 支持 |
| 错误码 | 简单(4 种) | 详细(更多错误类型) | 详细 |
| 访问控制 | 基于 Community | 基于 Community + View | 基于用户 + View + ACL |
| 安全性 | ❌ 低 | ❌ 低 | ✅ 高 |
| 推荐程度 | ❌ 已废弃 | ⚠️ 过渡使用 | ✅ 强烈推荐 |
2.3 SNMP 操作类型
| 操作 | 说明 | 方向 | 支持版本 |
|---|---|---|---|
| Get | 获取单个 OID 的值 | Manager → Agent | v1/v2c/v3 |
| GetNext | 获取按字典序排列的下一个 OID 的值 | Manager → Agent | v1/v2c/v3 |
| GetBulk | 批量获取多个 OID 的值(一次请求获取一整表) | Manager → Agent | v2c/v3 |
| Set | 修改 OID 的值(如关闭端口、修改描述) | Manager → Agent | v1/v2c/v3 |
| Trap | 设备主动发送告警(不可靠,无需确认) | Agent → Manager | v1/v2c/v3 |
| Inform | 需要确认的 Trap(可靠,需 Manager 回复) | Agent → Manager | v2c/v3 |
三、技术细节
3.1 SNMPv1/v2c 的 Community String 安全问题

Community String 的安全问题总结:
| 问题 | 说明 |
|---|---|
| 明文传输 | Community String 以明文形式在报文中传输 |
| 默认值普遍 | "public"(只读)和 "private"(读写)被广泛使用 |
| 无加密 | 整个 SNMP 报文内容(包括 MIB 数据)均未加密 |
| 权限粗糙 | 只有"读"和"读写"两个级别,无法细粒度控制 |
3.2 SNMPv3 的安全架构
SNMPv3 引入三层安全架构,从根本上解决安全问题:

SNMPv3 安全级别:
| 安全级别 | 认证 | 加密 | 说明 | 推荐程度 |
|---|---|---|---|---|
| noAuthNoPriv | 无 | 无 | 不认证不加密,与 v1/v2c 安全性相同 | ❌ 不推荐 |
| authNoPriv | MD5/SHA | 无 | 认证但不加密,防篡改不防窃听 | ⚠️ 一般 |
| authPriv | MD5/SHA | DES/AES | 认证 + 加密,完整安全保护 | ✅ 强烈推荐 |
3.3 Trap 与 Inform 的区别
| 特性 | Trap | Inform |
|---|---|---|
| 确认机制 | 无确认(Fire and Forget) | 需要 Manager 回复确认 |
| 可靠性 | 不可靠(可能丢失) | 可靠(丢失重传) |
| 开销 | 低 | 高(需维护确认状态) |
| 适用场景 | 大量告警、对可靠性要求不高 | 关键告警、不能丢失 |
四、实战配置/案例分析
4.1 SNMPv2c 配置(过渡方案)
# ========== SNMPv2c 基础配置 ==========
<HUAWEI> system-view
[HUAWEI] sysname Access-SW-01
# 启用 SNMP Agent
[HUAWEI] snmp-agent
# 配置系统信息
[HUAWEI] snmp-agent sys-info version all
# 启用所有 SNMP 版本(v1/v2c/v3),向后兼容
# 配置只读 Community(建议修改默认值)
[HUAWEI] snmp-agent community read SecRead2024Str0ng
# 配置读写 Community(生产环境谨慎使用)
[HUAWEI] snmp-agent community write SecWrite2024Str0ng
# 限制 SNMP 访问源 IP(通过 ACL)
[HUAWEI] acl number 2000
[HUAWEI-acl-basic-2000] rule 5 permit source 10.100.0.50 0
# 只允许网管服务器 10.100.0.50 访问
[HUAWEI-acl-basic-2000] rule 10 permit source 10.100.0.51 0
# 只允许告警服务器 10.100.0.51 接收 Trap
[HUAWEI-acl-basic-2000] quit
# 将 ACL 应用到 Community
[HUAWEI] snmp-agent community read SecRead2024Str0ng acl 2000
[HUAWEI] snmp-agent community write SecWrite2024Str0ng acl 2000
# 配置 Trap 目标地址
[HUAWEI] snmp-agent target-host trap address udp-domain 10.100.0.51 params securityname SecRead2024Str0ng
# 当设备产生告警时,向 10.100.0.51 发送 Trap
# 配置 Trap 过滤(只发送特定类型的 Trap)
[HUAWEI] snmp-agent trap enable
[HUAWEI] snmp-agent trap filter source-interface LoopBack 0
# ========== 验证 ==========
[HUAWEI] display snmp-agent
[HUAWEI] display snmp-agent target-host
4.2 SNMPv3 配置(推荐方案)
# ========== SNMPv3 完整配置 ==========
# 启用 SNMP Agent 和 v3 版本
[HUAWEI] snmp-agent
[HUAWEI] snmp-agent sys-info version v3
# 创建 SNMPv3 安全组
[HUAWEI] snmp-agent group v3 NMS-Admin security-level priv
# 创建 SNMPv3 用户(认证 + 加密)
# 用户名: admin
# 认证方式: SHA-256
# 认证密码: Admin@Auth2024!
# 加密方式: AES-128
# 加密密码: Admin@Priv2024!
[HUAWEI] snmp-agent usm-user v3 admin group NMS-Admin auth-mode sha256 Admin@Auth2024! privacy-mode aes128 Admin@Priv2024!
# 配置 MIB View(限制可访问的 MIB 范围)
[HUAWEI] snmp-agent community read SecRead2024Str0ng cipher YourEncryptedString
[HUAWEI] snmp-agent view full-view included 1.3.6.1.2.1
# 允许访问所有标准 MIB-2
# 将 View 绑定到安全组
[HUAWEI] snmp-agent group v3 NMS-Admin read-vacm full-view write-vacm full-view
# 配置 Trap 目标(使用 SNMPv3)
[HUAWEI] snmp-agent target-host trap address udp-domain 10.100.0.51 params securityname admin security-level priv
# 配置 Trap 源接口
[HUAWEI] snmp-agent trap source interface LoopBack 0
# ========== 验证 ==========
[HUAWEI] display snmp-agent usm-user
# User Name : admin
# Group Name : NMS-Admin
# Auth Protocol: SHA256
# Privacy Proto: AES128
# Security Level: priv
[HUAWEI] display snmp-agent statistics
# SNMP statistics information:
# Get request : 1250
# GetNext request : 380
# GetBulk request : 95
# Set request : 12
# Trap sent : 47
4.3 故障案例:SNMPv2c Community 泄露导致网络信息暴露
场景描述
某企业网络的安全审计中发现,网络中大量交换机使用默认 Community String "public" 和 "private"。安全团队通过简单的 SNMP Walk 命令,获取了全网所有交换机的接口列表、MAC 地址表、ARP 表、路由表、CPU 和内存利用率等敏感信息。
排查过程
# 攻击者使用的简单命令
# snmpwalk -v2c -c public 10.10.0.0/24 1.3
# 结果:获取了所有使用默认 Community 的设备全部 MIB 信息
# 内部排查
[Access-SW] display current-configuration | include snmp
# snmp-agent community read public
# snmp-agent community write private
# 使用了默认 Community String
根因
- 所有设备使用默认 Community String "public"/"private"
- 未配置 ACL 限制 SNMP 访问源
- SNMPv2c 报文未加密,可在网络中被抓包
处理
# 第一步:立即修改 Community String
[HUAWEI] snmp-agent community read SecRead2024Str0ng
[HUAWEI] snmp-agent community write SecWrite2024Str0ng
# 第二步:配置 ACL 限制访问源
[HUAWEI] acl number 2000
[HUAWEI-acl-basic-2000] rule 5 permit source 10.100.0.50 0
[HUAWEI-acl-basic-2000] quit
[HUAWEI] snmp-agent community read SecRead2024Str0ng acl 2000
# 第三步:升级到 SNMPv3(长期方案)
[HUAWEI] snmp-agent sys-info version v3
[HUAWEI] snmp-agent usm-user v3 admin auth-mode sha256 Admin@Auth2024! privacy-mode aes128 Admin@Priv2024!
# 第四步:禁用 SNMPv2c(仅保留 v3)
# 在网管系统完成 v3 迁移后,逐步禁用 v2c
4.4 故障案例:SNMP Trap 丢失导致告警延迟
场景描述
运维团队报告,交换机端口 Down 告警延迟了约 10 分钟才被网管系统接收。经排查,发现 Trap 报文中途被防火墙丢弃。
排查
# 检查 Trap 发送统计
[Core-SW] display snmp-agent statistics
# Trap sent : 156
# 但网管系统只收到约 120 条
# 检查防火墙日志
# Firewall: Dropped UDP packet from 10.10.0.1:161 to 10.100.0.51:162
# SNMP Trap 使用 UDP 162 端口,被防火墙 ACL 拦截
处理
# 在防火墙上放行 SNMP Trap
# 允许从交换机(UDP 161 源端口)到网管服务器(UDP 162 目的端口)的流量
# firewall permit udp source 10.10.0.0/16 destination 10.100.0.51 destination-port 162
# 或使用 Inform 代替 Trap(可靠传输)
[Core-SW] snmp-agent target-host inform address udp-domain 10.100.0.51 params securityname admin security-level priv
# Inform 需要确认,丢失会重传
五、总结
| 项目 | 说明 |
|---|---|
| SNMPv1/v2c | 使用 Community String,明文传输,不安全 |
| SNMPv3 | USM 安全模型,支持认证(SHA/MD5)和加密(AES/DES) |
| 安全级别 | authPriv(认证 + 加密)为推荐配置 |
| GetBulk | v2c/v3 支持,批量获取效率高 |
| Trap vs Inform | Trap 不可靠但开销低,Inform 可靠但开销高 |
| 华为推荐 | 全面使用 SNMPv3 authPriv 级别 + ACL 限制访问源 |
| 过渡方案 | v2c + ACL + 非默认 Community(短期),尽快迁移到 v3 |
思考
-
SNMPv2c 的 Community String 以明文传输。如果通过网络 ACL 严格限制了 SNMP 访问源 IP,是否足以保证安全?为什么仍然推荐使用 SNMPv3?
-
SNMPv3 的 authPriv 级别使用 SHA-256 认证和 AES-128 加密。SNMP 报文加密后,网管系统抓包还能看到设备信息吗?
-
SNMP Trap 使用 UDP 发送,不保证到达。如果 Trap 丢失导致关键告警未被及时感知,除了改用 Inform,还有什么替代方案?
下篇预告:第127篇:SNMP MIB 与 OID:如何读取设备指标