SNMP(Simple Network Management Protocol)讓監控系統以一致的方式讀取設備狀態、接收事件通知,也能在授權範圍內修改部分設定。理解它的關鍵是:Manager 向 Agent 查詢 OID,MIB 定義這些 OID 的意義。
1. 用來解決什麼問題?
企業網路可能包含不同廠牌的交換器、路由器、防火牆、伺服器、印表機與 UPS。SNMP 提供共同的管理介面,讓集中監控系統取得設備資訊;實際可讀取哪些指標,仍取決於設備的 Agent 與 MIB 支援。
常見用途包括介面流量、連線狀態、錯誤封包數,以及設備提供的 CPU、記憶體、溫度或耗材資訊。它是管理協定,本身不負責保存歷史資料、畫圖或執行告警規則;這些工作由監控平台完成。SNMP 架構:RFC 3411
2. 架構與重要名詞
| 名詞 | 說明 |
|---|---|
| Manager / NMS | Network Management System,發送查詢並處理監控結果的管理端 |
| Agent | 運行於被管理設備上的服務,提供管理物件的值並處理請求 |
| Managed Object | 可被管理的資訊,例如設備名稱或介面累積位元組數 |
| OID | Object Identifier,物件在樹狀命名空間中的唯一識別碼 |
| MIB | Management Information Base,管理資訊的邏輯集合;MIB module 定義物件名稱、型別、存取權限與意義 |
| SMI | Structure of Management Information,定義 MIB 的描述規則 |
| VarBind | 一組 OID 與值;一個訊息可以攜帶多組 |
MIB 可類比為「欄位規格書」,OID 是「欄位地址」,Agent 回傳的是「當下的欄位值」。下載 MIB 檔案能幫工具解讀名稱與型別,但不會讓設備突然支援新的物件。SMIv2:RFC 2578
flowchart LR
N[Manager/監控平台] -->|GET/GETNEXT/GETBULK/SET| A[設備上的 Agent]
A -->|Response| N
A -->|Trap/Inform| N
M[MIB module:物件規格] -.-> N
3. OID 怎麼讀?
OID 是由數字組成的階層式路徑,例如 1.3.6.1.2.1.1.5.0 對應 SNMPv2-MIB::sysName.0。
1.3.6.1.2.1:常見標準管理物件所在的mib-2子樹。1.3.6.1.4.1:enterprises,廠商私有物件所在的子樹。- 純量物件(scalar)的實例通常以
.0結尾。 - 表格物件的實例以索引結尾;索引可能是一個介面編號,也可能由多個欄位組成。
例如介面欄位 ifDescr 的某筆資料可能是 ifDescr.2;這裡的 2 是 ifIndex,不能直接假設它等於機殼上的第 2 個實體連接埠。SMIv2 定義、IF-MIB:RFC 2863
常見物件
| 物件 | 數字 OID(欄位或實例) | 用途 |
|---|---|---|
sysDescr.0 | 1.3.6.1.2.1.1.1.0 | 系統描述 |
sysObjectID.0 | 1.3.6.1.2.1.1.2.0 | 廠商定義的管理系統識別 |
sysUpTime.0 | 1.3.6.1.2.1.1.3.0 | 網路管理部分自上次重新初始化起經過的時間 |
sysName.0 | 1.3.6.1.2.1.1.5.0 | 管理上指定的設備名稱 |
ifDescr | 1.3.6.1.2.1.2.2.1.2 | 介面描述,查單筆需加索引 |
ifOperStatus | 1.3.6.1.2.1.2.2.1.8 | 介面運作狀態,查單筆需加索引 |
ifHCInOctets | 1.3.6.1.2.1.31.1.1.1.6 | 64-bit 累積接收位元組數 |
ifHCOutOctets | 1.3.6.1.2.1.31.1.1.1.10 | 64-bit 累積傳送位元組數 |
sysUpTime 的單位是百分之一秒,且不一定等於作業系統開機時間;例如 Agent 重新初始化也可能使它重新計時。系統物件:RFC 3418、介面物件:RFC 2863
4. 操作與資料交換
| 操作 | 功能 | 使用情境 |
|---|---|---|
| GET | 讀取指定物件實例 | 查設備名稱、特定介面計數器 |
| GETNEXT | 取得 OID 字典序中的下一個可存取物件 | 逐步遍歷子樹或表格 |
| GETBULK | 批次取得後續物件,v2c/v3 可用 | 減少大量查詢的來回次數 |
| SET | 寫入可寫物件 | 修改設備允許透過 SNMP 設定的欄位 |
| Response | 回覆請求結果或錯誤 | GET、SET 或 Inform 的回覆 |
| Trap | 主動送出事件通知,不要求確認回覆 | 介面狀態變化等事件 |
| Inform | 要求接收端回覆確認的通知 | 需要確認通知有被收到的情境 |
snmpwalk 是工具的遍歷行為,通常反覆使用 GETNEXT;snmpbulkwalk 則使用 GETBULK。它們不是名為 WALK 的協定操作。SET 也不能任意修改所有設定,必須同時符合物件可寫性與存取權限。操作定義:RFC 3416
Polling 與通知怎麼搭配?
| 方式 | 優點 | 限制 |
|---|---|---|
| Polling(定期查詢) | 產生連續數值與趨勢 | 兩次查詢之間可能漏掉短暫變化 |
| Trap | 可在事件發生時快速送出 | 沒有確認回覆,封包遺失可能無法察覺 |
| Inform | 有確認機制,可依實作重試 | 增加狀態保存與傳輸成本,仍不保證最終送達 |
實務上可用 Polling 收集指標,用 Trap/Inform 補充事件;不要因為沒有收到 Trap,就認定設備正常。Cisco:SNMP 通知與輪詢、Cisco:Inform 確認機制
通訊埠
常見部署使用 UDP:Agent 在 161 接收查詢,通知接收端通常在 162 接收 Trap/Inform。Manager 的查詢來源埠通常是臨時埠,Response 回到原來源埠。UDP 不提供可靠傳輸,查詢端須處理逾時與重試。傳輸映射:RFC 3417
5. SNMPv1、v2c、v3 的差異
| 項目 | SNMPv1 | SNMPv2c | SNMPv3(常見 USM 模型) |
|---|---|---|---|
| 存取/安全機制 | Community string | Community string | 使用者與可設定的驗證、加密 |
| 訊息加密 | 無 | 無 | 可啟用 |
| GETBULK | 不支援 | 支援 | 支援 |
| Counter64 | 不支援 | 支援 | 支援 |
| Inform | 不支援 | 支援 | 支援 |
v2c 改善資料操作,但沒有解決 Community string 明文傳送的問題。v3 在既有管理操作外加入安全框架;實際安全性取決於設定,使用 v3 不代表一定加密。RFC 3416、USM:RFC 3414、Cisco:SNMP 安全設定
SNMPv3 安全層級
| 層級 | 訊息驗證與完整性保護 | 內容加密 |
|---|---|---|
noAuthNoPriv | 無 | 無 |
authNoPriv | 有 | 無 |
authPriv | 有 | 有 |
USM(User-based Security Model)負責使用者安全機制;存取控制可透過 VACM(View-based Access Control Model)限定可讀、可寫及可通知的物件範圍。Engine ID 用來識別 SNMP engine,並參與 USM 金鑰處理;複製設定或更換設備後須留意它與使用者金鑰的關係。RFC 3414、SNMP 框架:RFC 3411
新部署優先採用 authPriv,在設備與工具共同支援下選擇 SHA-2 驗證及 AES 加密;演算法名稱與支援範圍應查實際產品文件。避免直接沿用舊教學的 MD5/DES 組合。SHA-2:RFC 7860、AES:RFC 3826
6. 如何把計數器變成流量?
ifHCInOctets 是累積值,不是即時速率。以下是以兩次量測計算平均接收速率的範例:
接收速率(bit/s)=(第二次計數值 − 第一次計數值)× 8 ÷ 間隔秒數
第一次:1,000,000,000 bytes
60 秒後:1,750,000,000 bytes
速率 = 750,000,000 × 8 ÷ 60
= 100,000,000 bit/s = 100 Mbps
若介面容量為 1 Gbps,這段時間的接收方向平均使用率是 10%。全雙工介面應分別看收、送方向,不宜直接相加後視為單一方向使用率。
判讀時注意計數器回繞、設備重啟與計數器重設;高速介面宜使用 64-bit 計數器,並檢查 ifCounterDiscontinuityTime。介面索引也可能隨設備變動,應搭配名稱與描述確認對應關係。IF-MIB:RFC 2863
7. Net-SNMP 指令入門
以下是操作範例,未對任何設備執行。192.0.2.10 是示例位址,使用前要替換成自己的設備;需先安裝 Net-SNMP 工具並設定設備端存取權限。
v2c:理解 GET 與 WALK
# 讀取設備名稱;將示例 Community 替換成設備設定
snmpget -v2c -c 'EXAMPLE_READ_ONLY_COMMUNITY' 192.0.2.10 1.3.6.1.2.1.1.5.0
# 遍歷 system 子樹
snmpwalk -v2c -c 'EXAMPLE_READ_ONLY_COMMUNITY' 192.0.2.10 1.3.6.1.2.1.1
v2c 範例適合理解語法或受控舊設備環境;新部署優先使用 v3。Net-SNMP:snmpget 教學
v3:驗證與加密
# 假設雙方皆支援 SHA-256 與 AES,且使用者已在設備建立
snmpget -v3 -l authPriv -u monitor_user \
-a SHA-256 -A 'EXAMPLE_AUTH_PASSPHRASE' \
-x AES -X 'EXAMPLE_PRIV_PASSPHRASE' \
192.0.2.10 1.3.6.1.2.1.1.5.0
| 參數 | 意義 |
|---|---|
-v | 協定版本 |
-c | v1/v2c Community string |
-l | v3 安全層級 |
-u | v3 使用者名稱 |
-a、-A | 驗證演算法、驗證密語 |
-x、-X | 加密演算法、加密密語 |
演算法是否可用取決於 Net-SNMP 的版本、編譯選項與設備支援。正式使用時避免把真實密語直接留在命令歷史或程序參數中,可改用權限受限的工具設定檔。數字 OID 可避免名稱解析依賴;使用符號名稱時則需載入對應 MIB。Net-SNMP:指令參數文件
8. 部署與排錯重點
以下為依上述協定特性整理的實務檢查順序:
- 確認設備支援:Agent 是否啟用、支援哪些版本與 MIB。
- 確認存取權限:優先唯讀;設定必要的 OID view 與管理來源限制。
- 確認網路路徑:檢查管理網路、ACL、防火牆及回程路由;Polling 和通知的方向不同。
- 先查單一物件:用
sysName.0驗證,再遍歷必要子樹。 - 確認指標語意:單位、型別、索引、計數器重設與缺值處理。
- 調整收集負載:依需求設定間隔與 GETBULK 大小,避免頻繁走訪整個 OID 樹。
- 驗證通知:接收端能辨識 OID、保留事件,並實際測試通知是否送達。
| 現象 | 優先檢查 |
|---|---|
| Timeout | Agent、位址、ACL、網路、版本與憑證;設備可能直接丟棄未授權請求 |
noSuchObject/noSuchInstance | 物件支援、view 權限、純量 .0 與表格索引 |
Unknown Object Identifier | 本機 MIB 載入與名稱拼法;先用數字 OID 隔離問題 |
| 查詢成功但沒有 Trap | 設備通知目的地、事件啟用設定、接收端 UDP 162 與通知憑證 |
| 流量突然出現尖峰 | 計數器重設/回繞、時間間隔、單位或介面對應 |
| v3 驗證失敗 | 使用者、密語、演算法、安全層級、Engine ID 與 context |
管理介面應限制在受控網路,避免暴露於公開網際網路;舊設備使用 v2c 時,尤其需要來源限制與隔離。Cisco:SNMP 安全實務
9. 常見誤解與記憶重點
- MIB 不是歷史監控資料庫:它描述管理資訊;歷史值由監控平台保存。
- OID 不是 IP 位址:OID 指定物件,IP 指定設備所在的網路位置。
- v3 不一定加密:需選擇
authPriv並正確設定。 - Trap 不取代 Polling:事件通知與週期性指標收集互相補充。
- 累積 bytes 不等於 bytes/s:需取差值,再除以量測間隔。
- SNMP 也能寫入:SET 的效果取決於物件定義、Agent 實作與授權。
建議學習順序:Manager/Agent → MIB/OID → GET 與 WALK → Polling/Trap/Inform → v3 安全 → 計數器與監控判讀。
整理日期:2026-10-01。標準與實作來源已附於各節;指令為示例,未進行設備連線驗證。