RFC 1157 - 简单网络管理协议 (A Simple Network Management Protocol, SNMP)
网络工作组
请求评论: 1157
废弃: RFC 1098
作者:
J. Case (SNMP Research)
M. Fedor (Performance Systems International)
M. Schoffstall (Performance Systems International)
J. Davin (MIT Laboratory for Computer Science)
发布日期: 1990年5月
摘要
本RFC定义了一个简单协议,通过该协议,逻辑上远程的用户可以检查或更改网络元素的管理信息。特别是,与描述管理信息结构和管理信息库的配套备忘录一起,这些文档提供了一个简单、可行的架构和系统,用于管理基于TCP/IP的互联网,特别是互联网。
互联网活动委员会 (Internet Activities Board, IAB) 建议所有IP和TCP实现都应该是可网络管理的。这意味着实施互联网MIB (RFC 1156) 和至少两种推荐管理协议之一: SNMP (RFC 1157) 或CMOT (RFC 1095)。
目录 (Table of Contents)
1. 本备忘录的状态
这是互联网标准协议。IAB建议所有IP和TCP实现都应该是可网络管理的,这意味着实施SNMP。
2. 简介
SNMP的目标: 提供一个简单的协议来管理互联网中的网络设备。
核心特点:
- 🔍 监控: 查询设备状态和统计信息
- ⚙️ 配置: 修改设备配置参数
- 🔔 告警: 接收设备异常通知 (Traps)
- 📊 简单: 易于实现和部署
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
访问: read-only
值: "Cisco IOS Software, Version 15.2"
3.2.3 支持的操作
| 操作 | 描述 | 方向 |
|---|---|---|
| GetRequest | 请求获取对象值 | Manager → Agent |
| GetNextRequest | 请求获取下一个对象值 (用于遍历) | Manager → Agent |
| SetRequest | 请求设置对象值 | Manager → Agent |
| GetResponse | 响应Get/Set请求 | Agent → Manager |
| Trap | 异步通知事件 | Agent → Manager |
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消息 ::= 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: "New Location"} -- 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] - Structure and Identification of Management Information for TCP/IP-based Internets
- [RFC1156] - Management Information Base for Network Management of TCP/IP-based internets
- [RFC1098] - A Simple Network Management Protocol (被本RFC废弃)
8. 安全考虑
SNMPv1安全限制:
⚠️ 弱认证: 团体名以明文传输
⚠️ 无加密: 所有数据明文传输
⚠️ 无完整性保护: 消息可能被篡改
缓解措施:
- 使用强团体名
- 限制SNMP访问的IP地址
- 使用只读团体名进行监控
- 部署防火墙保护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 "Beijing"
常用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安全