Skip to main content

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 架构目标

  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
访问: 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。

错误状态:

名称描述
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: "New Location"} -- 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] - 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安全