SNMP 原理及配置簡述

轉自:http://www.linuxfly.org/post/552/

 隨着機器數量的增長,管理員不能像過去那樣,一臺臺機器進行監控、解決問題,而需要藉助各方工具進行統一監控和管理。利用SNMP,一個管理工作站可以遠程管理所有支持這種協議的網絡設備,包括監視網絡狀態、修改網絡設備配置、接收網絡事件警告等。
    在這裏,我不想講太多原理性的東西,網上有大堆的資料可以參考(附錄中有鏈接),下面僅說明關鍵內容,並提供Linux 和 Windows 環境下snmp實現的方法。

一、SNMP的組成
SNMP採用了Client/Server模型的特殊形式:代理/管理站模型。對網絡的管理與維護是通過管理工作站與SNMP代理間的交互工作完成的。每個SNMP從代理負責回答SNMP管理工作站(主代理)關於MIB定義信息的各種查詢。
簡單來說,就是需要一個服務器程序(代理,agent)和一個客戶機(管理器,manager)。而與直觀上不同的是,SNMP的服務器端代表被管理的事物,而客戶機端纔是管理者。客戶機從簡單的命令行實用程序,如net-snmp提供的snmpwalk,到專門的管理軟件、工作站都有。

二、SNMP的組織結構
SNMP數據以一種標準化的層次結構進行佈置,這種結構的大部分都留給將來擴充,而特定廠商添加的部分則被本地化以避免衝突。命名的層次結構由MIB(Management Information Base,管理信息庫)組成,它是描述通過SNMP協議可訪問的數據的結構化文本文件。MIB 包括了對特定數據變量的說明,數據變量被稱爲OID(Object Identifier,對象標識符)。
wKioL1b82-OwPBKDAABdu9ojRVY689.jpg

SNMP 層次結構非常像一個文件系統。不過,它是用點號(.)作爲分隔符,每個節點被賦予了一個數字而不是名字。爲了易於引用,還可以給節點賦予文字名稱,但這種命名其實只是爲了高層應用方面而已,而不是層次結構的一項功能。(有點類似於DNS的作用)。

例如:設置(獲取)系統正確運行時間的OID是:

引用

1.3.6.1.2.1.1.3


這個OID也有一個方便讀取的名稱:

引用

iso.org.dod.internet.mgmt.mib-2.system.sysUpTime


(請參考下面的net-snmp 實現)
※ 實際上,目前只能在OID iso.org.dod.internet.mgmt(即數字1.3.6.1.2)之下才能找到有用的數據。

常見的幾個MIB II 選擇的OID

引用

system.sysDescr 系統信息:廠家、型號、操作系統類型等;
interfaces.ifNumber 系統的網絡接口數量
ip.ipRouteTable 系統的路由表


除了這些基本的MIB之外,不同的硬件廠商還會提供它們特有的MIB信息,如提供Agent,利用它們自己的API,往MIB中添加信息,以便於管理器獲取相關的信息。MIB只是提供了一個管理數據的約定,SNMP協議名字空間和設備實際狀態之間的映射關係必須由代理端代碼支持纔有用。當然,遵循同樣的規定,你也可以編寫直接的Agent。

三、SNMP協議一些操作
基本的SNMP協議操作只有4種:get(獲取)、get_next(獲取下一個)、set(設置)和trap(陷阱)。
get 和 set 是從節點讀取數據和把數據寫入節點的基本操作,節點以OID方式說明。
get-next 用於在MIB 層次結構上步進。
trap 是從服務器(代理程序)到客戶機(管理器)的一個主動提供的異步通知,在出現特定的事情或狀態時,它會報告。SNMP協議已經定義了若干標準的trap操作,例如“I have just come up”(剛啓動),還有報告網絡鏈路故障或已修復,路由或身份認證等的trap,這取決於agent程序的實現。

四、SNMP 驗證
因爲SNMP提供大量機器及系統信息,權限允許的話,還可以進行修改的操作,因此,SNMP的安全性很重要。目前,SNMP有兩種驗證標準,第2版和第3版。服務器(代理程序)和客戶機(管理器)的驗證方式必須相同。
第2版基於SNMP 羣體名(community name)的概念,其實可理解爲“口令”,以明文傳輸的方式進行;通常一個羣名用於只讀訪問,另一個羣名則允許寫入。
第3版引入了安全性更高的訪問控制方法,通過用戶名和密碼的加密傳輸來實現身份驗證,5.4 以上版本net-snmp支持v3方式,以下的版本可用v2方式。

