跳到主要内容

RFC 1157 - 简单网络管理协议 (A Simple Network Management Protocol, SNMP)

  • 状态: Historic
  • 发布日期: May 1990
  • Stream: Legacy
  • 废弃了: RFC1098
  • 勘误: 无勘误

摘要

本 RFC 定义了一个简单协议, 通过该协议, 逻辑上远程的用户可以检查或修改网络元素的管理信息。特别是, 与描述管理信息结构和管理信息库的配套备忘录一起, 这些文档为管理基于 TCP/IP 的互联网 (尤其是 Internet) 提供了一个简单、可行的架构和系统。

互联网活动委员会 (Internet Activities Board, IAB) 建议所有 IP 和 TCP 实现都具备网络可管理性。这意味着需要实现互联网 MIB (RFC 1156) 以及两种推荐管理协议之一: SNMP (RFC 1157) 或 CMOT (RFC 1095)。


目录


1. 本备忘录的状态

这是一个互联网标准协议。IAB 建议所有 IP 和 TCP 实现都具备网络可管理性, 这意味着需要实现 SNMP。


2. 简介

SNMP 的目标: 提供一个简单的协议, 用于管理互联网中的网络设备。

核心特性:

  • 监控: 查询设备状态和统计信息
  • 配置: 修改设备配置参数
  • 通知: 接收设备异常告警 (Trap)
  • 简单性: 易于实现和部署

SNMP 操作:

管理站 (Manager)                          代理 (Agent)
| |
|------ GetRequest (查询) --------------->|
|<----- GetResponse (响应) ---------------|
| |
|------ SetRequest (设置) --------------->|
|<----- GetResponse (确认) ---------------|
| |
|<----- Trap (主动告警) ------------------|

3. SNMP 架构

3.1 架构目标

  1. 简单性: 协议简单, 易于实现
  2. 可扩展性: 支持添加新的管理对象
  3. 独立性: 独立于特定网络架构
  4. 最小影响: 对设备性能影响最小

3.2 架构要素

3.2.1 管理信息的范围

SNMP 管理的信息包括:

  • 接口统计信息 (流量、错误等)
  • 路由表
  • TCP/UDP 连接
  • 系统信息

3.2.2 管理信息的表示

使用管理信息库 (Management Information Base, MIB) 表示:

MIB 对象示例:

对象标识符 (OID): 1.3.6.1.2.1.1.1.0
名称: sysDescr (系统描述)
语法: OCTET STRING
访问: 只读
值: "Cisco IOS Software, Version 15.2"

3.2.3 支持的操作

操作描述方向
GetRequest请求获取对象值管理站 → 代理
GetNextRequest请求获取下一个对象值 (用于遍历)管理站 → 代理
SetRequest请求设置对象值管理站 → 代理
GetResponse对 Get/Set 请求的响应代理 → 管理站
Trap异步事件通知代理 → 管理站

3.2.4 协议交换的形式和含义

SNMP 使用 UDP 协议:

  • 管理站端口: 162 (接收 Trap)
  • 代理端口: 161 (接收 Get/Set)

3.2.5 管理关系的定义

SNMP 使用团体名 (Community Name) 进行简单认证:

团体名: "public" (默认只读)
团体名: "private" (默认读写)

3.2.6 被管对象的标识

对象实例标识:

标量对象:

sysDescr.0  (追加 .0 表示实例)

表格对象:

ifDescr.1   (接口1的描述)
ifDescr.2 (接口2的描述)

4. 协议规范

4.1 操作要素

SNMP 消息格式

SNMP message ::= SEQUENCE {
version INTEGER, -- SNMP 版本 (0 = SNMPv1)
community OCTET STRING, -- 团体名
data PDUs -- 协议数据单元
}

4.1.1 公共结构

所有 PDU 共享的字段:

  • request-id: 请求标识符
  • error-status: 错误状态
  • error-index: 错误索引
  • variable-bindings: 变量绑定列表

4.1.2 GetRequest-PDU

目的: 检索一个或多个管理对象的值。

示例:

GetRequest {
request-id: 1234,
error-status: 0,
error-index: 0,
variable-bindings: [
{name: 1.3.6.1.2.1.1.1.0, value: NULL}, -- sysDescr
{name: 1.3.6.1.2.1.1.3.0, value: NULL} -- sysUpTime
]
}

4.1.3 GetNextRequest-PDU

目的: 检索变量绑定列表中每个变量名的字典序后继。

表格遍历示例:

步骤 1: GetNextRequest(ifDescr)
响应: ifDescr.1 = "eth0"

