linux服務之snmp


背景信息


http://datatracker.ietf.org/doc/rfc1213/

http://oid-info.com/get/1.3.6.1

http://oid-info.com/get/1.3.6.1.2.1    此下面包含220個子OID

http://www.oidview.com/mibs/detail.html

http://www.net-snmp.org/docs/man/snmpd.conf.html

http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers

http://www.wtcs.org/snmp4tpc/getif.htm  一個windows下查看mib的工具


具體實現


[root@localhost mibs]# rpm -ql net-snmp-libs
/usr/lib64/libnetsnmp.so.20
/usr/lib64/libnetsnmp.so.20.0.0
/usr/lib64/libnetsnmpagent.so.20
/usr/lib64/libnetsnmpagent.so.20.0.0
/usr/lib64/libnetsnmphelpers.so.20
/usr/lib64/libnetsnmphelpers.so.20.0.0
/usr/lib64/libnetsnmpmibs.so.20
/usr/lib64/libnetsnmpmibs.so.20.0.0
/usr/lib64/libnetsnmptrapd.so.20
/usr/lib64/libnetsnmptrapd.so.20.0.0
/usr/lib64/libsnmp.so.20
/usr/lib64/libsnmp.so.20.0.0
[root@localhost mibs]# rpm -ql lm_sensors-libs
/usr/lib64/libsensors.so.4
/usr/lib64/libsensors.so.4.2.0
[root@localhost mibs]# rpm -ql net-snmp  相當於服務端
/etc/rc.d/init.d/snmpd
/etc/rc.d/init.d/snmptrapd
/etc/snmp
/etc/snmp/snmpd.conf
/etc/snmp/snmptrapd.conf
/etc/sysconfig/snmpd
/etc/sysconfig/snmptrapd
/usr/bin/net-snmp-create-v3-user
/usr/bin/snmpconf
/usr/sbin/snmpd
/usr/sbin/snmptrapd
[root@localhost mibs]# rpm -ql net-snmp-utils  相當於客戶端

[root@rac02 mibs]# snmpwalk -v 2c -c flt123  192.168.2.250 hrSWRunPerfMem|sed '/: 0 KB/d'|cut -d " " -f4|awk '{s+=$1}END{print s}' 對程序占用內存相加求和

[root@rac02 mibs]# snmpwalk -v 2c -c flt123 localhost 1.3.6.1.2.1|cut -d ":" -f1 >s
[root@rac02 mibs]# cat s|wc -l
16361
[root@rac02 mibs]# cat s |sort -u |uniq
"
DISMAN-EVENT-MIB
EtherLike-MIB
HOST-RESOURCES-MIB
IF-MIB
IP-FORWARD-MIB
IP-MIB
IPV6-MIB
MTA-MIB
NOTIFICATION-LOG-MIB
RFC1213-MIB
RMON-MIB
SNMPv2-MIB
TCP-MIB
UDP-MIB


HOST-RESOURCES-MIB主要包括:
hrSystem:主要包括系統啟動時間、當前進程數、最大支持進程數等等。
hrstorage:主要包括物理內存大小,各個分區、虛擬內存的大小和使用情況
hrdevice:硬件設備情況、每個cpu的負載情況等
hrswrun:操作系統類型的標志、進程列表(進程的狀態、名字、路徑、參數等)
hrSWRunPerf:每個進程占用的內存、以及占用的CPU時間(累計)
hrSWinstalled:系統安裝的軟件信息

HOST-RESOURCES-MIB::hrSWRunStatus.8171 = INTEGER: running(1)
HOST-RESOURCES-MIB::hrSWRunStatus.8332 = INTEGER: runnable(2)
HOST-RESOURCES-MIB::hrSWInstalledName.250 = STRING: "net-snmp-libs-5.5-49.el6_5.4"
HOST-RESOURCES-MIB::hrSWInstalledType.250 = INTEGER: application(4)
HOST-RESOURCES-MIB::hrSWInstalledDate.250 = STRING: 2014-10-14,10:1:21.0,+8:0


RFC1213-MIB主要包括(跟服務器相關的):
.iso.org.dod.internet.mgmt.mib-2.udp.udpTable:服務器上的UDP端口占用情況。
.iso.org.dod.internet.mgmt.mib-2.tcp.tcpConnTable:服務器上的TCP連接情況


UCD-SNMP-MIB主要包括:  1.3.6.1.4.1.2021  在linux系統里
2021.4  memory
2021.10  laTable  負載
2021.11  systemStats
2021.100  version
2021.101  snmperrs

