SNMP协议

介绍

简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。 虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

组成

zabbix--SNMP 硬件设备监控_zabbix-

SNMP Agent:负责处理snmp请求,主要包括get、set等操作。可通过此接口查询设备的运行状态(使用较多),或者变更配置(使用较少),默认使用UDP 161端口;

SNMP Trap:snmp通知消息,主动发送消息到管理端。如设备故障,端口down等都会实时发送消息到接收端。默认使用UDP 162端口;

SNMP MIB:MIB代表管理信息库,是按层次结构组织的信息的集合,定义了设备内被管理对象的属性。

方式一 SNMP Oid

说明

通过snmp oid的方式进行硬件设备的状态监控。其所使用的为snmp agent get的方式去获取硬件设备的状态,所使用端口默认为161端口。部署流程如下:

1、部署zabbix时需要开启snmp模块,rpm包默认开启,如果是源码包部署则需要加上--with-net-snmp参数;

2、找到对应硬件设备的oid文档(各个厂商的不一样,且各个厂商的不同机型的不一样,甚至同一机型的不同hdm版本也会存在oid不一致的情况);

3、首先被监控的硬件设备上开启snmp服务,设定所使用的snmp协议(目前广泛使用的是2c),设定团体字;

4、配置安全策略,允许zabbix server或者proxy访问被监控设备的161端口;

5、zabbix server或者proxy上安装snmp服务工具(如net-snmp工具),进行测试对应oid是否可以正常获取数据;

6、zabbix上主机添加,oid监控项添加、触发器添加等(这里一般设置为对应设备的模板)。

示例

这里以监控硬件服务器(浪潮SA5212M5)示例

配置团体字

登陆需要被监控的硬件服务器的带外,配置snmp团体字。

zabbix--SNMP 硬件设备监控_配置文件_02

测试连通性

zabbix server或者proxy安装测试工具测试是否可以获取数据,这里使用snmpwalk进行测试,软件包名:net-snmp-utils

官网下载地址:http://www.net-snmp.org/download.html

可以直接通过yum进行安装,也可以通过官网下载进行安装。

1、添加epel源

# yum install epel-release -y

2、安装net-snmp-utils

# yum install net-snmp-utils -y

3、根据获取到的oid进行测试是否可以获取到数据,比如这里获取机器的开关机状态

# snmpwalk -v 2c -c Tencent@22 10.55.128.1 1.3.6.1.4.1.37945.2.1.2.13.1.1.1
SNMPv2-SMI::enterprises.37945.2.1.2.13.1.1.1.0 = STRING: "Power On"

snmpwalk命令格式及参数说明:

snmpwalk -v snmp协议版本 -c 团体字名 目标IP地址 OID号
注意:如果指定具体OID号,则获取所有OID信息

zabbix添加主机

添加主机 【配置】——>【主机】——>【创建主机】

zabbix--SNMP 硬件设备监控_perl_03

设置相关信息(所属主机组、interface等,然后点击添加)

zabbix--SNMP 硬件设备监控_zabbix-_04

创建监控项

创建监控项【配置】——>【主机】——>(找到上面创建的主机点击进入)——>【监控项】——>【创建监控项】

zabbix--SNMP 硬件设备监控_服务器_05

zabbix--SNMP 硬件设备监控_perl_06

验证最新数据(查看最新获取的数据是否为想要的信息及是否能正常拿到数据)【监测】——>【最新数据】

zabbix--SNMP 硬件设备监控_配置文件_07

创建触发器

创建触发器【配置】——>【主机】——>(找到上面创建的主机点击进入)——>【触发器】——>【创建触发器】

zabbix--SNMP 硬件设备监控_Zabbix_08

zabbix--SNMP 硬件设备监控_配置文件_09

zabbix--SNMP 硬件设备监控_zabbix-_10

添加结果如下图所示:

zabbix--SNMP 硬件设备监控_perl_11

到此,基于一个snmp oid的监控项即配置完成。

模板制作

一般生产环境下,如果采用snmp agent的方式对硬件设备的监控,都会对一个厂商的对应设备所关注的oid监控值创建一个模板(避免成百上千的机器添加还需要一个一个去配置监控项等),然后再通过zabbix提供的API接口进行批量主机的添加并绑定该模板。

如下:Template Module Inspur SERVER-NAME SA5212M5 SNMP模板,对浪潮SA5212M5机型制作的模板,包含了11个监控项、以及16个自动发现规则。用于对服务器硬件(CPU、内存、磁盘、风扇、电源、控制器、Raid)等状态进行了监控。

zabbix--SNMP 硬件设备监控_Zabbix_12

告警信息展示:

zabbix--SNMP 硬件设备监控_Zabbix_13

总结

基于snmp agent oid方式进行硬件设备的监控,有以下几个优缺点:

优点:

​ 1、监控数据信息全面,可以获取到很多控制器的状态、温度、服务器基本信息等指标。

​ 2、可以根据获取到的指标绘制对应可视化大盘等。及时了解硬件组件的各个状态。

缺点:

​ 介于国内各厂商的oid不统一(甚至各厂商的不同型号的服务器oid、同一型号服务器不同hdm版本oid也不统一)的情况下,如果一个项目采用了不同厂商不同型号的硬件设备,则需要去配置不同的监控模板(配置一个模板,需要对对应oid文档每个去核对其值以及数据类型),这样工作量就会变得巨大。

方式二 SNMP Trap

说明

通过snmp trap的方式进行硬件设备的状态监控。其本质并不是去获取硬件设备指标的详细数据,而是通过接收硬件设备自带的snmp trap告警机制接收硬件设备发出的异常告警通知,再交由zabbix进行处理并发送出来。如果有邮件服务器且不需要使用zabbix,而是直接使用邮件服务器发出告警信息进行通知。

Zabbix中接收SNMP trap旨在使用snmptrapd和内置机制之一来传递trapZabbix - 一个perl脚本或SNMPTT

这里以zabbix trap方式接收trap的工作流程作一说明:

  1. snmptrapd 收到trap
  2. snmptrapdtrap传递给SNMPTT或调用Perl trap接收器
  3. SNMPTTPerl trap接收器解析,格式化并将trap写入文件
  4. Zabbix SNMP trap读取并解析trap文件
  5. 对于每个trap,Zabbix发现主机接口与接收的trap地址匹配的所有“SNMP trap”监控项。请注意,在匹配期间只使用主机接口中选定的“IP”“DNS”
  6. 对于每个找到的监控项,将trap“snmptrap[regexp]”中的regexp进行比较。 trap设置为all匹配项的值。如果没有找到匹配的监控项,并且有一个“snmptrap.fallback”监控项,则将trap设置为该监控项的值。
  7. 如果trap未设置为任何监控项的值,Zabbix默认记录未匹配的trap。(通过管理 → 常规 → 其它中的“记录未匹配的SNMP trap(Log unmatched SNMP traps)”进行配置。)

配置流程如下:

1、部署zabbix时需要开启snmp模块,rpm包默认开启,如果是源码包部署则需要加上--with-net-snmp参数;

2、找到对应硬件设备的mib库文件(各个厂商的不一样,且各个厂商的不同机型的不一样);

3、zabbix server或者proxy部署snmpttsnmptrap

4、转换mib文件;

5、被监控设备上配置snmp trap接收地址;

6、zabbix server或者proxy读取接收trap文件并创建主机及创建接收监控项;

7、根据监控项配置告警策略。

示例

这里以监控硬件服务器(浪潮NF8260M5)为例

安装snmptt

1、添加epel源

# yum install epel-release -y

2、安装snmptt及相关软件

# yum install snmptt perl-Sys-Syslog perl-DBD-MySQL -y

转换MIB文件

snmptt提供了snmpttconvertmib工具,snmpttconvertmib是一个Perl脚本,它将读取MIB文件并将TRAP-TYPE(v1)NOTIFICATIONATION-TYPE(v2)定义转换为SNMPTT可读的配置文件,从而实现对trap消息的翻译。

1、上传对应硬件设备的mib库到服务器,并放置到/usr/share/snmp/mibs/目录(centos7默认的mibs文件路径,放置此处方便统一管理)

# cp inspurAlert_v2.3_20190520.mib /usr/share/snmp/mibs/

2、进行转换

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/inspurAlert_v2.3_20190520.mib --out=/etc/snmp/snmptt.conf.inspur --net_snmp_perl
  • --in:表示mib源文件
  • --out:表示输出文件的地址

输出结果如下所示,表示转换成功:

zabbix--SNMP 硬件设备监控_配置文件_14

3、转换文件的修改,由于这里转换出来的为标准文件,不符合zabbix snmptrap文件格式,因此还需要执行以下命令对配置文件进行稍加修改。

# ll /etc/snmp/snmptt.conf.inspur 
-rw-r--r-- 1 root root 1234142 Mar 21 12:18 /etc/snmp/snmptt.conf.inspur

# sed -i 's/FORMAT/FORMAT ZBXTRAP $aA/g' /etc/snmp/snmptt.conf.inspur

其实就是添加一个ZBXTRAP字符,否则会导致后续配置时候zabbix server日志出现如下错误

25926:20220322:172836.320 invalid trap data found "Tue Mar 22 17:28:34 2022 inspurServerTRAPObject Normal "Status Events" UNKNOWN -  2022-03-22 09:18:39 Inspur NF8260M5 SNMPTrap_test Platform Alert 0.00 0.00 0.00 0.00 0.00 0.00 0.00     Information 219636054 Info SNMPTrap Test Event