步骤 2: GetNextRequest(ifDescr.1)
响应: ifDescr.2 = "eth1"

步骤 3: GetNextRequest(ifDescr.2)
响应: ifType.1 = 6 (下一个对象)

4.1.4 GetResponse-PDU

目的: 对 GetRequest、GetNextRequest 或 SetRequest 的响应。

错误状态:

名称描述
0noError成功
1tooBig响应过大
2noSuchName对象不存在
3badValue无效值
4readOnly对象只读
5genErr通用错误

4.1.5 SetRequest-PDU

目的: 修改一个或多个管理对象的值。

示例:

SetRequest {
request-id: 1235,
error-status: 0,
error-index: 0,
variable-bindings: [
{name: 1.3.6.1.2.1.1.6.0, value: "新位置"} -- sysLocation
]
}

4.1.6 Trap-PDU

目的: 代理向管理站发送异步通知。

Trap 类型:

Trap描述
coldStart设备冷启动
warmStart设备热启动
linkDown链路断开
linkUp链路恢复
authenticationFailure认证失败
egpNeighborLossEGP 邻居丢失
enterpriseSpecific厂商自定义事件

Trap 消息格式:

Trap-PDU ::= SEQUENCE {
enterprise OBJECT IDENTIFIER, -- 企业 OID
agent-addr NetworkAddress, -- 代理地址
generic-trap INTEGER, -- 通用 Trap 类型
specific-trap INTEGER, -- 特定 Trap 代码
time-stamp TimeTicks, -- 时间戳
variable-bindings VarBindList -- 变量绑定
}

5. 定义

ASN.1 定义 (简化版):

RFC1157-SNMP DEFINITIONS ::= BEGIN

IMPORTS
ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
FROM RFC1155-SMI;

-- PDU 类型
PDUs ::= CHOICE {
get-request GetRequest-PDU,
get-next-request GetNextRequest-PDU,
get-response GetResponse-PDU,
set-request SetRequest-PDU,
trap Trap-PDU
}

-- GetRequest、GetNextRequest、SetRequest 共享此结构
GetRequest-PDU ::= [0] IMPLICIT PDU
GetNextRequest-PDU ::= [1] IMPLICIT PDU
SetRequest-PDU ::= [3] IMPLICIT PDU

PDU ::= SEQUENCE {
request-id INTEGER,
error-status INTEGER,
error-index INTEGER,
variable-bindings VarBindList
}

GetResponse-PDU ::= [2] IMPLICIT PDU

Trap-PDU ::= [4] IMPLICIT SEQUENCE {
enterprise OBJECT IDENTIFIER,
agent-addr NetworkAddress,
generic-trap INTEGER,
specific-trap INTEGER,
time-stamp TimeTicks,
variable-bindings VarBindList
}

VarBindList ::= SEQUENCE OF VarBind

VarBind ::= SEQUENCE {
name ObjectName,
value ObjectSyntax
}

END

6. 致谢

SNMP 的开发得益于互联网社区的广泛参与和贡献。


7. 参考文献

  • [RFC1155] - TCP/IP 互联网管理信息的结构和标识
  • [RFC1156] - 基于 TCP/IP 互联网网络管理的管理信息库
  • [RFC1098] - 简单网络管理协议 (已被本 RFC 废弃)

8. 安全考量

SNMPv1 安全局限性:

  • 弱认证: 团体名以明文传输
  • 无加密: 所有数据以明文传输
  • 无完整性保护: 消息可能被篡改

缓解措施:

  • 使用强团体名
  • 通过 IP 地址限制 SNMP 访问
  • 监控时使用只读团体名
  • 部署防火墙保护 SNMP 端口

后续版本改进:

  • SNMPv2c: 增强的协议操作
  • SNMPv3: 增加了认证、加密和访问控制 (RFC 3414)

9. 作者地址

(原始文档包含作者联系信息)


SNMP 是网络管理的基石协议。尽管 SNMPv1 安全性较弱, 但由于其简单性, 至今仍被广泛使用。

常用 SNMP 工具:

# 查询系统描述
snmpget -v1 -c public 192.168.1.1 sysDescr.0

# 遍历接口表
snmpwalk -v1 -c public 192.168.1.1 ifTable

# 设置系统位置
snmpset -v1 -c private 192.168.1.1 sysLocation.0 s "北京"

常用 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.2.1.2.2.1.10 - ifInOctets (接口输入字节数)

相关 RFC:

  • RFC 1155 - SMI (管理信息结构)
  • RFC 1156 - MIB-I
  • RFC 1213 - MIB-II
  • RFC 3414 - SNMPv3 安全