Statistics for MIB UCD-SNMP-MIB:

Objects: 171 OIDS: 162 Object Groups: 0
Traps: 0 Notifications: 2 Notification Groups: 0
Tables: 7 Tabulars: 63 Scalars/Other: 90

UCD-DISKIO-MIB


[root@250-shiyan snmp]# snmpd -v
NET-SNMP version:  5.5
Web:               http://www.net-snmp.org/
Email:             net-snmp-coders@lists.sourceforge.net

[root@250-shiyan sa]# snmpwalk -v 2c -O n  -c flt123 192.168.2.254 1.3.6.1.2.1.system  -O n 以數字形式顯示結果

[root@250-shiyan snmp]# snmptranslate -IR -Tp system  顯示oid樹

[root@250-shiyan snmp]# snmptranslate -Tl|more    字符加數字形式
[root@250-shiyan snmp]# snmptranslate -Ts|more    字符形式
[root@250-shiyan snmp]# snmptranslate -To|more    數字形式
[root@250-shiyan snmp]# snmptranslate -Tt|more    層次形式
[root@250-shiyan snmp]# snmptranslate -Ta|more
dump DEFINITIONS ::= BEGIN
org OBJECT IDENTIFIER ::= { iso 3 }
dod OBJECT IDENTIFIER ::= { org 6 }
[root@250-shiyan snmp]# snmptranslate -Td 1.3.6.1.2.1.1
SNMPv2-MIB::system
system OBJECT-TYPE
  -- FROM       SNMPv2-MIB, RFC1213-MIB
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) 1 }
[root@250-shiyan snmp]# snmptranslate -Tp 1.3.6.1.2.1.3
+--at(3)
   |
   +--atTable(1)
      |
      +--atEntry(1)
         |  Index: atIfIndex, atNetAddress
         |
         +-- -RW- INTEGER   atIfIndex(1)
         +-- -RW- String    atPhysAddress(2)
         |        Textual Convention: PhysAddress
         +-- -RW- NetAddr   atNetAddress(3)
[root@250-shiyan snmp]# snmptranslate -Tz |more
"org"                   "1.3"
"dod"                   "1.3.6"
"internet"                      "1.3.6.1"
"directory"                     "1.3.6.1.1"
"mgmt"                  "1.3.6.1.2"
"mib-2"                 "1.3.6.1.2.1"

測試topsec防火牆的mib

[root@250-shiyan sa]# snmpwalk -v 2c -c flt123 192.168.2.254 interface

[root@250-shiyan sa]# snmpwalk -v 2c -c flt123 192.168.2.254 1.3.6.1.4.1
SNMPv2-SMI::enterprises.14331.1.1.1.1.0 = INTEGER: 1
SNMPv2-SMI::enterprises.14331.1.1.1.2.0 = STRING: "systemStats"


MIB和OID  http://blog.sina.com.cn/s/blog_4502d59c0101fcy2.html


對象命名(objectnamingtree)

在RFC1213.mib中(即基於TCP/IP的因特網網絡管理之管理信息庫:MIBII,現已被RFC2013所取代)

OID(對象標識符),是SNMP代理提供的具有唯一標識的鍵值。MIB(管理信息基)提供數字化OID到可讀文本的映射。

MIB的結構來源於IETF RFC1155和2578定義的管理信息結構。如果你想要修改或編寫自己的MIB,在動手前理解SMI非常有幫助。

可以用行開頭為 -- 的方法在MIB中加入注釋。
在頭部用 BEGIN`聲明來開始MIB的定義。
`Imports 可用來從其他MIB中提取信息,通常用它來提取MIB-II規范要求的內容。
MIB放置從enterprise值開始的OID地址的結構。在此,enterprise值是318, 對應 "apc" (相對地址為 .1.318)。 通常之后會定義幾個類別。注意在花括號間定義的兩個值,其父地址后面跟一個它自己的地址。因此產品標識符有apc標識符表示,其父為enterprise標識符,以此類推。類別和自類別的類型通常跟在MIB頭的后面,並且把有用的鍵值分割為子組。通過分段,各種值分別被列出,這樣可用的值更容易瀏覽。

