SNMP 監控是網路管理的重要環節,搭配開源工具 LibreNMS 更能提升效率。本文從 SNMP 基礎知識出發,逐步引導讀者下載 MIB 資源,使用 snmpget 查詢裝置資訊,並探討 SNMPv2 的安全風險及升級 SNMPv3 的必要性。接著,文章詳細介紹 LibreNMS 的佈署步驟,包含 OVA 檔案下載、虛擬機器匯入與網路設定。同時,文章也提供 Linux 環境下網路監控的實務操作,說明如何組態 SNMPv2 和 SNMPv3 裝置,並在 LibreNMS 中設定警示規則、管理裝置群組以及監控服務。最後,文章探討 NetFlow 資料收集與分析,涵蓋 NetFlow 的版本、相關協定、收集方法及實施概念,協助讀者全方位掌握網路監控技術。

網路監控:SNMP 與 LibreNMS 實作

網路監控是確保網路穩定執行的關鍵環節,而 SNMP(簡單網路管理通訊協定)是實作網路監控的核心技術之一。本文將探討 SNMP 的原理、常見問題及 LibreNMS 這個流行的開源網路管理系統(NMS)的佈署與應用。

SNMP 基礎與 MIB 資源下載

SNMP 允許管理站透過查詢或設定網路裝置的 MIB(管理資訊函式庫)變數來監控和控制網路裝置。首先,我們需要下載所需的 MIB 資源。以 Cisco MIB 為例,相關組態定義在 /etc/snmp-mibs-downloader/cisco.conf 檔案中:

HOST=ftp://ftp.cisco.com
ARCHIVE=v2.tar.gz
ARCHTYPE=tgz
ARCHDIR=auto/mibs/v2
DIR=pub/mibs/v2/
CONF=ciscolist
DEST=cisco

個別 MIB 定義則位於 /etc/snmp-mibs-downloader/ciscolist 檔案中,總計超過 1,431 個檔案。更新 snmp-mibs-downloader.conf 後,執行 sudo download-mibs 指令即可下載所有 MIB 檔案。

程式碼解析:下載 MIB 檔案

# 更新 snmp-mibs-downloader 組態檔案
sudo nano /etc/snmp-mibs-downloader/snmp-mibs-downloader.conf

# 下載 MIB 檔案
sudo download-mibs

內容解密:

  1. sudo nano /etc/snmp-mibs-downloader/snmp-mibs-downloader.conf:使用 nano 編輯器開啟 snmp-mibs-downloader 的組態檔案,以確保組態正確。
  2. sudo download-mibs:執行下載 MIB 檔案的指令。該指令根據組態檔案中的設定,下載所有指定的 MIB 檔案。

使用 SNMP 查詢網路裝置

下載完 MIB 檔案後,我們可以使用 snmpget 指令查詢網路裝置的資訊。例如,查詢一個實驗室交換器的 sysDescr(系統描述)欄位:

snmpget -Os -c <snmp_string> -v2c 192.168.122.5 SNMPv2-MIB::sysDescr.0

輸出結果可能如下:

sysDescr.0 = STRING: SG300-28 28-Port Gigabit Managed Switch

程式碼解析:SNMP 查詢指令

snmpget -Os -c <snmp_string> -v2c 192.168.122.5 SNMPv2-MIB::sysDescr.0

內容解密:

  1. -Os:以可讀格式輸出 OID 及值。
  2. -c <snmp_string>:指定 SNMP community 字串。
  3. -v2c:指定使用 SNMPv2c 版本。
  4. SNMPv2-MIB::sysDescr.0:查詢 sysDescr OID 的值,用於取得裝置的系統描述。

SNMP 的安全問題與改進

SNMPv2 的明文傳輸特性使其存在安全風險。許多組織尚未升級到更安全的 SNMPv3。此外,一些組織仍使用預設的 community 字串(如 “public” 和 “private”),這可能導致未授權的存取甚至裝置組態洩露。

安全建議:

  1. 升級到 SNMPv3:使用更安全的驗證和加密機制。
  2. 限制 SNMP 存取:僅允許受信任的伺服器存取 SNMP。
  3. 僅查詢必要的介面和統計資訊:避免對裝置造成不必要的負擔。

LibreNMS 網路管理系統佈署

LibreNMS 是一款功能豐富且易於佈署的開源 NMS。它支援自動發現網路裝置,並提供圖形化的監控介面。

