简单网络管理协议

简单网络管理协议（SNMP，Simple Network Management Protocol）构成了網際網路工程工作小组（IETF，Internet Engineering Task Force）定义的Internet协议族的一部分。该协议能够支持網路管理系統，用以监测连接到网络上的设备是否有任何引起管理上关注的情况。它由一組網路管理的標準組成，包含一個應用層協議（application layer protocol）、資料庫模式（database schema），和一組資料物件。

 概論和基礎觀念 
在典型的SNMP用法中，有許多系統被管理，而且是有一或多個系統在管理它們。每一個被管理的系統上有運行一個叫做代理者（agent）的軟體元件，且透過SNMP對管理系統報告資訊。

基本上，SNMP代理者以變數呈現管理資料。管理系統透過GET，GETNEXT和GETBULK協定指令取回資訊，或是代理者在沒有被詢問的情況下，使用TRAP或INFORM傳送資料。管理系統也可以傳送配置更新或控制的請求，透過SET協定指令達到主動管理系統的目的。配置和控制指令只有當網路基本結構需要改變的時候使用，而監控指令則通常是常態性的工作。

可透過SNMP存取的變數以階層的方式結合。這些分層和其他元數據（例如變數的類型和描述）以管理信息庫（s）的方式描述。

 SNMP基本元件 
一個SNMP管理的網路由下列三個關鍵元件組成：

 網路管理系統（NMSs，Network-management systems）
 被管理的設備（managed device）
 代理者（agent）

一個網路管理系統執行應用程式，以該應用程式監視並控制被管理的設備。也稱為管理實體（managing entity），網路管理員在這兒與網路裝置進行互動。網路管理系統提供網路管理需要的大量運算和記憶資源。一個被管理的網路可能存在一個以上的網路管理系統。

一個被管理的設備是一個網路節點，它包含一個存在於被管理的網路中的SNMP代理者。被管理的設備透過管理信息庫（MIB）收集並儲存管理資訊，並且讓網路管理系統能夠透過SNMP代理者取得這項資訊。

代理者是一種存在於被管理的設備中的網路管理軟體模組。代理者控制本地機器的管理資訊，以和SNMP相容的格式傳送這項資訊。

 SNMP架構 
從體系結構上來講，SNMP框架由主代理、子代理和管理站組成。

 主代理 
主代理是一個在可執行SNMP的網路元件上運作的軟體，可回應從管理站發出的SNMP要求。它的角色類似客戶端/伺服器結構（Client/Server）術語中的伺服器。主代理依賴子代理提供有關特定功能的管理資訊。

如果系統當前擁有多個可管理的子系統，主代理就會傳遞它從一個或多個子代理處收到的請求。這些子代理在一個子系統以及對那個子系統進行監測和管理操作的介面內為關心的物件建模。主代理和子代理的角色可以合併，在這種情況下我們可以簡單的稱之為代理（agent）。

 子代理 
子代理是一個在可執行SNMP的網路元件上運作的軟體，執行在特定子系統的特定管理信息庫（MIB，Management Information Base）中定義的資訊和管理功能。子代理的一些能力有：

 搜集主代理的資訊
 配置主代理的參數
 回應管理者的要求
 產生警告或陷阱

對協定和管理資訊結構的良好分離使得使用SNMP來監測和管理同一網路內上百的不同子系統非常簡單。MIB模型運行管理OSI參考模型的所有層，並可以擴展至諸如資料庫，電子郵件以及J2EE參考模型之類的應用。

 管理站 
管理者或者管理站提供第三個元件。它和一個客戶端/伺服器結構下的用戶端一樣工作。它根據一個管理員或應用程式的行為發出管理操作的請求，也接收從代理處獲得的TRAP。

 SNMP協議 

 SNMP第一版和SMI規格的資料型態 
SNMP第一版SMI指定許多SMI規格的資料型態，它們被分為兩大類：

 簡單資料型態
 泛應用資料型態

 SNMP第二版和管理資訊結構 
SNMP第二版SMI在RFC 2578之中描述，它在SNMP第一版的SMI規格資料型態上進行增加和強化，例如位元串（bit strings）、網路位址（network addresses）和計數器（counters）。

SNMP協定在OSI模型的應用層（第七層）運作，在第一版中指定五種核心PDU：

 GET REQUEST
 GET NEXT REQUEST
 GET RESPONSE
 SET REQUEST
 TRAP

其他PDU在SNMP第二版加入，包含：

 GETBULK REQUEST
 INFORM

 SNMP第二版SMI資訊模塊 
SNMP第二版SMI也指定了資訊模塊來詳細說明一群相關連的定義。有三種SMI資訊模塊：MIB模塊、回應狀態、能力狀態。

 SNMP第三版 
SNMP第三版由RFC 3411-RFC 3418定義，主要增加SNMP在安全性和遠端配置方面的強化。

SNMP第三版提供重要的安全性功能：

 信息完整性：保證封包在傳送中沒有被竄改。
 認證：檢驗信息來自正確的來源。
 封包加密：避免被未授權的來源窺探。

 开发和使用 

 第一版 
SNMP的第一个RFC系列出现在1988年：

 RFC 1065：基于TCP/IP网络的管理信息的结构和认定
 RFC 1066：以基于TCP/IP网络的网络管理为基础的管理信息
 RFC 1067：一个简单网络管理协议

這些協議被廢除經由：

 RFC 1155：基于TCP/IP网络的管理信息的结构和认定
 RFC 1156：以基于TCP/IP网络的网络管理为基础的管理信息
 RFC 1157：一个简单网络管理协议

SNMP协议工作在OSI模型的应用层（第七层）。它（在第一版中）指定了四种核心协议数据单元（PDU）：

 GET，用来得到一条管理信息
 GETNEXT，用来反复得到管理信息的序列
 SET，用来给一个被管理的子系统制造一个变化
 TRAP，用来报告一个关于被管理子系统的警告或其他异步事件

典型的，SNMP为代理使用UDP端口161，为管理站使用UDP端口162。

第一版因為其脆弱的安全性而備受爭議。客戶端的認證使用明碼傳送。在80年代，SNMP第一版被設計出來的時期，網際網路標準的認證/安全並不被主要的協議設計團體所重視。

 第二版 
SNMP第二版（RFC 1441–RFC 1452）修订了第一版并且包含了在性能、安全、机密性和管理者之间通信这些领域的改进。它引入了GETBULK以取代反覆的GETNEXT，藉以在单个请求中获取大量的管理数据。然而，SNMP第二版的新安全系統被認為過於複雜，而不被廣泛接受。

SNMP v2c（基於社群的SNMP第二版）定義於RFC 1901–RFC 1908，一開始也非正式的被稱為SNMP第1.5版。SNMPv2c包含SNMP第二版除了受爭議的新SNMP第二版安全模型以外的部份，並以SNMP第一版的簡單的基於社群的安全性方案取而代之。

SNMP v2u（基於使用者的SNMP第二版）定義於RFC 1909–RFC 1910。這是一個SNMP第一版和SNMP第二版的折衷方案，試圖提供比SNMP第一版更好的安全性，又不遭遇SNMP第二版的高複雜度。這產生一個被商業化的變種，稱為SNMP v2*，而且它的機制最後被SNMP第三版的兩個安全性框架之一採用。

 SNMP第一版和SNMPv2c的互操作性 
在目前的指定中，SNMP第二版和SNMP第一版在兩個關鍵領域不相容：訊息格式和協議操作。SNMPv2c訊息使用和SNMP第一版不同的標頭和協議數據單元（PDU）格式。SNMPv2c也使用兩個沒有在SNMP第一版指定的協議操作。此外，RFC 1908定義兩個可能的SNMP第一版/第二版共存策略：代理伺服器代理（proxy agents）和雙語網路管理系統（bilingual network-management systems）。

 第三版 
Internet工程工作小组（IETF）把在RFC3411-RFC3418（STD0062）中定义的SNMP第三版作为2004年的标准版本。IETF将先前的版本定为“Obsolete”或“Historical”。

实际上，SNMP实现通常支持多个版本：典型的SNMPv1、SNMPv2c以及SNMPv3。参见RFC3584“Internet标准网络管理框架第一、二、三版间的共存”。

SNMP第三版提供三項重要的服務：認證、隱私和存取控制。

 使用举例 

 SNMP v1 v2c 
 監控裝置正常運行時間 (sysUpTimeInstance)
 作業系統版本清單 (sysDescr)
 收集介面資訊 (ifName, ifDescr, ifSpeed, ifType, ifPhysAddr)
 測量網路介面吞吐量 (ifInOctets, ifOutOctets)
 查詢遠端ARP快取 (ipNetToMedia)

下面的输出作为在一个路由器上的snmpwalk的例子展示了设备的基本信息：

 snmpwalk -c public punch system

 SNMPv2-MIB::sysDescr.0 = STRING: Cisco Internetwork Operating System Software IOS (tm) C2600
 Software (C2600-IO3-M), Version 12.2(15)T5, RELEASE SOFTWARE (fc1)
 TAC Support: http://www.cisco.com/tac

 Compiled Thu 12-Jun-03 15:49 by eaarm
 SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.187
 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (835747999) 96 days, 17:31:19.99
 SNMPv2-MIB::sysContact.0 = STRING: wikiuser
 SNMPv2-MIB::sysName.0 = STRING: punch
 SNMPv2-MIB::sysLocation.0 = STRING: test
 SNMPv2-MIB::sysServices.0 = INTEGER: 78
 SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00

 SNMP v3 