MIB的真正好處在於對象類型的描述。以下是一個整形鍵值的例子:

  1. upsBasicOutputStatus OBJECT-TYPE
  2. SYNTAX INTEGER {
  3. ........
  4. ::= { upsBasicOutput 1 }

 snmp數據類型


SMI定義的OID返回值的數據類型
數據類型共分為三大類,即:
(1)通用類型(Universal)
(2)通用結構類型(Universal-constructed)
(3)應用類型(application)

通用數據類型
通用數據類型通常被稱為非聚合類型,在SNMP協議中有4種通用數據類型:
(1)INTEGER: 整型,是-2,147,483,648~2,147,483,647的有符號整數;Signed 32bit Integer (values between -2147483648 and 2147483647)
(2)OCTET STRING: 字符串;Arbitrary binary or textual data, typically limited to 255 characters in length. 任意二進制或文本數據,通常長度限制在255個字符內。
(3)OBJECT IDENTIFIER: 對象標識符;An OID. 一個OID
(4)NULL: 空值。

通用結構類型
結構類型指列表和表格,常被稱作聚合類型。在SNMP協議中主要使用兩種結構類型:
(1)SEQUENCE 用於列表。這一數據類型與大多數程序設計語言中的“structure”類似。一個SEQUENCE包括0個或更多元素,每一個元素又是另一個ASN.1數據類型。
(2)SEQUENCE OF type 用於表格。這一數據類型與大多數程序設計語言中的“array”類似。一個表格包括0個或更多元素,每一個元素又是另一個ASN.1數據類型。

應用數據類型
應用數據類型采用隱式定義,是引用SNMP的簡單數據類型來定義的。主要有6種:
(1)IpAddress: 以網絡序表示的IP地址。因為它是一個32位的值,所以定義為4個字節;
(2)network address:網絡地址,表示從一個特定協議族中選定的網絡地址, SNMPv1僅支持32位IP地址;所以與IpAddress等效;
(3)counter:計數器是一個非負的整數,它遞增至最大值,而后歸零。SNMPv1中定義的計數器是32位的,即最大值為4,294,967,295;
(4)Gauge :也是一個非負整數,它可以遞增或遞減,但達到最大值時保持在最大值,最大值為2^32-1;Represents an unsigned integer, which may increase or decrease, but shall never exceed a maximum value. 表示無符號整數,可增加或減少,但是不超過最大值。
(5)time ticks:是一個時間單位,表示以0.01秒為單位計算的時間;Represents an unsigned integer which represents the time, modulo 2ˆ32 (4294967296 dec), in hundredths of a second between two epochs. 表示代表數據的一個無符號整數,2^32取模(4294967296),兩個值之間為百分之一秒。
(6)opaque:表示用於傳遞任意信息串的任意編碼格式,它與SMI使用的嚴格數據輸入格式不同。Provided solely for backward-compatibility, its no longer used. 提供向下兼容,不再使用的數據類型

 ""    null數據類型
 BITS  (Bit String)    Represents an enumeration of named bits. This is an unsigned datatype. 表示取名的位的枚舉。這是一個無符號的數據類型。
 Counter32
 Counter64
 Gauge32
 Hex-STRING
 INTEGER
 IpAddress
 Network Address
 OID
 STRING
 Timeticks


snmpd.conf說明


http://blog.chinaunix.net/uid-7654720-id-3346506.html  snmpd.conf基本配置

Linux下snmpd.conf說明--擴展B:可執行腳本    # Executables/scripts 指令或腳本 單行。# Extensible sections 指令或腳本 多行。

Linux下snmpd.conf說明--擴展C:Pass through control

exec 單行 命令或腳本
extend 多行 命令或腳本
pass   bash腳本不行

snmpd.conf通過exec支持直接對於執行指令或是執行腳本的返回結果的SNMP查詢。
但是有兩種情況:
1)只可以SNMP查詢出單行(首行)返回結果。
2)可以SNMP查詢出多行(全部)返回結果。
該信息保存在enterprises分支中的extEntry表中具體的OID為:.1.3.6.1.4.1.2021.8.1

vi snmpd.conf,修改配置文件,開啟下面兩行即可
# Executables/scripts
exec echotest /bin/echo hello world   #指令方式
exec shelltest /bin/sh /tmp/shtest  #腳本方式時格式要正確,四個字段都得有  exec  aa  /bin/bash  /root/fr不能放在root目錄下,如果放了,會報執行權限問題
命令行執行下面命令,便可查到
snmpwalk -v 2c -c public 192.168.1.21 .1.3.6.1.4.1.2021.8

此種方法,只能查詢出所執行腳本或指令所得到的第一行返回結果。
exec uptime /usr/bin/uptime
exec who  /usr/bin/who

