snmp是啥及snmpd.conf基礎實用配置解析

1、snmp是什麼

前兩天項目要求一個附加功能,遠程監視服務器的運行狀況,要定期監視指定端口,指定業務,還包括服務器的磁盤空間,內存,CPU使用率等等。這頭倆事還好說,ping和telnet也就搞定了,實在不行就開個socket連一下,關鍵後邊的事有點抓瞎,要是在本地,可以通過API得到系統信息,分析磁盤空間,內存啥的,可是遠程得到別的機子的信息,那不成木馬了麼。到網上一查,原來有SNMP可以幫着做這件事情。於是就瞭解了一下,發現這個東西挺有意思。簡單地做個筆記。

SNMP簡單網絡管理協議,是一個用來進行網絡管理的協議,之所以稱其簡單,是因爲它是另一個網管協議的簡化版。並不是說簡化版就不頂用。相反,那個不簡化的網管協議號稱因爲太複雜,幾乎不可能實現並推廣。不過說實在的,SNMP我都沒覺得它多簡單,它至今經過十多年的演進,廣泛用於各種網絡設備及工業控制中,我個人感覺,隨着網絡進一步發展,電器都會有IP地址的時候,SNMP或它的替代品的作用,應該是會更加重要的。

SNMP簡單說,包括了被管的設備,代理和網管系統三個部分。被管的設備指的就是我們要獲取信息的設備,這個任務裏我需要獲取它的磁盤空間。但是被管理設備只是產生這些數據,真正將數據報告回來的工作是由代理完成的。代理說白了就是一個運行在被管設備上的程序。網絡編程的角度講它就是一個小的socket服務程序,監聽着好像是161端口。通過在被管設備上,需要啓動snmp服務。比如在linux上,就需要執行service snmpd start來啓動snmp服務,也就是把代理跑起來。實際過程中,代理包含在各種網絡設備上,包括交換機,路由器甚至打印機,手機,調制解調器上。網管系統就是我們要從被管設備獲取數據並進行分析處理的這個程序。可以想像它運行在本地。只要我將一個合格的請求發往正在運行的代理處,代理從請求中,理解請求的內容,並從被管設備上用它自己的方式蒐集到所需的信息,併發送回來,這樣一個網管的簡單過程就完成了。

這樣的管理方式,還是很靈活的,只要請求包符合協議標準,用哪種語言開發網管系統無所謂;從代理角度講,只要能正常監聽並處理請求,代理可以任意實現。我不太清楚國際上有沒有一個統一的標準,比如讓我寫代理,有請求要查詢網絡端口的數量,我非把顯示器尺寸返回去,不知道警察抓不抓我,至少客戶會要求退貨吧。也正是因爲這種靈活,SNMP也可以支持大規模的集中管理,我同樣一個查詢存儲空間的請求,可以發給我的PC,也可以發給我的諾基亞手機,可能得到的會是存儲卡的容量吧,就看代理怎麼實現了。

至於如何表達我的請求,這裏有一個統一的標準,就是MIB,管理信息庫的縮寫,就好像一個註冊表一樣,但是這個註冊表不實際存值,不像Windows的註冊表。它只是給每一種設備信息編了一個號,稱爲OID。這個號是以樹的形式組織的,中間用點隔開,便於管理。約定好了查的時候直接報告這個號就知道查什麼值了。這個號是大家統一的,好比如每個人都有眼睛,眼睛的好壞我們可以用視力來衡量,我們就可以這樣定:“人(1).身體(2).五官(3).眼睛(4).視力(5)”。那如果我向一個人發請求,問他的視力,那可以衝他說:那誰誰誰,我是那誰家的誰誰誰,告訴我.1.2.3.4.5.0 這裏的"1.2.3.4.5"是對象標識符,後面再加上.0就是實例標識符。

 

snmp爲了簡單,規定的操作類型較少,基本常用的有獲取(Get),設置(Set),獲取下一個(GetNext),還有一個由代理主動發出的(Trap)用於報告事件。另外snmp已經發展到V3了,這個過程中又新增了什麼GetBulk等等。我還沒有用到,不敢亂說。回頭試試再作筆記。

 

在linux下,配置SNMP服務要修改/etc/snmp/snmpd.conf,也可以通過snmpconf命令配,挺方便的。

在windows下,直接在控制面板,添加刪除程序裏,添加Windows組件,然後選網絡管理,就裝上snmp服務了。在服務列表裏找到它,可以通過屬性進行配置。