由於 SNMP v3 加強了安全設計，存取上要提供較多資訊

 透過工具指令存取 
在 Shell 環境下安全取得一台主機所有 CPU Core 使用狀況的方法：
 -l authPriv 表示要認證也要傳輸加密
 -a 為認證密碼保護方式 -A 為認證密碼
 -x 為傳輸加密方式 -X 為傳輸密鑰
 1.3.6.1.2.1.25.3.3.1.2 表示要監視所有 CPU Core 使用狀況
snmpwalk -v 3 -l authPriv -u user \
   -a SHA -A userpass \
   -x AES -X userpass \
   10.33.1.1 \
   1.3.6.1.2.1.25.3.3.1.2

HOST-RESOURCES-MIB::hrProcessorLoad.196608 = INTEGER: 7
HOST-RESOURCES-MIB::hrProcessorLoad.196609 = INTEGER: 8

 透過 PHP 存取 
if (function_exists('snmp3_get')) {
	$result = snmp3_real_walk(
		'10.33.1.1',         // 要監視的主機
		'user',                  // 存取 SNMP 服務的帳號
		'authPriv',              // 安全等級 (要認證也要傳輸加密)
		'SHA',                   // 認證密碼的保護方式
		'userpass',              // 認證用密碼
		'AES',                   // 傳輸加密方式
		'userpass',              // 傳輸用密鑰
		'1.3.6.1.2.1.25.3.3.1.2' // 監看所有 CPU core 的負載狀況，編號為 CPU 負載狀況的 OID
	);
	print_r($result);
}

Array
(
    [HOST-RESOURCES-MIB::hrProcessorLoad.196608] => INTEGER: 7
    [HOST-RESOURCES-MIB::hrProcessorLoad.196609] => INTEGER: 11
)

 經常監視的數據 
處理器、記憶體、儲存設備、網路環境為最常被監視的項目，這些項目的細節資訊如下表：

 項目  存取方式  OID  MIB 處理器 使用者佔用時間比  GET  .1.3.6.1.4.1.2021.11.9.0  UCD-SNMP-MIB::ssCpuUser 系統佔用時間比  GET  .1.3.6.1.4.1.2021.11.10.0  UCD-SNMP-MIB::ssCpuSystem 閒置時間比  GET  .1.3.6.1.4.1.2021.11.11.0  UCD-SNMP-MIB::ssCpuIdle 每個 Core 的用量  WALK  .1.3.6.1.2.1.25.3.3.1.2  HOST-RESOURCES-MIB::hrProcessorLoad 記憶體 記憶體容量  GET  .1.3.6.1.4.1.2021.4.5.0  UCD-SNMP-MIB::memTotalReal 記憶體消耗量  GET  .1.3.6.1.4.1.2021.4.6.0  UCD-SNMP-MIB::memAvailReal 記憶體剩餘量  GET  .1.3.6.1.4.1.2021.4.11.0  UCD-SNMP-MIB::memTotalFree 虛擬記憶體容量  GET  .1.3.6.1.4.1.2021.4.3.0  UCD-SNMP-MIB::memTotalSwap 虛擬記憶體剩餘量  GET  .1.3.6.1.4.1.2021.4.4.0  UCD-SNMP-MIB::memAvailSwap 儲存設備 各磁碟容量  WALK  .1.3.6.1.4.1.2021.9.1.6.1  UCD-SNMP-MIB::dskTotal 各磁碟消耗量  WALK  .1.3.6.1.4.1.2021.9.1.7.1  UCD-SNMP-MIB::dskAvail 各磁碟消耗量百分比  WALK  .1.3.6.1.4.1.2021.9.1.9.1  UCD-SNMP-MIB::dskPercent 網路環境 網路設備名稱  WALK  .1.3.6.1.2.1.31.1.1.1.1  IF-MIB::ifName

 参见 

 AgentX
 SMUX

 外部链接 
 中文SNMP协议讨论组 
 Net-SNMP 
 Net-SNMP on sourceforge.net 
 SimpleWeb 
 RFC1157: A Simple Network Management Protocol (SNMP)
 CISCO SNMP 

 RFC3411: An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks
 RFC3584: Coexistence between Version 1, Version 2, and Version 3 of the Internet-standard Network Management Framework
 RFC3512: Configuring Networks and Devices with Simple Network Management Protocol (SNMP)
 OpenSNMP 
 SNMP FAQ part 1 
 SNMP FAQ part 2 
 Cisco SNMP repository and documentation 
 SNMP4J - Free Open Source SNMP for Java 
 Snml-SNMP：Simple Network Management Language (简单网络管理语言) 

Category:互联网标准
Category:网际协议
Category:应用层协议
Category:管理框架