下面再說第二種情況:可以SNMP查詢出多行(全部)返回結果
此格式,將該信息保存在指定的MIB中,這個MIB由自己指定空閑的MIB OID,也可以覆蓋已經定義的MIB OID,MIB后面要跟label,作為一個標識符在配置文件中添加。
與第一種情況不同的是:exec后,指定了OID,返回的結果如下:
# Extensible sections.
# exec .1.3.6.1.4.1.2021.51 ps /bin/ps    實際上exec是執行不成功的,新版的snmp采用extend而非exec,看版本就可以了,snmpd -v 5.5以后的用extend
extend .1.3.6.1.4.1.2021.51 ps /bin/ps

snmpwalk -v 2c -c public 192.168.1.21 .1.3.6.1.4.1.2021.51
可以看出這種方式是可以查詢到多行(全部)的返回結果。另外,同是也可以直接使用系統命令。如示例:
# exec .1.3.6.1.4.1.2021.51 ps /bin/ps

snmp提供了發送自定義信息的功能。查看snmpd.conf會看到有一個小節是關於外部腳本的,Executables/s。這個小節里面也舉了例子,告訴你怎么通過snmp發送信息。
在snmpd.conf任意位置添加一行:
extend .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh  
其中tcpCurrEstab是命令的名稱,后面是命令以及參數。命令的名稱可以隨便起。腳本執行的結果類似下面:
# /etc/tcpconn.sh
80
腳本內容如下:
$ cat tcpconn.sh
#!/bin/sh
conn=`netstat -s -t | grep connections\ established |awk '{print $1}'`
echo $conn
重啟snmpd,然后遠程通過snmpwalk接收一下數據看看:
# snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
UCD-SNMP-MIB::ucdavis.18.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.18.2.1 = STRING: "tcpCurrEstab"
UCD-SNMP-MIB::ucdavis.18.3.1 = STRING: "/etc/tcpconn_total.sh"
UCD-SNMP-MIB::ucdavis.18.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"
UCD-SNMP-MIB::ucdavis.18.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.18.103.1 = ""
其中我們需要的是UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488″這一行:
# snmpwalk -v 1 192.168.1.201 -c public .1.3.6.1.4.1.2021.18.101.1
UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"
能采集到數據之后,就可以配置cacti來接收了。

exec .1.3.6.1.4.1.2021.51 mem /bin/sh /usr/local/src/mem.sh
exec .1.3.6.1.4.1.2021.52 cpu /bin/sh /usr/local/src/cpu.sh
exec .1.3.6.1.4.1.2021.53 apache /bin/sh /usr/local/src/apache.sh
exec .1.3.6.1.4.1.2021.54 tomcat /bin/sh /usr/local/src/tomcat.sh
exec .1.3.6.1.4.1.2021.55 upload /bin/sh /usr/local/src/upload.sh

通過自己寫的小程序(Agent),可以利用SNMP服務獲得主機的某些信息(比如服務狀態等)。具體步驟如下:
此程序(agent),好像不能用bash,只能用c或perl
1    軟件安裝
    在被監控的主機上安裝snmp服務器軟件(比如net-snmp-5.1.2-11.EL4.10),在監控機上安裝客戶端軟件(比如,net-snmp-utils-5.1.2-11.EL4.10)。
2    配置SNMP服務。
    可以使用snmpconf命令。選擇配置文件后,選擇“2:  Extending the Agent”,在選擇“2:  Run a command that intepretes the request for an entire tree”。然后輸入OID,(比如:.1.3.6.1.4.1.96.255.1),然后輸入自己的程序的位置(比如:/usr/local/sbin/my_agent)。配置完成后保存配置文件,將其拷貝到/etc/snmp/snmpd.conf。可以看出,剛才的配置在其中生成一行:
    pass .1.3.6.1.4.1.96.255.1 /usr/local/sbin/my_agent
3   Agent的要求
    並非隨便的程序都可以做為SNMP Agent,這里要my_agent的運行結果生成三行:
    MIBOID
    TypeOfResult
    ValueOfResult
    IBOID自己定義一個,如.1.3.6.4.1.96.255.1;TypeOfResult,如int;ValueOfResult,如35,或者1或者0。監控機就可以通過這個值來判斷被監控機器的情況。要說明的是,agent采用bash腳本,SNMP並不識別。會出錯:“ No Such Instance currently exists at this OID”。根據本人測試,用Perl腳本與C語言的printf輸出都可以。為什么bash腳本不行,目前還不清楚,猜想是bash的console問題。