五、Linux 下SNMP的實現
Linux 下SNMP協議協議,以net-snmp軟件來實現,它包含一個SNMP代理程序、一些命令行工具和一個庫,這個庫可用於開發支持SNMP 的應用軟件。net-snmp的代理程序負責收集本地主機的信息,並通過網絡把這些信息提供給SNMP管理器,這個代理程序可以擴展,例如執行Linux命令後,把命令的輸出作爲SNMP響應返回。這樣,利用該功能,就能用SNMP監控系統上的幾乎任何東西了。
官網地址:NET-SNMP

1、 配置代理程序
記住我這裏說的代理程序,就是要監控的目標(服務端)。以紅旗 DC Server 5.0 SP4爲例,其自帶net-snmp版本爲:

引用

# rpm -qa|grep net-snmp
net-snmp-libs-5.1.2-18.2
net-snmp-devel-5.1.2-18.2
net-snmp-perl-5.1.2-18.2
net-snmp-5.1.2-18.2
net-snmp-utils-5.1.2-18.2


版本是5.1.2的。同樣的,紅旗 Asianux 3.0的版本也僅爲5.3.2.2,都是僅支持v2 的認證方式,也就是說,下面的配置方式都是相同的。故我暫以v2 的驗證方式來說明,v3 的方式留待以後5.4 版本的net-snmp再進行描述。
配置文件是:/etc/snmp/snmpd.conf,裏面有詳細的例子和說明。簡單來說,就是先配置驗證信息,然後分組,給予權限,並分配可訪問的信息。

引用

# First, map the community name "public" into a "security name"
#       sec.name  source          community
# 設置允許某個IP,通過opendata作爲密碼進行訪問
com2sec notConfigUser  192.168.228.149       opendata
####
# Second, map the security name into a group name:
#       groupName      securityModel securityName
# 設置組及驗證的方式
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser

####
# Third, create a view for us to let the group have rights to:
# Make at least  snmpwalk -v 1 localhost -c public system fast again.
# 用view 設置視圖,定義允許訪問的信息範圍
#       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                               80
####
# Finally, grant the group read-only access to the systemview view.
#       group          context sec.model sec.level prefix read   write  notif
# 最後用access 把上面的三項連接起來
#access  notConfigGroup ""      any       noauth    exact  systemview none none
# 這裏的all 表示允許訪問全部信息
access  notConfigGroup ""      any       noauth    exact all none none


保存後,啓動服務:

# service snmpd start


查看端口是否已經打開:

引用

# netstat -ln|grep 161
udp        0      0 0.0.0.0:161                 0.0.0.0:*


2、管理器連接
記住,這裏的管理器實際上就是客戶端。因爲上面指定了允許訪問的IP,因此,只能通過該IP 進行訪問。net-snmp-utils 包提供了一些客戶端軟件。包括:

引用

snmpdelta 一直監視SNMP 變量的變化
snmpdf 通過SNMP監視遠程主機的磁盤空間
snmpget 從一個代理得到一個SNMP變量的值
snmpgetnext 從序列中獲得下一個變量
snmpset 設置代理商的一個SNMP變量
snmptable 得到一個SNMP變量表
snmptranslate 搜索並說明MIB結構中的OID
snmptrap 生成一次trap 告警
snmpwalk 從某個特定的OID開始遍歷MIB


這些命令很好用,可放在shell 中利用腳本進行監控。當然,還可以用perl 、php 等函數來獲取或設置SNMP Agent。
例如:

引用

# snmpdf -v 1 -c opendata 192.168.228.148
Description              size (kB)            Used       Available Used%
Memory Buffers             1034448           10772         1023676    1%
Real Memory                1034448          403876          630572   39%
Swap Space                       0               0               0    0%
/                         12381404         4552792         7828612   36%
/sys                             0               0               0    0%
/proc/sys/fs/binfmt_misc               0               0               0    0%


這裏用-v 1表示v1的驗證方式,還可以用-v c2表示以v2方式驗證(已在配置文件中定義):

引用

# snmpwalk -v 2c -c opendata 192.168.228.148 .1|more
SNMPv2-MIB::sysDescr.0 = STRING: Linux max1 2.6.9-42.7AXsmp #1 SMP Wed Jan 10 11:12:02 EST 2007 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1236742) 3:26:07.42
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: max1
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
......


※ 不帶OID節點參數運行的snmpwalk 也會列舉MIB信息,但可能不完整。
對比:

引用

# snmpwalk -v 2c -c opendata 192.168.228.148 .1|wc -l
8392
# snmpwalk -v 2c -c opendata 192.168.228.148|wc -l
6545


如果您想看某一部分OID節點的內容,可在snmpwalk 中通過數字或名稱的方式指定,下面三個命令的結果完全相同,都表示目標系統已運行的時間:

引用