佈署步驟:

  1. 下載 LibreNMS OVA 檔案:使用預先組態好的虛擬機器映像檔進行佈署。
  2. 匯入虛擬機器:將 OVA 檔案匯入 VMware 或 Hyper-V 環境中。
  3. 組態網路:確保虛擬機器可以存取需要監控的網路裝置。

程式碼解析:組態靜態 IP 位址

# 檢視當前 IP 位址
ip address

# 編輯網路組態檔案(以 Ubuntu 為例)
sudo nano /etc/netplan/01-netcfg.yaml

# 更新組態內容
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

# 套用組態變更
sudo netplan apply

內容解密:

  1. ip address:檢視當前網路介面的 IP 組態。
  2. /etc/netplan/01-netcfg.yaml:Ubuntu 網路組態檔案,用於設定靜態 IP 位址。
  3. network: version: 2:指定 Netplan 組態檔案的版本。
  4. addresses:設定靜態 IP 位址及子網路遮罩。
  5. gateway4:設定預設閘道器。
  6. nameservers:設定 DNS 伺服器位址。

使用 Linux 進行網路監控

在完成 LibreNMS 的基本設定後,我們現在可以開始新增裝置進行監控。首先,我們需要了解如何組態基本的安全設定,以確保我們的監控系統是安全的。

組態 SNMPv2 裝置

要新增基本裝置,我們需要在裝置上啟用 SNMP(版本 2),並新增一個共同體字串(community string),以及一個存取控制列表(ACL)來限制存取。以下是在典型 Cisco 交換機上的組態範例:

ip access-list standard ACL-SNMP
 permit 192.168.122.174
 deny any log
snmp-server community ROSNMP RO ACL-SNMP

內容解密:

  1. ip access-list standard ACL-SNMP:建立一個名為 ACL-SNMP 的標準存取控制列表。
  2. permit 192.168.122.174:允許來自 IP 地址 192.168.122.174 的存取。
  3. deny any log:拒絕所有其他 IP 地址的存取,並記錄日誌。
  4. snmp-server community ROSNMP RO ACL-SNMP:設定 SNMP 共同體字串為 ROSNMP,只讀(RO),並應用 ACL-SNMP。

接下來,在 LibreNMS 中,從主儀錶板選擇 Devices > Add Device,填寫裝置的 IP 地址和共同體字串。

使用 SNMPv3 提升安全性

SNMPv3 提供了更好的安全性,包括認證和加密。以下是在 Cisco IOS 裝置上的組態範例:

ip access-list standard ACL-SNMP
 permit 192.168.122.174
 deny any log
snmp-server view ViewDefault iso included
snmp-server group GrpMonitoring v3 priv read ViewDefault access ACL-SNMP
snmp-server user snmpadmin GrpMonitoring v3 auth sha AuthPass1 priv aes 128 somepassword

內容解密:

  1. snmp-server view ViewDefault iso included:定義一個檢視 ViewDefault,包含 iso。
  2. snmp-server group GrpMonitoring v3 priv read ViewDefault access ACL-SNMP:建立一個名為 GrpMonitoring 的組,支援 SNMPv3,具有私有(priv)許可權,並應用 ACL-SNMP。
  3. snmp-server user snmpadmin GrpMonitoring v3 auth sha AuthPass1 priv aes 128 somepassword:新增使用者 snmpadmin 到 GrpMonitoring 組,使用 SHA 認證和 AES 加密。

在 NMS 端,只需比對裝置組態中的密碼和引數即可。

新增警示

除了監控裝置外,我們還可以設定警示來通知我們有關裝置或服務的狀態變化。例如,我們可以新增一個警示,當任何介面的利用率超過 80% 時觸發。

  1. 導航到 Alerts > Alert Rules,然後點選 Create rule from collection
  2. 在搜尋欄中輸入 utili,然後選擇相關規則。
  3. 組態警示規則的選項。

圖示說明

此圖示顯示了在 LibreNMS 中新增警示的流程:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title SNMP 與 LibreNMS 網路監控實戰

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖示內容解密:

  1. 首先導航到警示規則頁面。
  2. 然後點選建立規則按鈕。
  3. 在搜尋欄中輸入關鍵字來查詢相關規則。
  4. 最後,根據需要組態警示規則的選項。

使用 Linux 進行網路監控

設定警示規則

在 LibreNMS 中設定警示規則時,首先應重新命名規則,以避免與預設規則集中的規則名稱重複。通常,自訂規則會以底線(_)開頭,這樣在排序時會顯示在最前面。由於我們正在複製集合中的內容,因此也可以輕易地更改觸發警示的百分比。

