背景信息
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
在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的真正好处在于对象类型的描述。以下是一个整形键值的例子:
- upsBasicOutputStatus OBJECT-TYPE
- SYNTAX INTEGER {
- ........
- ::= { 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和私有代理的方式为主。