简介
SNMP(simple network management protocol ,简单网络管理协议)是网络管理程序(NMS)和代理程序(Agent)之间的通信协议。它规定了在网络环境中对设备进行管理的统一标准,包括管理框架、公共语言、安全和访问控制机制。
SNMP术语:
1、NMS:网络管理程序部署在管理端,通过在管理端安装相应的管理软件,实现通过网络收集被管理端的数据,并对数据做分析制表,展示给网络管理人员。
2、Agent:代理程序是运行在被管理端的一个进程,负责和NMS通信。
3、MIB:管理信息库包括了所有可能被查询的变量的集合。
4、OID:实时管理的数据信息。
SNMP的版本共三个,分别为SNMPv1、SNMPv2、SNMPv3,其中SNMPv1和SNMPv2有很多共同特征,如都使用community(共同体名)作为登录时的校验,SNMPv2在功能上得到了增强,增加了额外的协议操作。SNMPv3在先前版本的基础上增加了安全和远程配置能力,使用了比较复杂的用户名+密码的方式。简单来说:SNMPv1功能有限;SNMPv2部署简单,功能齐全;SNMPv3增强了安全性,但大规模部署是稍显麻烦。如果对安全性要求比较高,需要重点考虑部署v3版本。
接下来围绕SNMPv2来进行介绍:
NMS运行在管理端,通过它管理若干个设备;
Agent运行在被管理端。用于和NMS进行通信;
因此,简化的管理过程就演变成了管理程序和代理程序通信的过程,很多主流的厂商设备都支持SNMP,所以通过SNMP协议,可以管理所有支持SNMP协议的设备,如防火墙、Linux服务器、路由器、交换机、Windows服务器等。
SNMP的工作流程如下所示:
SNMP提出了community(共同体名)来提供管理程序和代理程序之间的认证,以提高SNMP工作的安全性。community要求管理设备和被管理设备双方指定,并且要求完全一致,否则无法正常通信,从而避免了非法的主机管理网络设备的行为,如下图所示:
在指定community的同时还可以附加属性,比较常用的属性有RO和RW。
RO代表read-only(只读),RW代表read-write(读写)。默认的community值有两个,分别是public和private,一般情况下,public附加RO属性,private附加RW属性。如果被管理设备指定community为public(RO),意味着管理端对该设备具有读取权限,没有写入权限,只能监控系统的运行状态;同理,如果指定为private(RW),管理端对该设备可读可写,既可以监控,又可以执行修改配置、改变接口状态等操作。
SNMP协议使用UDP的161和162通信,在正常情况下,NMS会周期性地向代理程序发起请求,请求一个或多个变量的取值,该请求的目标端口是161;在非常特殊的情况下,如设备严重故障,代理程序也会主动发出trap消息给NMS,此时,trap消息的目标端口是162:
trap消息,简单来说就是被管理设备主动发送消息给NMS的一种机制。当被管理设备出现严重的性能问题,甚至是接口down等问题时,Agent需要主动发送消息给NMS。假如发生此类事件时,如果不是由Agent主动通知NMS,那么NMS要等到轮询间隔才能对这一事件作出反应。
SNMP agent安装
Linux 下:
yum install net-snmp -y
vim /etc/snmp/snmpd.conf
com2sec notConfigUser default zwb
view systemview included .1
systemctl start snmpd
systemctl enable snmpd
配置文件讲解:
1 默认 SNMP 代理配置对 “public” 团体只给予从本地主机访问整个 MIB 树的只读访问权限。
注:出于安全性原因,建议在可能的情况下,将 SNMP 访问限制在特定的远程主机。
请编辑 SNMP 代理配置文件snmpd.conf :
rocommunity public 127.0.0.1
编辑或复制该行,以使用远程主机 IP 地址来替换 127.0.0.1。 编辑后,新行应为:
rocommunity public IP_address
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 配置您的系统以向管理站发送陷阱
Server Administrator 生成 SNMP 陷阱,以响应传感器状况的更改和其他受监测参数的更改。 您必须在运行 Server Administrator 的系统上为将要发送至管理站的 SNMP 陷阱配置一个或多个陷阱目标。
要将运行 Server Administrator 的系统配置为向管理站发送陷阱,请编辑 SNMP 代理配置文件snmpd.conf :
向文件添加以下命令行:
trapsink IP_address community_name
其中, IP_address 是 Management Station 的 IP 地址,community_name 是 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 从监控主机上得到了目标主机上内存使用状态的两个参数,其它脚本也是一样的。
Windows下:
snmp NMS 安装与示例取值
yum install net-snmp-utils.x86_64 -y
snmpwalk -v 2c -c zwb 10.0.0.13 .1.3.6.1.4.1.2021.11.11.0
snmpwalk -v 2c -c zwb 10.0.0.13
[root@zabbix-server templates]# snmpwalk -v 2c -c zwb 10.0.0.1 .1.3.6.1
SNMPv2-MIB::sysDescr.0 = STRING: Hardware: Intel64 Family 6 Model 142 Stepping 10 AT/AT COMPATIBLE - Software: Windows Version 6.3 (Build 17134 Multiprocessor Free)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (425307) 1:10:53.07
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: admin-PC
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 76
IF-MIB::ifNumber.0 = INTEGER: 47
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
......
snmpwalk 命令学习
命令格式:
snmpwalk <-v 1> <-c SNMP密码> <IP地址> <OID(对象标示符)>
–v:指定snmp的版本, 1或者2,该参数必须有。
–c:指定连接设备SNMP读密码,该参数必须有。
IP:指定要walk的设备的IP地址,该参数必须有。
OID:代表要获取设备的指标oid,该参数不是必须的。
主机常用OID: http://www.ttlsa.com/monitor/snmp-oid/
选项: 但是我们比较常用的就只有-v和-c参数
–h:显示帮助。
–v:指定snmp的版本, 1或者2c或者3。
–c:指定连接设备SNMP密码。
–V:显示当前snmpwalk命令行版本。
–r:指定重试次数,默认为0次。
–t:指定每次请求的等待超时时间,单为秒,默认为3秒。
–l:指定安全级别:noAuthNoPriv|authNoPriv|authPriv。
–a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。
–A:验证字符串。只有-l指定为authNoPriv或authPriv时才需要。
–x:加密协议:DES。只有-l指定为authPriv时才需要。
–X:加密字符串。只有-l指定为authPriv时才需要。
zabbix web页面监控agent
zabbix的web界面添加主机
添加主机,选择或创建一个主机群组,使用snmp接口
为添加的主机链接zabbix自带的Template SNMP OS Linux模板
填写主机的宏名称,这个名称就是在Linux上配置snmp服务的时候创建的社区名称
检验
主机添加完成后,等待一段时间等待变绿
同时也可以在最新数据中查看采集到的数据
到这里,zabbix通过snmp监控Linux主机就配置完成了
此外 还可以通过Nagios、Cacti 等软件监控
总结:
其实不管是使用SNMP协议的哪个版本的来采集数据,其本质上都是一样的,
都是Zabbix服务器端组件周期性的通过SNMP协议去查询SNMP协议agent进程,以获取被监控项目的监控数据。这种监控数据采集方法的原理很简单,Zabbix服务器端组件(或服务器代理端组件)根据用户针对不同监控项目所配置的OID值,定期的调用net-snmp软包(或ucd-snmp软件)提供的接口函,去查询被监控主机(或其代理)上MIB库中被监控项目的数据,从而采集到被监控项目的监控数据。
因此,通过SNMP协议采集监控数据的方法是一种被动监控方法,且使用这种方法采集监控数据在配置和日常管理也比较简单。只需要在被监控主机上开启并配置好SNMP服务,并针对Zabbix服务器开放查询权限后,我们在配置监控项目时指定好被监控项目的OID值,Zabbix服务器就会按照我们要求定时去监控主机上采集所需要的数据,不需要我们额外的编写数据采集程序或脚本。
或许您会说,我怎么知道我所需要监控的项目的OID值,以及如果我们所监控项目数量很多的时候,我们在Zabbix系统中配置时需要针对不同监控项目配置不同的OID值,这样我们日常管理的工作量不是非常大?您说的一点没有错,要想知道某个被监控项目具体的OID值,我们无非有几种方法。第一,是由设备的供应商给我们提供相关的技术文档,从这些技术文档中我们可以查出我们所要监控项目在MIB库中的OID值。第二种方法是,国际标准化组织已经定义好了通用的MIB库的结构。所以,对于一些通用项目的OID值,例如系统内存大小、CPU负载信息、设备网卡数量等等项目的OID值都是固定。这样,对于这类监控项目的OID值,我们有很多种方法可以获取得到,比如查阅相关的标准文件、通过互联网搜索等等。第三、其实当我们需要通过SNMP协议采集某些监控项目的监控数据时,我们也可以不需要知道这些监控项目具体的OID值。Zabbix系统我们提供了一种动态索引的方法来实现这类监控项目的监控数据的采集。关于Zabbix系统中如何使用SNMP协议的动态索引的方法采集监控数据,我们将后续章节中作进一步介绍和说明。
虽然SNMP trap 与SNMP查询一样,都是Zabbix服务器端(或服务器代理端)组件通过SNMP协议与被监控主机(或者其代理)通信,以完成监控数据的采集。但是,SNMP trap方法采集监控数据与通过SNMP协议查询的方法采集监控数据还是有很大的差别的。首先,SNMP查询方法采集监控数据是由Zabbix服务器端根据我们的配置周期性的连接到被监控主机或者其代理的SNMP服务上的,然后查询监控项目所需要的数据,属于一种被动监控模式。而SNMP trap方法采集监控数据则不同,它是当被监控主机发生某种事件时,由其(或者被监控主动代理)主动地将所发生的事件信息发送给Zabbix服务器端(或者其服务器代理端)组件,由Zabbix系统进分析并获取监控数据的一种监控数据采集方式,它是一种主动的监控模式。
另外,通过SNMP查询方式采集监控数据的监控项目,其关键字(何为监控项目的关键字,我们将在后续章节再做详细介绍)可以由我们自由定义,只需要我们所定义的关键字符合Zabbix系统对监控项目的关键字的要求和规则即可,但是通过SNMP trap方式采集数据的监控项目则不同,它们的关键字具有固定的形式,这个形式是由Zabbix系统内部预定义好的,我们只能使用这种关键形式,最多只能修改关键字的参数。以下表2-3即为通过SNMP陷入方式采集数据的监控项目的关键列表。
表2-3 通过SNMP trap 方式采集数据的监控项目关键字列表
关键字 | 描 述 | 备注 |
snmptrap[regex] | 该关键字的作用是从相应监控接口所接收到的陷入信息中匹配出SNMP陷入信息。期中regex为所需要匹配的关键字,当Zabbix系统中从所接收到的陷入信息中匹配这个数所指定的关键字,则表示系统接收到了指定项目所配置的陷入数据。 | 从前面我们所描述的通过SNMP陷入的方式采集监控数据的流程中我们可以看出,当Zabbix服务器上所运行的snmpd服务接收到了来自被监控主机(或者是其代理)所发送的陷入信息后,会将SNMP陷入信息发给snmptt进程,由其进行格式化,以便Zabbix服务端组件能够识别出这条陷入信息,格式化后的陷入信息存放在/etc/snmp/snmptt.ini配置文件中log_file配置项所指定的日志文件里,zabbix服务器端组件会定时去读取这个日志文件,然后根据每条陷入信息的内容,用监控项目关键字中regex参数所指定的内容去匹配,如果匹配到了,则表示对应的监控项目接收到来自被监控主机的一条陷入信息。 |
snmptrap.fallback | 这个关键字所对应的监控项目可能有一点不太好理解。在前一个关键字中我们已经说过,Zabbix服务器会定时的用regex参数指定的内容去逐条匹配所接收到的SNMP陷入信息,当匹配到了,则就将对应的监控项目的数据更新为所接收到陷入信息的时间截。当某台被监控主机上所有SNMP陷入类的监控项目所指定的关键字都没有匹配上所接收到的陷入信息时,而且这台被监控主机上也配置了关键字为snmptrap.fallback的监控项目,这个时候系统就将这条陷入信息的内容更新到这个监控项目上。 | 需要注意的是,这里所说的系统接收到的陷入信息没有匹配上,是指这类陷入信息在Zabbix系统没有配置相对应的监控项目与之对应。但是,在/etc/snmp/snmptt.conf配置文件中还是得有这类陷入信息格式化配置的,否则Zabbix系统将因为无法识出陷入信息,而抱怨接收到了一条非法的陷入信息。因此,就不会更新关键字为snmptrap.fallback监控项目的采集数据了。对于这种我们未知的陷入信息,则我们也可以通过在snmptt.conf配置文件里添加上: EVENT general .* “General event” Normal FORMAT ZBXTRAP $aA Unknow trap Message 内容,以便对这类陷入信息进行格式化,从而让Zabbix服务器能够进行识别和处理。在snmptt.conf文件里添加上上面这两行内容后,则系统将会将这类陷入信息的内容统一更新到关键字是snmptrap.fallbacku的监控项目上。 |