先來了解一下 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 協定來取得主機各種資訊,並以透過網頁繪製曲線圖的方式來呈現) 套件 – https://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.