4    啟動snmp服務。可以用/etc/init.d/snmpd start。但是發現有時通過這個腳本啟動后,客戶端訪問會出錯。此時手工啟動,即snmpd -c /etc/snmp/snmpd.conf。然后,客戶端訪問就會成功。所有過程都一樣,就是啟動方式不一樣。不知道為什么?請高手賜教!
5    客戶端訪問
    客戶端安裝在監控機上,可以通過snmpget來查看,命令如下:
    snmpget -v2c -c public IP   OID
    比如:snmpget  -v2c -c public 192.168.50.11 .1.3.6.1.4.1.96.255.1
    結果顯示:SNMPv2-SMI::enterprises.96.255.1 = INTEGER: 96

[root@rac02 mibs]#
了解清楚需要監控對象的OID值,接下去就只要在監控機上部署對應的監控軟件來調用snmp就可以了,常用的開源監控軟件如cacti,nagios,zabbix都支持snmp。如果只是做一個簡單監控,那自己寫shell腳本也不失為一種方法。
下面我們就以監控文件系統的使用率為例,來自己編寫一個shell腳本AIX_FS_CHECK.sh,該腳本部署到監控機上。

為了觀察實際輸出效果,在腳本中我們將閥值設置的比較低,如果你有興趣也可以把閥值作為一個參數帶入到腳本中,我們來執行以下腳本看看效果:
# ./AIX_FS_CHECK.sh -h 192.0.246.23 -c hmsnmp
WARNING!!/usr used 74%
WARNING!!/usr Inodes used 18%
WARNING!!/patch used 97%
監控機通過snmp順利的獲取到了被監控設備的信息,並根據我們的要求發出相關報警信息。


監控技術比較


本文介紹三種Linux服務器監控技術的優缺點,其中有SNMP代理(客戶端)方式、SSH方式、安裝私有代理(客戶端)方式等內容。

  linux系統的強大的功能和絢麗的界面使得很多企業都選用linux系統來做服務器,下面是介紹三種Linux服務器監控技術的優缺點。

  Linux服務器監控技術1.SNMP代理(客戶端)方式

  SNMP(SimpleNetworkManagementProtocol)作為一種國際通用的網絡管理協議被廣泛的應用於對各種交換機,路 由器等網絡設備的管理上,而現在也越來越多被用於對服務器的監控上。通過SNMP方式對服務器監控其優點是比較通用服務器一旦部署SNMPAgent,任 何能實現SNMP協議的軟件都可對其進行監測,並且通過這種手段進行監測不需知道被監測服務器的用戶名與密碼,所以比較安全。其缺點是很多服務器並非默認 安裝SNMPAgent.如果要通過這種方式監測則需要對所有服務器安裝部署,另外其能監測的參數指標比較固定不夠深入,如用戶有特殊需求不好滿足(大部 分用戶沒有在其上進行二次開發的能力),還有由於SNMP協議是通過UDP方式實現的,在網絡狀況不佳的情況下其可靠性難以保證。

  Linux服務器監控技術2.SSH方式

  這種方式原理是一致的,都是軟件通過相應的客戶端協議登錄到服務器上執行命令,然后解析其結果來實現監測的。它的優點是一般服務器都會默認安裝 有相應的服務端軟件,所以監測起來比較方便也不需要額外安裝其它的軟件,但它需要獲知服務器相應的用戶名與密碼,這一點也是很多用戶不容易接受的,更何況 在實際環境中很多服務器的用戶名和密碼由於安全原因會經常改變,這就給監測軟件的工作帶來很大麻煩,尤其是被監測的服務器數量很多的情況下修改密碼將非常 不方便,還有它能監測的參數也受權限和命令所限,很多客戶關心的監測指標可能沒辦法獲取,此外它無限制的遠程控制能力同樣令用戶不安。

  Linux服務器監控技術3.安裝私有代理(客戶端)方式

  這種方式是指通過在被監測機上安裝輕量級的代理軟件來實現的一種監測方式,它的優點是監測指標深入細致有針對性,相比SNMP方式它幾乎能滿足 客戶任何的監測需要,並且由於它不需要知道被監測服務器的用戶名和密碼,所以安全性也很好。大部分私有代理采用的都是私有協議並以TCP方式實現,其可靠 性也很有保證。其缺點是:部署相對麻煩,最初需要逐個機器安裝代理軟件,不過一旦安裝完畢,以后如果又開發出新的監測功能,代理軟件一般能自動從服務器端 升級,這在很大程度上彌補了部署不便的問題。

  綜上所述,各種監測方式各有優缺點,在實際環境中需要根據實際情況使用,但從大的發展趨勢來看應主要以SNMP和私有代理的方式為主。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM