第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 基本架构

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 安全问题

SNMPv1/v2c 的 Community String 安全问题 - 图示

Community String 的安全问题总结:

问题 说明
明文传输 Community String 以明文形式在报文中传输
默认值普遍 "public"(只读)和 "private"(读写)被广泛使用
无加密 整个 SNMP 报文内容(包括 MIB 数据)均未加密
权限粗糙 只有"读"和"读写"两个级别,无法细粒度控制

3.2 SNMPv3 的安全架构

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

根因

  1. 所有设备使用默认 Community String "public"/"private"
  2. 未配置 ACL 限制 SNMP 访问源
  3. 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

思考

  1. SNMPv2c 的 Community String 以明文传输。如果通过网络 ACL 严格限制了 SNMP 访问源 IP,是否足以保证安全?为什么仍然推荐使用 SNMPv3?

  2. SNMPv3 的 authPriv 级别使用 SHA-256 认证和 AES-128 加密。SNMP 报文加密后,网管系统抓包还能看到设备信息吗?

  3. SNMP Trap 使用 UDP 发送,不保证到达。如果 Trap 丢失导致关键告警未被及时感知,除了改用 Inform,还有什么替代方案?

下篇预告:第127篇:SNMP MIB 与 OID:如何读取设备指标