簡單網路管理協定（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 存取的變數以階層的方式結合。這些分層和其他元資料（例如變數的類型和描述）以管理資訊庫（MIBs）的方式描述。



SNMP 基本元件

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

1. 網路管理系統（NMSs，Network-management systems）
2. 被管理的裝置（managed device）
3. 代理者（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 規格的資料型態，它們被分為兩大類：

1. 簡單資料型態
2. 泛應用資料型態

SNMP 第二版和管理資訊結構

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

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

1. GET REQUEST
2. GET NEXT REQUEST
3. GET RESPONSE
4. SET REQUEST
5. TRAP

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

1. GETBULK REQUEST
2. INFORM

SNMP 第二版 SMI 資訊模組

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

SNMP 第三版

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

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


* 資訊完整性：保證封包在傳送中沒有被竄改。

* 認證：檢驗資訊來自正確的來源。

* 封包加密：避免被未授權的來源窺探。



開發和使用

第一版

SNMP 的第一個 RFC 系列出現在 1988 年：

1. RFC 1065：基於 TCP/IP 網路的管理資訊的結構和認定
2. RFC 1066：以基於 TCP/IP 網路的網路管理為基礎的管理資訊
3. RFC 1067：一個簡單網路管理協定

這些協定被廢除經由：

1. RFC 1155：基於 TCP/IP 網路的管理資訊的結構和認定
2. RFC 1156：以基於 TCP/IP 網路的網路管理為基礎的管理資訊
3. RFC 1157：一個簡單網路管理協定

SNMP 協定工作在 OSI 模型的應用層（第七層）。它（在第一版中）指定了四種核心協定資料單元（PDU）：

1. GET，用來得到一條管理資訊
2. GETNEXT，用來反覆得到管理資訊的序列
3. SET，用來給一個被管理的子系統製造一個變化
4. 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 的例子展示了裝置的基本資訊：

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 使用狀況

透過 PHP 存取

經常監視的數據

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



參見


* AgentX

* SMUX



外部連結


* 中文 SNMP 協定討論組 （頁面存檔備份，存於網際網路檔案館）

* Net-SNMP （頁面存檔備份，存於網際網路檔案館）

* Net-SNMP on sourceforge.net （頁面存檔備份，存於網際網路檔案館）

* SimpleWeb （頁面存檔備份，存於網際網路檔案館）

* RFC1157: A Simple Network Management Protocol (SNMP)

* CISCO SNMP （頁面存檔備份，存於網際網路檔案館）

* [1]

* 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 (簡單網路管理語言) （頁面存檔備份，存於網際網路檔案館）