# snmpwalk -v 1 -c opendata 192.168.228.148 1.3.6.1.2.1.1.3
SNMPv2-MIB::sysUpTime.0 = Timeticks: (843438) 2:20:34.38
# snmpwalk -v 1 -c opendata 192.168.228.148 iso.org.dod.internet.mgmt.mib-2.system.sysUpTime
SNMPv2-MIB::sysUpTime.0 = Timeticks: (843527) 2:20:35.27
# snmpwalk -v 1 -c opendata 192.168.228.148 SNMPv2-MIB::sysUpTime.0
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1263665) 2:20:35.51


六、附錄
1、在Windows 上打開SNMP 代理程序
可參考:在Windows服務器上開啓SNMP代理程序 一文:

pdf閱讀地址:http://www.linuxfly.org/p_w_upload/1283854602_3807e10c.pdf


2、監控磁盤 I/O 資源
由於net-snmp 不同版本提供的agent可能不同(有些還因爲Bug 的問題,給出的信息不準確)。以監控磁盤 I/O爲例,必須在編譯時,加上--with-mib-modules=ucd-snmp/diskio 一同編譯該agent。
對於rpm 包,可在.spec 中有類似:

引用

MIBS="host agentx smux ucd-snmp/diskio disman/event-mib"
%configure \
        --enable-static --enable-shared                 \
        --with-cflags="$CFLAGS"                         \
        --with-sys-location="Unknown"                   \
        --with-logfile="/var/log/snmpd.log"             \
        --with-persistent-directory="/var/net-snmp"     \
        --with-mib-modules="$MIBS"      \
%if %{tcp_wrappers}
        --with-libwrap=%{_libdir}                       \
%endif
        --sysconfdir=%{_sysconfdir}                     \
        --enable-ipv6                                   \
        --enable-ucd-snmp-compatibility                 \
        --enable-mfd-rewrites                           \
        --with-pic                                      \
        --with-sys-contact="root@localhost" <<EOF


若已確認版本支持監控磁盤I/O資源,可由“.1.3.6.1.4.1.2021” 或“UCD-SNMP-MIB” 的OID節點得到相關信息。

引用

# snmpwalk -v 1 -c opendata 192.168.228.148 .1.3.6.1.4.1.2021|more
UCD-SNMP-MIB::memIndex.0 = INTEGER: 0
UCD-SNMP-MIB::memErrorName.0 = STRING: swap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 0
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 1034448
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 629356
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 629356
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000
......
# snmpwalk -v 1 -c opendata 192.168.228.148 UCD-SNMP-MIB::ucdExperimental.15.1.1.2.19
UCD-SNMP-MIB::ucdExperimental.15.1.1.2.19 = STRING: "sda1"


表述內容如下:

引用

oid=".1.3.6.1.4.1.2021.13.15.1.1.2" 表示設備名稱;
oid=".1.3.6.1.4.1.2021.13.15.1.1.3" 是rbyte;
oid=".1.3.6.1.4.1.2021.13.15.1.1.4" 是wbyte;
oid=".1.3.6.1.4.1.2021.13.15.1.1.5" 是read 塊;
oid=".1.3.6.1.4.1.2021.13.15.1.1.6" 是write 塊;


※ 注意:不帶OID節點參數運行的snmpwalk 命令並沒有提供這部分信息,用.1作爲OID節點參數則可得到。

3、自助配置腳本
爲方便配置,我提供一個精簡版的配置腳本。不過,該腳本加入了一個可查看全部信息的組,沒有打開額外的功能。

下載文件,請到原博文下載:http://www.linuxfly.org/post/552/


用法:

引用

# ./snmp_setup 
Please input client IP: 
( Which admit connect to this machine) 
允許連接的管理端機器IP
Please input community password: 
連接用的密碼
Please input system location: 
該服務器的描述
Please input system contact: 
該服務器的描述 
******************************************* 
Client IP: 允許連接的管理端機器IP
Community password: 連接用的密碼 
System location: 該服務器的描述 
System contact: 該服務器的描述 
******************************************* 
Do you confirm upper information(Yes/No): 
Yes to continue,No or other words will exit !
輸入Yes或yes保存,並啓動snmpd服務,其他輸入信息將退出腳本。


然後用下面的命令測試連接即可:

# snmpwalk -v 2c -c 密碼 已打開snmpd服務的IP .1


七、參考資料
SNMP協議開發家園
Monitoring disk IO with Net-SNMP

相關日誌
[原]激活Windows下Apache的php_snmp 模塊支持
[原]使用SNMP監控Heartbeat狀態
[原]自定義SNMP Agent
[原]使用MRTG畫圖進行監控

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