比對裝置與群組

在「Match devices, groups and locations list」部分,情況變得複雜。目前,比對清單中沒有任何內容,且「All devices except in the list」設定為 OFF,因此此規則不會比對任何裝置。讓我們選擇我們的裝置:

此圖示顯示瞭如何在 LibreNMS 中比對裝置和群組於警示規則中。

現在,儲存規則。沒錯,就是這麼簡單!

您是否注意到前面的選單中有「Groups」的選項?使用裝置群組是將一個規則分配給所有類別似裝置的好方法。例如,您可能為路由器或交換器連線埠設定不同的連線埠閾值。原因是增加路由器的 WAN 連結速度可能需要數週,而更改交換器連線埠可能只需將電纜從 1G 連線埠移動到 10G 連線埠。因此,在這種情況下,為所有路由器設定一個規則(例如 60%),並為所有交換器設定不同的規則(設定為更高的數字)是合理的。

探索與啟用規則

探索這些規則,您會發現許多值得啟用的規則 - 裝置或服務關閉、CPU、記憶體或介面利用率,以及溫度或風扇警示。有些警示依賴 syslog - 是的,LibreNMS 有一個內建的 syslog 伺服器。您可以在「Overview > Syslog」中瀏覽:

此圖示顯示了 LibreNMS 中的 Syslog 顯示。

請注意,這裡有一些簡單的搜尋功能,但相對簡單。使用這個 syslog 伺服器是一個好主意,以便警示可以監控它 - 這將比我們在本章前面設定的警示簡單得多。但是,您仍然需要保留我們設定的文字日誌,以實作更好的搜尋和更長期的儲存。

新增裝置時的注意事項

新增裝置和群組時,請務必命名它們,尤其是裝置,以便它們能夠邏輯地排序。命名慣例通常會使用裝置型別(例如 FW、SW 或 RT)、位置名稱的標準(例如分支編號)或城市名稱的縮寫(例如 CHI、TOR 和 NYC,分別代表芝加哥、多倫多和紐約市)。重要的是要有一致性,規劃事物如何排序,並保持名稱中的各個術語簡短 - 請記住,您將輸入這些內容,它們最終也會出現在試算表欄中。

監控服務

請記住,監控主機上的服務是關鍵。常見的做法是使用 NMS 中的類別似 nmap 的功能來監控資料庫存取、API、Web 和 VPN 服務的連線埠。更先進的監控器會輪詢服務並確保從輪詢傳回的資料正確。

啟用服務檢查

在監控服務之前,我們需要在 LibreNMS 主機上編輯 /opt/librenms/config.php 檔案,並新增以下行:

$config['show_services'] = 1;

您可能還希望取消註解一些或全部這些 $config 行,以便掃描子網路而不是一次新增一個裝置:


### List of RFC1918 networks to allow scanning-based discovery
#$config['nets'][] = "10.0.0.0/8";
#$config['nets'][] = "172.16.0.0/12";
$config['nets'][] = "192.168.0.0/16";

更新 Cron 排程器

現在,我們將透過在 /etc/cron.d/librenms 檔案中新增以下行來更新應用程式的 cron 排程器:

*/5 * * * * librenms /opt/librenms/services-wrapper.py 1

安裝外掛程式

預設情況下,並非所有外掛程式都已安裝。安裝它們的方法如下:

apt-get install nagios-plugins nagios-plugins-extra

新增服務

現在,我們應該能夠新增服務。在 LibreNMS 中選擇「Services > Add a Service」,並監控核心交換器上的 SSH(TCP 連線埠 22):

此圖示顯示瞭如何在 LibreNMS 中監控基本服務。

您可以對此進行擴充套件 - 您是否注意到新增第一個服務時清單中有多少服務檢查?讓我們新增一個 HTTP 服務的監控。在這種情況下,我們將在防火牆上觀察它。這也是一個用於觀察 SSL VPN 服務的好檢查:

此圖示顯示瞭如何在 LibreNMS 中使用引數監控 HTTPS 服務。

請注意,這裡的引數很重要。-S 表示檢查應該使用 SSL(或更具體地說,TLS)。-p 443 表示要輪詢的連線埠。

現在,當我們導航到「Services」頁面時,我們將看到剛才新增的兩個服務。您可能需要等待幾分鐘,讓 LibreNMS 輪詢兩者:

此圖示顯示了 LibreNMS 中的服務顯示。

