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 架构目标
- 简单性: 协议简单, 易于实现
- 可扩展性: 支持添加新的管理对象
- 独立性: 独立于特定网络架构
- 最小影响: 对设备性能影响最小
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 的响应。
错误状态:
| 值 | 名称 | 描述 |
|---|---|---|
| 0 | noError | 成功 |
| 1 | tooBig | 响应过大 |
| 2 | noSuchName | 对象不存在 |
| 3 | badValue | 无效值 |
| 4 | readOnly | 对象只读 |
| 5 | genErr | 通用错误 |
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 | 认证失败 |
| egpNeighborLoss | EGP 邻居丢失 |
| 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 安全