參考:https://www.cnblogs.com/lidabo/p/7554551.html


2、snmd.conf配置解析

當下的 SNMP 服務器通常用來被諸如 Nagios、Cacti、Zabbix 等監控軟件收集數據,SNMP 的很多高級特性用的不是特別頻繁。因而只需對 SNMP 進行一些簡單、基礎的配置以滿足各種監控軟件的需求。

通常 SNMP 服務的配置文件位於/etc/snmp/snmpd.conf,先來看一下這個文件:

    ####
    # First, map the community name “public” into a “security name”

    # sec.name source community
    com2sec notConfigUser default public #定義community名稱爲 public,映射到安全名 notConfigUser。

    ####
    # Second, map the security name into a group name:

    # groupName securityModel securityName
    group notConfigGroup v1 notConfigUser #定義安全用戶名notConfigUser映射到notConfigGroup組。
    group notConfigGroup v2c notConfigUser

    ####
    # Third, create a view for us to let the group have rights to: #定義一個view,來決定notConfigUser可以操作的範圍。

    # make at least snmpwalk -v 1 localhost -c public system fast again. #定義可查看的snmp的範圍。
    # name incl/excl subtree mask(optional)
    view systemview included .1.3.6.1.2.1.1
    view systemview included .1.3.6.1.2.1.25.1.1
    view all included .1
    ####
    # Finally, grant the group read-only access to the systemview view. #給notConfigGroup組所定義view名 all 以只讀權限。

    # group context sec.model sec.level prefix read write notif
    access notConfigGroup “” any noauth exact all none none
    #access notConfigGroup “” any noauth exact mib2 none none

    # —————————————————————————–

    # Here is a commented out example configuration that allows less
    # restrictive access.

    # YOU SHOULD CHANGE THE “COMMUNITY” TOKEN BELOW TO A NEW KEYWORD ONLY
    # KNOWN AT YOUR SITE. YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO
    # SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.

    ## sec.name source community
    #com2sec local localhost COMMUNITY
    #com2sec mynetwork NETWORK/24 COMMUNITY

    ## group.name sec.model sec.name
    #group MyRWGroup any local
    #group MyROGroup any mynetwork
    #
    #group MyRWGroup any otherv3user
    #…

    ## incl/excl subtree mask
    #view all included .1 80

    ## -or just the mib2 tree-

    #view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc
    #view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc

    ## context sec.model sec.level prefix read write notif
    #access MyROGroup “” any noauth 0 all none none
    #access MyRWGroup “” any noauth 0 all all all
有以上這些配置其實已經能夠基本滿足大多數需求了,還算是比較簡單的,配置 SNMP 可以參考以下步驟:

1. 首先定義一個共同體名稱(community),這裏是 public ,及可以訪問這個 public 的用戶名(sec name),這裏是 notConfigUser 。public 相當於用戶 notConfigUser 的密碼。

# sec.name                source      community
  com2sec notConfigUser  default       public

2. 定義一個組名(groupName)這裏是 notConfigGroup,及組的安全級別,把 notConfigGroup 這個用戶加到這個組中。

#  groupName         securityModel    securityName
group   notConfigGroup   v1           notConfigUser  
group   notConfigGroup   v2c          notConfigUser

3. 定義一個可操作的視圖(view)名, 這裏是 all,範圍是 .1。

# name           incl/excl     subtree         mask(optional)
  view  all      included        .1

4. 定義 notConfigUser 這個組在 all 這個視圖範圍內可做的操作,這時定義了 notConfigUser 組的成員可對 .1 這個視圖做只讀操作。

# group        context sec.model sec.level prefix read   write  notif
 access  notConfigGroup ""      any       noauth    exact  all  none none

這樣對 snmpd.conf 文件就基本完成了,用service snmpd restart重啓 snmpd 服務。

之後,我們需要一個測試,驗證 SNMP 配置的正確性。在監控主機中執行以下命令:

[root@chenyi Packages]# snmpwalk -v 1 192.168.1.220 -c public system
Timeout: No Response from 192.168.1.220
[root@chenyi Packages]# snmpwalk -v 1 192.168.1.220 -c public system
SNMPv2-MIB::sysDescr.0 = STRING: Linux chenyi 2.6.32-279.el6.i686 #1 SMP Fri Jun 22 10:59:55 UTC 2012 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (797) 0:00:07.97
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: chenyi
.....................

上述信息說明 SNMP 已經正常工作了。

現在我們在目標主機上來寫一些腳本來獲取 Memory、CPU、DiskIO 等狀態。