可用的服務檢查

完整的可用外掛程式清單可以直接從「Service」組態頁面上的下拉式清單中看到:

此圖示顯示了 LibreNMS 中可用的服務檢查。

一些常用的檢查包括下列:這些檢查的引數檔案位於 https://www.monitoring-plugins.org/doc/man/index.html

在 Linux 上收集 NetFlow 資料

在探討了 LibreNMS 系統的基本操作之後,我們現在轉向收集和分析流量。我們不會使用封包捕捉,而是透過 NetFlow 協定家族將高層級的流量資訊彙總成「流」。讓我們深入瞭解如何在 Linux 上收集 NetFlow 資料。

為什麼需要 NetFlow?

當檢視介面吞吐量不夠時該怎麼辦?SNMP 吞吐量圖表通常會告訴你存在問題,但無法進一步指出哪個協定或哪些人佔用了所有頻寬。這時候,NetFlow 就派上用場了。它收集了你可能需要的所有資訊,幫助你成為一名「頻寬偵探」。

什麼是 NetFlow 及其「表親」SFLOW、J-Flow 和 IPFIX?

NetFlow 是一種服務,它從識別的介面(通常在路由器、交換器或防火牆上)收集流量並對其進行彙總。收集的資訊幾乎總是包括核心的「tuple」值:

  • 來源 IP
  • 目的地 IP
  • 協定(TCP、UDP、ICMP 等)
  • 來源埠
  • 目的地埠

現代的 NetFlow 組態可以擴充套件標準的「tuple」值,新增以下內容:

  • QOS 資訊(TOS 或 DSCP 位元)
  • BGP 自治系統(AS)編號
  • TCP 旗標(SYN、ACK 等)

TCP 旗標至關重要,因為第一個封包(僅設定 SYN 旗標)定義了對話中的客戶端和伺服器。

NetFlow 的版本和相關協定

NetFlow 最初由 Cisco 開發,但後來在 RFC 流程下開發,以允許在業界更廣泛地採用。除了 Cisco 之外,許多廠商都支援 NetFlow。常見的有兩個版本:5 和 9,主要區別在於支援的欄位數量。

其他相關協定包括:

  • sFlow:由 InMon 開發的開放標準,也有支援的 RFC。通常會看到支援 NetFlow 和 sFlow 的網路裝置。
  • IPFIX(IP Flow Information eXport):另一個開放標準,建立在 NetFlow v9 的基礎上,並且是其超集。
  • J-Flow:Juniper 裝置的 NetFlow 相等協定。在最新版本(J-Flow v9)中,它與 IPFIX 基本相同。

收集和分析流程資料

無論使用哪種協定匯出流程資訊,接收這些資訊的系統通常都能接收任何或所有這些協定。匯出通常在 UDP 連線埠上進行。雖然在某些情況下連線埠會在規範中定義,但它總是可以更改,並且通常會因廠商而異。

程式碼示例:組態 NetFlow

# 在思科路由器上組態 NetFlow v9
Router(config)# interface GigabitEthernet0/0
Router(config-if)# ip flow ingress
Router(config-if)# ip flow egress
Router(config-if)# exit
Router(config)# ip flow-export destination 192.168.1.100 2055
Router(config)# ip flow-export version 9
Router(config)# ip flow-export source GigabitEthernet0/0

內容解密:

  1. ip flow ingressip flow egress 命令用於在介面上啟用 NetFlow,分別用於監控進入和離開介面的流量。
  2. ip flow-export destination 192.168.1.100 2055 命令指定了 NetFlow 資料匯出的目標 IP 地址和連線埠號。
  3. ip flow-export version 9 命令指定使用 NetFlow 版本 9。
  4. ip flow-export source GigabitEthernet0/0 命令指定了用於匯出 NetFlow 資料的源介面。

實施流程收集的概念

流程收集協定中的一個關鍵概念是抽樣。所有這些協定在其組態中都有一個「每 y 個封包抽樣 x 個」的屬性,不同的廠商和平台有不同的預設值。

選擇介面對於實施也至關重要。與 SNMP 一樣,在大型交換器的所有連線埠上收集流程資訊可能會嚴重影響交換器的 CPU。

選擇收集拓撲也很重要。例如,在資料中心/總公司/分支機構場景中,如果大多數流量是「中心輻射式」(即分支機構之間的通訊很少),您可能會選擇僅在中心位置收集流程資料,並將流程收集器放在同一中心位置。