本篇介紹如何在 Ubuntu Linux 系統上安裝 SNMP 伺服器,監控伺服器運作狀態。
簡單網路管理協定(SNMP,Simple Network Management Protocol)可以用於監控各類的網路設備或伺服器,典型的 SNMP 實作架構中,每一個被監控的設備上都會安裝並執行一個代理者(agent)程式,代理者程式負責收集被監控設備上的資訊,傳送至網路管理系統(NMS,Network-management system),系統管理者就可以在 NMS 上面監控所有設備的狀態。
SNMP 歷經長期的發展過程,有許多的版本,SNMP v1 與 v2c 是市面上最常見的版本,但這兩種版本都是採用社群(community)名稱來進行認證,亦不支援加密,安全性較差;新版的 SNMP v3 支援加密與使用者帳號密碼認證,安全性比較好。
SNMP 代理者(agent)要安裝在受監控的伺服器上,在 Ubuntu Linux 中若要安裝 SNMP 代理者(agent),可以透過 apt
安裝 snmpd
套件:
# 安裝 snmpd 套件
sudo apt install snmpd
snmpd
是 Linux 中的一個 SNMP 伺服器,對應到 SNMP 架構上就是一個 SNMP 代理者(agent),負責收集伺服器上的各種資訊。
安裝好之後,snmpd
服務會自動啟用,我們可以用 systemctl
檢查 snmpd
服務的狀態:
# 檢查 snmpd 服務狀態
systemctl status snmpd
● snmpd.service - Simple Network Management Protocol (SNMP) Daemon. Loaded: loaded (/lib/systemd/system/snmpd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-05-13 16:00:12 CST; 2s ago Process: 30363 ExecStartPre=/bin/mkdir -p /var/run/agentx (code=exited, status=0/SUCCESS) Main PID: 30371 (snmpd) Tasks: 1 (limit: 19106) Memory: 6.1M CGroup: /system.slice/snmpd.service └─30371 /usr/sbin/snmpd -LOw -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f -p /run/snmpd.pid May 13 16:00:12 imgqc systemd[1]: Starting Simple Network Management Protocol (SNMP) Daemon.... May 13 16:00:12 imgqc systemd[1]: Started Simple Network Management Protocol (SNMP) Daemon..
SNMP 網路管理系統(NMS)就是系統管理者用來監控其他設備的系統,若要將一台 Ubuntu Linux 系統作為 NMS,可以安裝 snmp
與 snmp-mibs-downloader
套件:
# 安裝 snmp 與 snmp-mibs-downloader 套件
sudo apt install snmp snmp-mibs-downloader
snmp
套件就是一個 SNMP 的用戶端(client)程式,而 snmp-mibs-downloader
套件則是用來下載與管理 MIB(Management Information Base)檔案的工具,在剛開始安裝與設定 SNMP 架構時,我們可以將這兩個套件一起安裝在受監控的伺服器上,在同一台伺服器上測試 SNMP 會比較方便。
假設我們將 SNMP agent 與 NMS 都裝在同一台 Ubuntu Linux 伺服器上,接著就可以用 snmp
套件中的 snmpwalk
指令測試查詢 SNMP 中的資訊:
# 查詢系統基本資訊 snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "Linux imgqc 5.4.0-110-generic #124-Ubuntu SMP Thu Apr 14 19:46:19 UTC 2022 x86_64"
在這一行指令中,我們以 -v
參數指定採用 2c
版本的 SNMP 協定,以 -c
參數指定社群(community)名稱為 public
,後面的 localhost
是指定 SNMP 代理者(agent)的位址,如果我們的 agent 與 NMS 裝在不同的機器上,這裡就要替換為 agent 的 IP 位址。
最後的一串數字則為查詢項目的 OID,這裡指定的 1.3.6.1.2.1.1.1
內容為 Linux 系統的基本資訊。
在上面的 snmpwalk
指令輸出中,項目是以 OID 的原始編號來標示,我們可以修改 /etc/snmp/snmp.conf
設定,將 mibs :
這一行改為註解,這樣可以讓 SNMP 查詢的結果更容易辨識:
# 將 mibs : 這一行改為註解
# mibs :
設定完成後,重新執行一次 snmpwalk
指令:
# 查詢系統基本資訊 snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux imgqc 5.4.0-110-generic #124-Ubuntu SMP Thu Apr 14 19:46:19 UTC 2022 x86_64
這樣一來每一個項目在輸出時都會透過 MIB 轉為比較有意義的名稱,在閱讀上會比較方便。
除此之外,我們也可以直接以 OID 的對應名稱來查詢:
# 查詢系統基本資訊 snmpwalk -v 2c -c public localhost SNMPv2-MIB::sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux imgqc 5.4.0-110-generic #124-Ubuntu SMP Thu Apr 14 19:46:19 UTC 2022 x86_64
安裝了 snmp-mibs-downloader
套件之後,應該會自動下載 MIB 檔案,放置於系統上的 /var/lib/snmp/mibs
目錄。若要手動下載 MIB 檔案,可以執行 download-mibs
指令:
# 下載 MIB 檔案
sudo download-mibs
在受監控的 Ubuntu Linux 安裝好 snmpd
這個 SNMP 代理者之後,預設只會開放非常基本的資訊,且僅允許本機進行查詢,若要發揮 SNMP 的系統監控功能,需要再調整一些設定。
snmpd
的設定檔位於 /etc/snmp/snmpd.conf
,以下是一些常用的設定。
agentaddress
傾聽介面與埠號agentaddress
參數可以設定 SNMP agent 傾聽的網路介面與埠號,在預設的設定檔中僅設定傾聽本機的 SNMP 連線,若需要在遠端的機器上連線近來取得 SNMP 的資訊,就必須更改這裡的設定,以下是常用的設定方式:
# 傾聽本機的 161 連接埠 agentaddress 127.0.0.1,[::1] # 傾聽 127.0.0.1 與 192.168.211.158 的 161 連接埠 agentaddress 127.0.0.1,192.168.211.158 # 傾聽 192.168.211.158 的 8161 連接埠 agentaddress 192.168.211.158:8161
如果直接將 agentaddress
參數註解掉,預設會傾聽所有網路介面的 161
連接埠。
view
開放的 OID 清單view
參數可以自行定義 view,一個 view 中包含了要開放的 OID 清單,預設的 systemonly
只有包含很簡單的兩組 OID:
# 預設的 systemonly view
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
這裡指定的 OID 碼是代表納入這個分支以下的所有項目。
由於預設的 systemonly
資訊太少了,我們需要根據自己的需求增加 view:
# 自訂的 myview view
view myview included .1.3.6.1.2.1.1
view myview included .1.3.6.1.2.1.25
view myview included .1.3.6.1.4.1.2021
這裡我們自訂了一個新的 view,其中包含了 .1.3.6.1.2.1.1
、.1.3.6.1.2.1.25
與 .1.3.6.1.4.1.2021
三項 OID,要開放哪一些 OID 可依據自己的監控需求來調整。
rocommunity
唯讀的社群(Community)在 SNMP v1 與 v2c 版本中的社群(community)就有點像是帳號與密碼的作用,只有知道社群名稱的使用者才能存取其中的資訊。rocommunity
可用來設定唯讀的社群,預設會開放 public
這個社群讀取 systemonly
這個 view 中的 OID:
# 預設開放 public 社群讀取 systemonly 這個 view
rocommunity public default -V systemonly
rocommunity6 public default -V systemonly
這裡的 rocommunity
與 rocommunity6
分別對應 IPv4 與 IPv6 的設定。
我們要再加上一個自訂的社群,讓我們可以讀取自己建立的 myview
,由於社群的作用就像是帳號與密碼,所以建議取一個不好猜的社群名稱:
# 預設開放 my_Qs93@sdc2 社群讀取 myview 這個 view
rocommunity my_Qs93@sdc2 default -V myview
rocommunity6 my_Qs93@sdc2 default -V myview
如果需要透過 SNMP 監控磁碟用量,需要設定磁碟監控的條件,disk
參數可以設定要監控的磁碟掛載路徑,以及剩餘空間的門檻值,門檻值可以用實際大小或百分比來設定:
# 監控掛載在根目錄的磁碟,剩餘空間門檻為 100000 kB disk / 100000 # 監控掛載在 /data 目錄的磁碟,剩餘空間門檻為 10% disk /data 10%
如果磁碟剩餘的空間低於指定的門檻值,.1.3.6.1.4.1.2021.9.1.100
的值就會被設為 1
。
若要監控系統上所有的磁碟用量,可以使用 includeAllDisks
並設定磁碟剩餘量的百分比門檻值:
# 監控所有磁碟,剩餘空間門檻為 10% includeAllDisks 10%
snmpd
新設定將 /etc/snmp/snmpd.conf
中的所有設定修改完成後,要重新啟動 snmpd
伺服器,讓設定生效:
# 重新啟動 snmpd 伺服器
sudo systemctl restart snmpd
接著測試查詢 my_Qs93@sdc2
這個社群中的 .1.3.6.1.4.1.2021.4.5.0
資訊:
# 測試查詢 my_Qs93@sdc2 社群中的資訊 snmpwalk -v 2c -c my_Qs93@sdc2 localhost .1.3.6.1.4.1.2021.4.5.0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 16393896 kB
由於 SNMP 的 OID 非常豐富,也相當繁雜,初次設定時很容易不知道該抓哪一些資訊,以下是比較常用的 OID 清單:
OID | 說明 |
---|---|
.1.3.6.1.2.1.1.1.0 |
系統基本資訊 |
.1.3.6.1.4.1.2021.10.1.3.1 |
系統 1 分鐘平均負載(load) |
.1.3.6.1.4.1.2021.10.1.3.2 |
系統 5 分鐘平均負載(load) |
.1.3.6.1.4.1.2021.10.1.3.3 |
系統 15 分鐘平均負載(load) |
.1.3.6.1.2.1.1.3.0 |
系統持續運行時間(uptime) |
OID | 說明 |
---|---|
.1.3.6.1.4.1.2021.11.9.0 |
使用者 CPU 用量(百分比) |
.1.3.6.1.4.1.2021.11.10.0 |
系統 CPU 用量(百分比) |
.1.3.6.1.4.1.2021.11.11.0 |
閒置 CPU 量(百分比) |
.1.3.6.1.4.1.2021.11.50.0 |
使用者 CPU 用量(時間) |
.1.3.6.1.4.1.2021.11.52.0 |
系統 CPU 用量(時間) |
OID | 說明 |
---|---|
.1.3.6.1.4.1.2021.4.5.0 |
實體記憶體大小 |
.1.3.6.1.4.1.2021.4.6.0 |
實體記憶體用量 |
.1.3.6.1.4.1.2021.4.11.0 |
實體記憶體剩餘量 |
.1.3.6.1.4.1.2021.4.3.0 |
交換空間(swap)大小 |
.1.3.6.1.4.1.2021.4.4.0 |
交換空間(swap)剩餘量 |
OID | 說明 |
---|---|
.1.3.6.1.4.1.2021.9.1.2 |
磁碟掛載路徑 |
.1.3.6.1.4.1.2021.9.1.3 |
磁碟設備路徑 |
.1.3.6.1.4.1.2021.9.1.6 |
磁碟大小 |
.1.3.6.1.4.1.2021.9.1.7 |
磁碟剩餘空間 |
.1.3.6.1.4.1.2021.9.1.8 |
磁碟使用量 |
.1.3.6.1.4.1.2021.9.1.9 |
磁碟使用量百分比 |
.1.3.6.1.4.1.2021.9.1.10 |
磁碟 inode 使用量 |
.1.3.6.1.4.1.2021.9.1.100 |
磁碟剩餘空間是否不足 |
更多常用的 OID 可以參考系統監控常用到的 SNMP OID。
若要透過 Python 來取得 SNMP 的資訊,最簡單的方式是使用 netsnmp
模組,使用前先安裝:
# 安裝必要套件 sudo apt-get install libsnmp-dev libczmq-dev # 安裝 Python 的 netsnmp 套件 pip3 install netsnmp-py
以下是簡單的操作範例。首先是透過 SNMP GET 取得資訊:
import netsnmp with netsnmp.SNMPSession('localhost', 'my_Qs93@sdc2') as ss: # 使用 SNMP GET result = ss.get(['.1.3.6.1.2.1.1.1.0', '.1.3.6.1.2.1.1.3.0']) print(result)
[('.1.3.6.1.2.1.1.1.0', 'STRING', '"Linux imgqc 5.4.0-110-generic #124-Ubuntu SMP Thu Apr 14 19:46:19 UTC 2022 x86_64"'), ('.1.3.6.1.2.1.1.3.0', 'Timeticks', '0:0:54:45.98')]
透過 SNMP GETNEXT 取得資訊:
with netsnmp.SNMPSession('localhost', 'my_Qs93@sdc2') as ss: # 使用 SNMP GETNEXT result = ss.getnext(['.1.3.6.1.2.1.1.1', '.1.3.6.1.2.1.1.2.0']) print(result)
[('.1.3.6.1.2.1.1.1.0', 'STRING', '"Linux imgqc 5.4.0-110-generic #124-Ubuntu SMP Thu Apr 14 19:46:19 UTC 2022 x86_64"'), ('.1.3.6.1.2.1.1.3.0', 'Timeticks', '0:0:54:45.98')]
使用 SNMP Walk 的方式取得資訊:
with netsnmp.SNMPSession('localhost', 'my_Qs93@sdc2') as ss: # 使用 SNMP Walk result = [response for response in ss.walk(['.1.3.6.1.4.1.2021.10.1.3'])] print(result)
[('.1.3.6.1.4.1.2021.10.1.3.1', 'STRING', '"0.05"'), ('.1.3.6.1.4.1.2021.10.1.3.2', 'STRING', '"0.05"'), ('.1.3.6.1.4.1.2021.10.1.3.3', 'STRING', '"0.04"')]