Memory 腳本:

#!/bin/sh
/usr/bin/free -m | grep Mem |awk '{print $4}'
/usr/bin/free -m | grep Mem |awk '{print $2}'
[root@chenyi ~]# sh memory.sh
809
1006

CPU 腳本:

#!/bin/sh
idle=`sar  -u 1 3 | grep Average | awk '{print $6}'`
used=`echo "101 - $idle" | bc -l -s`
echo $used
echo $idle

Disk I/O 腳本:

#!/bin/sh
used1=`sar -d 1 3 | tail -1 | awk '{print $4}'`
used2=`echo "$used1 / 2" | bc -l`
echo $used2
echo $used2

現在我們已經能得到這數據了,怎麼才能讓監控主機通過 snmpd 得到這些數據呢?可以在目標主機的/etc/snmp/snmpd.conf文件中加入這些配置:

exec .1.3.6.1.4.1.2021.53 memory /bin/sh /root/memory.sh
exec .1.3.6.1.4.1.2021.54 cpu /bin/sh /root/cpu.sh
exec .1.3.6.1.4.1.2021.55 disk /bin/sh /root/disk.sh
[root@chenyi ~]# service snmpd restart
停止 snmpd:                                               [確定]
正在啓動 snmpd:                                           [確定]

這樣在監控主機上運行:

[root@chenyi ~]# snmpwalk -v 1 192.168.1.220 -c public .1.3.6.1.4.1.2021.53
UCD-SNMP-MIB::ucdavis.53.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.53.2.1 = STRING: "memory"
UCD-SNMP-MIB::ucdavis.53.3.1 = STRING: "/bin/sh /root/memory.sh"
UCD-SNMP-MIB::ucdavis.53.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.53.101.1 = STRING: "442"
UCD-SNMP-MIB::ucdavis.53.101.2 = STRING: "1006"
UCD-SNMP-MIB::ucdavis.53.102.1 = INTEGER: 0

其中UCD-SNMP-MIB::ucdavis.53.101.1 = STRING: "442"中的 442 就是 mem.sh 輸出的第一個數據,1006 是 mem.sh 輸出的第二個數據。

略作修改:(此處參照其他文章)

[root@chenyi ~]# snmpwalk -v 1  192.168.1.220 -c public .1.3.6.1.4.1.2021.53 | grep 53.101 | awk -F\" '{print $2}'
443
1006

我們已經通過 snmpd 從監控主機上得到了目標主機上內存使用狀態的兩個參數,其它腳本也是一樣的。

參考:https://www.linuxde.net/2013/02/12269.html


3、另外配置

1 默認 SNMP 代理配置對 “public” 團體只給予從本地主機訪問整個 MIB 樹的只讀訪問權限。

注:出於安全性原因,建議在可能的情況下,將 SNMP 訪問限制在特定的遠程主機。
請編輯 SNMP 代理配置文件snmpd.conf :
rocommunity public 127.0.0.1
編輯或複製該行,以使用遠程主機 IP 地址來替換 127.0.0.1。 編輯後,新行應爲:
rocommunity public IP_address

注:通過從每個遠程主機添加 rocommunity 指令,可從多個特定的遠程主機啓用 SNMP 訪問。

2 要啓用從所有遠程主機對運行 Server Administrator 的系統的 SNMP 訪問,請編輯 SNMP 代理配置文件 snmpd.conf:

通過刪除 127.0.0.1 來編輯此行。 編輯後,新行應爲:
rocommunity public


3 更改 SNMP 團體名稱
配置 SNMP 團體名稱可確定哪些 Management Station 能夠通過 SNMP 管理您的系統。 管理應用程序使用的 SNMP 團體名稱必須與在 Server Administrator 系統上配置的 SNMP 團體名稱匹配,以便管理應用程序可以從 Server Administrator 檢索管理信息。
要更改用於從運行 Server Administrator 的系統檢索管理信息的默認 SNMP 團體名稱,請編輯 SNMP 代理配置文件 snmpd.conf :

rocommunity public 127.0.0.1
編輯此行,用新 SNMP 團體名稱替換 public。 編輯後,新行應爲:
rocommunity community_name 127.0.0.1


4 SNMP Set 操作啓用。

要在運行 系統中啓用 SNMP 設置操作,請編輯 SNMP 代理配置文件snmpd.conf :
增加配置

rwcommunity private default
rwcommunity6 private default
 

參考:https://blog.csdn.net/u011857683/article/details/79931197

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章