补充说明

由于某些设备的mib可能有多个,建议转换为一个配置文件中,便于管理,这样可以使用下面的批量命令进行转换

for i in inspurAlert* do /usr/bin/snmpttconvertmib --in=$i --out=/etc/snmp/snmptt.conf.inspur --net_snmp_perl; done

配置snmptt

snmptt配置文件有2个:

  • /etc/snmp/snmptt.ini:snmptt主配置文件
  • /etc/snmp/snmptt.conf:系统默认的策略文件,包括一些基本的端口up/down的配置

修改snmptt.ini添加上面生成的/etc/snmp/snmptt.conf.inspur

# vim /etc/snmp/snmptt.ini
mode = standalone
net_snmp_perl_enable = 1
date_time_format = %Y/%m/%d %H:%M:%S
translate_log_trap_oid = 2		# 0:数字形式显示OID,1:显示OID名称,2:显示OID所属模块名及其名称 
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt.conf.inspur
END

安装snmptrap

该软件包同样在epel源中有。

# yum install -y net-snmp net-snmp-utils net-snmp-perl net-snmp-libs net-snmp-agent-libs net-snmp-devel

配置snmptrap

Snmp trap 消息为主动通知,因此需要配置服务器来接收设备发送过来的 snmp trap 消息。net snmp接收trap消息后,通过traphandle调用snmptt来对trap消息进行处理。

1、修改/etc/sysconfig/snmptrapd文件

# vim /etc/sysconfig/snmptrapd 

OPTIONS="-m +ALL -On"

2、修改/etc/snmp/snmptrapd.conf配置文件(authCommunity可以配置多个)

# vim /etc/snmp/snmptrapd.conf
authCommunity execute public
traphandle default /usr/sbin/snmptt

3、启动snmptrap服务并加入开机启动

# systemctl enable snmptrapd --now

4、验证状态

# systemctl status snmptrapd 
● snmptrapd.service - Simple Network Management Protocol (SNMP) Trap Daemon.
   Loaded: loaded (/usr/lib/systemd/system/snmptrapd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-03-22 16:17:04 CST; 2s ago
 Main PID: 7158 (snmptrapd)
   CGroup: /system.slice/snmptrapd.service
           └─7158 /usr/sbin/snmptrapd -m +ALL -On -f

Mar 22 16:17:04 zabbix-server systemd[1]: Starting Simple Network Management Protocol (SNMP) Trap Daemon....
Mar 22 16:17:04 zabbix-server snmptrapd[7158]: NET-SNMP version 5.7.2
Mar 22 16:17:04 zabbix-server systemd[1]: Started Simple Network Management Protocol (SNMP) Trap Daemon..

被监控设备配置trap

1、通过登陆带外,配置snmp trap
zabbix--SNMP 硬件设备监控_perl_15

zabbix--SNMP 硬件设备监控_perl_16

2、观察snmptt日志,验证是否可以接收到消息

zabbix--SNMP 硬件设备监控_zabbix-_17

Zabbix配置

修改zabbix server配置文件或者proxy配置文件,开启snmptrapper处理

1、配置文件修改

# vim /etc/zabbix/zabbix_server.conf
SNMPTrapperFile=/var/log/snmptt/snmptt.log
StartSNMPTrapper=1

2、重启zabbix server

 # systemctl restart zabbix-server

配置snmptrap item

在zabbix上添加一个主机

1、添加主机

zabbix--SNMP 硬件设备监控_perl_18

2、添加监控项,找到上面创建的主机,点击进去,创建一个监控项

zabbix--SNMP 硬件设备监控_perl_19

3、验证是否zabbix是否收到信息(在被监控设备上发出测试告警信息)

zabbix--SNMP 硬件设备监控_Zabbix_20

配置触发器

说明:这里名称采用了zabbix的宏变量及使用了正则对告警信息中的内容进行提取。

问题表现形式:通过在最新的数据中(字符串)查找Critical,如果找到了则进行告警信息发生。

恢复表达式:通过在最新的数据中(字符串)查找Recovery,如果找到了则表示该告警恢复。

zabbix--SNMP 硬件设备监控_服务器_21

告警信息展示:

zabbix--SNMP 硬件设备监控_配置文件_22

总结

基于snmp trap方式进行硬件设备的监控,有以下几个优缺点:

优点:

​ 1、配置相对简单,只需配置一个监控项,但是触发器需要配置n个,需要不断优化,去根据告警信息去进行正则匹配。

缺点:

​ 无法实时了解硬件设备运行状态,如温度、电压等,无法绘制可视化大盘。

人生是条无名的河,是浅是深都要过; 人生是杯无色的茶,是苦是甜都要喝; 人生是首无畏的歌,是高是低都要唱。