Linux

Ubuntu Linux 以 SNMP 監控伺服器狀態教學與範例

本篇介紹如何在 Ubuntu Linux 系統上安裝 SNMP 伺服器,監控伺服器運作狀態。

簡單網路管理協定(SNMP,Simple Network Management Protocol)可以用於監控各類的網路設備或伺服器,典型的 SNMP 實作架構中,每一個被監控的設備上都會安裝並執行一個代理者(agent)程式,代理者程式負責收集被監控設備上的資訊,傳送至網路管理系統(NMS,Network-management system),系統管理者就可以在 NMS 上面監控所有設備的狀態。

SNMP 架構

SNMP 歷經長期的發展過程,有許多的版本,SNMP v1 與 v2c 是市面上最常見的版本,但這兩種版本都是採用社群(community)名稱來進行認證,亦不支援加密,安全性較差;新版的 SNMP v3 支援加密與使用者帳號密碼認證,安全性比較好。

安裝 SNMP 代理者(Agent)

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)

SNMP 網路管理系統(NMS)就是系統管理者用來監控其他設備的系統,若要將一台 Ubuntu Linux 系統作為 NMS,可以安裝 snmpsnmp-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

更新 MIB 檔案

安裝了 snmp-mibs-downloader 套件之後,應該會自動下載 MIB 檔案,放置於系統上的 /var/lib/snmp/mibs 目錄。若要手動下載 MIB 檔案,可以執行 download-mibs 指令:

# 下載 MIB 檔案
sudo download-mibs

設定 SNMP 代理者(Agent)

在受監控的 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

這裡的 rocommunityrocommunity6 分別對應 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

常用 OID 清單

由於 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)

CPU

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

若要透過 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"')]

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago