Linux – SNMP

先來了解一下 SNMP , MIB , OID 名稱所代表的意思

  • SNMP (Simple Network Management Protocol 簡易網路管理協定)
    用來管理網路設備(伺服器,電源供應器,RAID…)的一種協定 (Protocol).SNMP 使用 UDP Port 161 來傳送及請求訊息,以及 UDP Port 162 等待 trap 訊息.

    [root@localhost ~]# netstat -lnpu | grep -i snmp
    udp        0      0 0.0.0.0:161             0.0.0.0:*                           1023/snmpd      
    

    主要可以分為三部分 1. 管理端 (Manager) , 2. 代理者 (Agent) 以及 3. NMS(Network Management Station) , 後面會一一解釋.

  • MIB (Management information base) , OID (Object Identifier)
    管理資訊庫 MIB 為階層性的資料分類,用來定義所有網路設備的屬性,每一個屬性亦即為 Object Identifier (OID) , APC 的 OIDs 定義如下.

     
    iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).apc(318).products(1).hardware(1).rPDU2(26)
    

    .

  • Agent
    通常運作在被監控的網路設備上,並提供資訊給 管理端,SNMP V1定義了五種指令 Get Request , Get NextRequest , Get Response , Set Request , Trap, SNMP V2 新增了 GETBULK REQUEST , INFORM .
  • NMS(Network Management Station)
    管理端 (Manager) 利用 SNMP 協定向 Agent 查詢被監控網路設備上的資訊,並利用資訊彙整資料(統計圖表)給使用者.

測試環境為 CentOS 7 x86_64 (虛擬機) : IP : 192.168.95.137 (已安裝 mrtg)

所需套件為 net-snmp 與 net-snmp-utils

[root@localhost ~]# yum install net-snmp net-snmp-utils

SNMP 指令(rocommunity)

snmpwalk
指令 snmpwalk 後面接的字串可以是不完整的,如果是空的會透過 GETNEXT 把設備上的資訊一一輪詢出來 (透過這種方式可以讓我們得知有哪一些裝置可以做查詢).

參數說明:
-Os : 顯示方式(Output) MIB object name (plus any instance 或 other subidentifiers),其它方式請 man snmpcmd 查詢.
-v: SNMP 版本,從 1 , 2c 到 3 .
-c community : SNMPv1/v2c 傳輸時需要設定 community string (類似 user id 或是 password 之類的意思) , 很多設備預設為 public.

[root@localhost ~]# snmpwalk -Os -c public -v 1 192.168.95.137
sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64
sysObjectID.0 = OID: netSnmpAgentOIDs.10
sysUpTimeInstance = Timeticks: (2225) 0:00:22.25
sysContact.0 = STRING: root@localhost
sysName.0 = STRING: localhost.localdomain
sysLocation.0 = STRING: Unknown
sysORLastChange.0 = Timeticks: (4) 0:00:00.04
sysORID.1 = OID: snmpMPDCompliance
sysORID.2 = OID: usmMIBCompliance
sysORID.3 = OID: snmpFrameworkMIBCompliance
sysORID.4 = OID: snmpMIB
sysORID.5 = OID: tcpMIB
sysORID.6 = OID: ip
sysORID.7 = OID: udpMIB
...

為什麼我透過指令 snmpwalk 卻沒有任何值?可以先在你的 server 安裝 mrtg.

[root@localhost ~]# snmpwalk -Os -c public -v 1 192.168.95.137
Timeout: No Response from 192.168.95.137

安裝 mrtg (MRTG : Multi Router Traffic Grapher 一套以 SNMP 協定來取得主機各種資訊,並以透過網頁繪製曲線圖的方式來呈現) 套件 – http://benjr.tw/8926 ,修改 snmp 設定檔 ro (read Only) community 為 public (功能類似 user id 或是 password 之類的意思,建議改成別的名稱) 並啟動 snmp 服務.

[root@localhost ~]# yum install mrtg
[root@localhost ~]# echo 'rocommunity public' > /etc/snmp/snmpd.conf
[root@localhost ~]# systemctl start snmpd
[root@localhost ~]# systemctl enable snmpd
Created symlink from /etc/systemd/system/multi-user.target.wants/snmpd.service to /usr/lib/systemd/system/snmpd.service.

一樣的指令,查詢與網卡裝置相關的 OID .

[root@localhost ~]# snmpwalk -Os -v 2c -c public 192.168.95.137 ifName
ifName.1 = STRING: lo
ifName.2 = STRING: ens33
ifName.3 = STRING: virbr0
ifName.4 = STRING: virbr0-nic

Linux SNMP 指令集:
snmpstatus

[root@localhost ~]# snmpstatus -v 2c -c public 192.168.95.137
[UDP: [192.168.95.137]:161->[0.0.0.0]:47287]=>[Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64] Up: 0:31:36.08
Interfaces: 4, Recv/Trans packets: 27380/27290 | IP: 27369/27252
2 interfaces are down!

snmpbulkget

[root@localhost ~]# snmpbulkget -v 2c -c public 192.168.95.137 ifName
IF-MIB::ifName.1 = STRING: lo
IF-MIB::ifName.2 = STRING: ens33
IF-MIB::ifName.3 = STRING: virbr0
IF-MIB::ifName.4 = STRING: virbr0-nic
IF-MIB::ifInMulticastPkts.1 = Counter32: 0
IF-MIB::ifInMulticastPkts.2 = Counter32: 0
IF-MIB::ifInMulticastPkts.3 = Counter32: 0
IF-MIB::ifInMulticastPkts.4 = Counter32: 0
IF-MIB::ifInBroadcastPkts.1 = Counter32: 0
IF-MIB::ifInBroadcastPkts.2 = Counter32: 0

snmpbulkwalk

[root@localhost ~]# snmpbulkwalk -v 2c -c public 192.168.95.137 ifName
IF-MIB::ifName.1 = STRING: lo
IF-MIB::ifName.2 = STRING: ens33
IF-MIB::ifName.3 = STRING: virbr0
IF-MIB::ifName.4 = STRING: virbr0-nic

其他指令 : snmpset , snmpgetnext , snmptest

OID (Object Identifier)

剛剛透過指令查詢出來的數值都有對應的 OID ,那怎麼查詢 OID ?
OID 為樹狀結構,以前面看網卡的例子,透過 snmpwalk -Of 以及 -On 就可以自行查詢.

[root@localhost ~]# snmpwalk -Of -v 2c -c public 192.168.95.137 ifName
.iso.org.dod.internet.mgmt.mib-2.ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.1 = STRING: lo
.iso.org.dod.internet.mgmt.mib-2.ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.2 = STRING: ens33
.iso.org.dod.internet.mgmt.mib-2.ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.3 = STRING: virbr0
.iso.org.dod.internet.mgmt.mib-2.ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.4 = STRING: virbr0-nic
[root@localhost ~]# snmpwalk -On -v 2c -c public 192.168.95.137 ifName
.1.3.6.1.2.1.31.1.1.1.1.1 = STRING: lo
.1.3.6.1.2.1.31.1.1.1.1.2 = STRING: ens33
.1.3.6.1.2.1.31.1.1.1.1.3 = STRING: virbr0
.1.3.6.1.2.1.31.1.1.1.1.4 = STRING: virbr0-nic

參數:

  • -Of : Include the full list of MIB objects.
  • -On : Displays the OID numerically.

使用一樣的參數來查詢與記憶體相關的 OID.

[root@localhost ~]# snmpwalk -Of -v 2c -c public 192.168.95.137 mem
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memIndex.0 = INTEGER: 0
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memErrorName.0 = STRING: swap
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memTotalSwap.0 = INTEGER: 2097148 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memAvailSwap.0 = INTEGER: 2097148 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memTotalReal.0 = INTEGER: 997948 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memAvailReal.0 = INTEGER: 118836 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memTotalFree.0 = INTEGER: 2215984 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memMinimumSwap.0 = INTEGER: 16000 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memShared.0 = INTEGER: 14968 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memBuffer.0 = INTEGER: 2116 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memCached.0 = INTEGER: 441592 kB
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memSwapError.0 = INTEGER: noError(0)
.iso.org.dod.internet.private.enterprises.ucdavis.memory.memSwapErrorMsg.0 = STRING: 

SNMP 指令(rwcommunity)

剛剛設定 snmp 設定檔為 ro (read Only) community 為 public (讀取資料模式) ,我們還可以設定成為 rw (Read / Write) 模式 rwcommunity private 來進行寫入,寫入是透過指令 snmpset .

如果是要自訂 MIB (Management information base),可以透過指令 smidump.

沒有解決問題,試試搜尋本站其他內容

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料