热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【老张监控技术】Zabbix监控设备SNMPTrap消息

张世宏Zabbix社区专家Cacti集成版本Cactifans制作者,2013年开始使用

张世宏

Zabbix社区专家



Cacti集成版本Cactifans制作者,2013年开始使用Zabbix,2014-2016年负责Zabbix的二次开发及公司监控产品架构设计,目前任烽火科技应用软件部运维总监,从事PaaS平台的开发和运维工作,精通Zabbix/Cacti/Prometheus/Open-falcon等开源监控软件及解决方案,开源软件爱好者。

一.SNMP协议

1.协议介绍

snmp协议是日常使用的较多的一种协议,绝大多数网络设备/存储等都支持snmp协议,通过此协议可以实现设备状态的监控及管理。

2.主要组成

SNMP协议包括以下三个部分

SNMP Agent负责处理snmp请求,主要包括get,set等操作。可通过此接口查询设备的运行状态(使用较多),或者变更配置(使用较少),默认使用UDP 161端口
SNMP Trapsnmp通知消息,主动发送消息到管理端。如设备故障,端口down等都会实时发送消息到接收端。默认使用UDP 162端口
SNMP MIBMIB代表管理信息库,是按层次结构组织的信息的集合,定义了设备内被管理对象的属性。

3.基本操作

经常使用的终端命令有以下几个:
snmpwalk遍历整个snmp mib树,通常用来检测snmp是否配置成功,一般完整walk到一个MIB,在MIB末尾,都会输出“End Of Mib”的字样。否则可能为Response timeout等错误,以此来判断snmp agent是否配置成功。
snmpget获取某个oid的具体数值,通常用来检测oid是否正确。
遇到很多使用snmpwalk来获取oid数据的,这是错误的用法,这样是不能测试oid的正确性。只有通过snmpget+oid能获取的数据的oid,才能配置成独立的监控项,作为监控指标采集数据。
使用zabbix监控snmp设备状态,一般按照以下步骤进行操作:

  1. 通过snmpwalk确定snmp agent配置是否正确

  2. 通过snmpget获取具体的某个oid的数据,记录oid

  3. 在zabbix上建立对应的item,interface选择设备snmp接口,Key


    可随意,SNMP OID输入oid,SNMP community输入snmp community


    Type of information选择对应类型即可。

二.SNMPTrap监控

1.SNMPTT介绍

SNMPTT (SNMP Trap Translator) 是一个perl语言编写的用来处理snmptrap消息的程序,可与Net-SNMP UCD-SNMP snmptrapd程序(www.net-snmp.org)一起使用,基本流程如下

snmptt负责处理net-snmp接收到的trap消息,通过snmptt命令或snmptthandler进行处理,解析消息之后可将消息写入文件或数据库。

2.安装SNMPTT

操作系统为centos  7.7 1908 x64,使用yum方式安装snmptt,snmptt不在默认的官方源,属于epel源,因此需要首先安装epel源。
添加epel源

yum install epel-release -y

安装snmptt及相关组件

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

即可完成安装。

3.转换MIB文件

snmp trap消息如果不翻译,原始内容可能是这样的

{
"Version": 2,
"TrapType": 0,
"OID": null,
"Other": null,
"Community": "public",
"Username": "",
"Address": "172.16.1.64:49692",
"VarBinds": {
".1.3.6.1.2.1.1.3.0": 7908527690000000,
".1.3.6.1.2.1.2.2.1.1.18": 18,
".1.3.6.1.2.1.2.2.1.2.18": "Vlanif103",
".1.3.6.1.2.1.2.2.1.7.18": 2,
".1.3.6.1.2.1.2.2.1.8.18": 2,
".1.3.6.1.6.3.1.1.4.1.0": [1, 3, 6, 1, 6, 3, 1, 1, 5, 3] }
,
"VarBindOIDs": [ ".1.3.6.1.2.1.1.3.0",
".1.3.6.1.6.3.1.1.4.1.0",
".1.3.6.1.2.1.2.2.1.1.18", ".1.3.6.1.2.1.2.2.1.7.18", ".1.3.6.1.2.1.2.2.1.8.18",
".1.3.6.1.2.1.2.2.1.2.18"
]
}

如果需要知道上述oid的具体内容及数值意义就需要对照MIB文件对消息进行“翻译”。snmptt需要加载对应配置文件,对trap消息进行翻译。
snmptt提供了snmpttconvertmib工具,snmpttconvertmib是一个Perl脚本,它将读取MIB文件并将TRAP-TYPE(v1)或NOTIFICATIONATION-TYPE(v2)定义转换为SNMPTT可读的配置文件,从而实现对trap消息的翻译,基本命令如下:

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/CPQHOST.mib --out=/etc/snmp/snmptt.conf.compaq --net_snmp_perl

  • /usr/share/snmp/mibs/ 为centos7 默认的 mibs文件路径,上传设备mib文件到此目录。

  • /etc/snmp/snmptt.cong.compaq 转换完输出的配置文件

由于一般情况设备mib可能有多个,建议转换为一个配置文件中,便于管理,可使用以下命令进行批量转换。

for i in HUAWEI*do/usr/bin/snmpttconvertmib --in=$i --out=/etc/snmp/snmptt.conf.huawei --net_snmp_perldone

以HUAWEI开头的mib文件都转换为snmptt.conf.huawei,基本都是一些私有的MIB。snmptt自带的snmptt.conf配置文件里已经包括了一些常用的配置如端口up/down。实际过程中,只转换需要关注的MIB文件即可。
这里以配置华为USG 6320登录trap告警为例,从华为官网下载MIB文件,并上传到系统/usr/share/snmp/mibs目录下,从MIB说明文件得知,用户登录MIB文件属于HUAWEI-SECURITY-LOGIN-MIB.mib文件,对mib文件进行转换

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/HUAWEI-SECURITY-LOGIN-MIB.mib --out=/etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN --net_snmp_perl

输入如下

表示转换成功,已经生成snmptt.conf.HUAWEI-SECURITY-LOGIN,这里转换出来的为标准的文件,不符合zabbix snmptrap 文件格式,因此还需要执行以下命令对配置文件进行稍加修改。

sed -i 's/FORMAT/FORMAT ZBXTRAP $aA/g' etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN

其实就是添加一个ZBXTRAP字符。很多文档遗漏此项,导致后续配置后zabbix server日志出现以下错误:

28391:20190923:150150.572 invalid trap data found "2019/09/23 15:01:49 .1.3.6.1.6.3.1.1.5.4 Normal "Status Events" 172.16.1.64 - Link up on interface 18. Admin state: up. Operational state: up
2019/09/23 15:01:49 .1.3.6.1.6.3.1.1.5.4 Normal "
Status Events" 172.16.1.64 - A linkUp trap signifies that the SNMPv2 entity, 18 up up Vlanif103

无法识别trap文件格式。

4.配置snmptt

snmptt配置文件有2个

  • /etc/snmp/snmptt.ini snmptt主要配置文件

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


    修改默认的snmptt.ini 配置文件,主要修改一下几个地方

    mode = standalone
    multiple_event = 0
    net_snmp_perl_enable = 1
    translate_log_trap_oid = 1
    date_time_format = %Y/%m/%d %H:%M:%S
    syslog_enable = 0

    在这里需要加载刚才转换完成的snmptt.conf.HUAWEI-SECURITY-LOGIN配置文件


    在snmptt.ini文件末尾如下添加snmptt.conf.HUAWEI-SECURITY-LOGIN

    [TrapFiles]
    # A list of snmptt.conf files (this is NOT the snmptrapd.conf file). The COMPLETE path
    # and filename. Ex: '/etc/snmp/snmptt.conf'
    snmptt_conf_files = </etc/snmp/snmptt.conf
    /etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN
    END

    snmptt有二种模式,分别为

  • standalone 每次收到trap消息时读取snmptt.ini配置文件调用snmptthandler来处理trap消息

  • daemon 顾名思义守护进程方式,启动snmptrap时,初始化时一次性读取snmptt.ini


    二种方式各有区别,选择使用即可,具体区别可查看官方说明snmptt mode

由于这里测试使用,经常修改snmptt.ini配置文件,如果使用daemon模式,那么每次修改snmptt.ini配置文件就需要重启snmptt,因此这里我使用standalone模式。

5.配置snmptrap

snmp trap消息为主动通知,因此需要配置服务器来接收设备发送过来的 snmp trap消息。net snmp接收trap消息后,通过traphandle调用snmptt来对trap消息进行处理。
安装net snmp,建议安装net-snmp的所有关联包

yum install net-snmp* -y

即可完成snmp安装。
修改/etc/sysconfig/snmptrapd  为以下内容

OPTIOnS="-m +ALL -On"

修改/etc/snmp/snmptrapd.conf 配置文件,添加如下

authCommunity execute public
traphandle default usr/sbin/snmptt

authCommunity可以配置多个
启动snmptrap服务

systemctl start snmptrapd
systemctl enable snmptrapd

在usg 6320上配置trap消息,并指向snmp trap server,配置Community为public

配置之后,通过web登录USG和退出USG,都会收到trap消息。snmptt日志文件为/var/log/snmptt/snmptt.log 即可看到

表示配置处理trap成功,原始内容都为变量内容,不太友好,
可以通过调整snmptt.conf.HUAWEI-SECURITY-LOGIN,配置trap消息输出格式。
snmptt.conf.HUAWEI-SECURITY-LOGIN配置文件内容大致如下

...
EVENT hwSecLOGINSucced .1.3.6.1.4.1.2011.6.122.62.2.1 "Status Events" Normal
FORMAT ZBXTRAP $aA $*
SDESC

The user login succeeded.
Variables:
1: hwSecLOGINUser
Syntax="OCTETSTR"
Descr="The user name."
2: hwSecLOGINIP
Syntax="OCTETSTR"
Descr="The User IP address."
3: hwSecLOGINTime
Syntax="OCTETSTR"
Descr="The User login time."
4: hwSecLOGINType
Syntax="OCTETSTR"
Descr="The User access type."
5: hwSecLOGINLevel
Syntax="INTEGER32"
Descr="The User login level."
EDESC
......

其中 FROMAT就是需要修改定义的,其中包括很多变量,具体可在SNMPTT.CONF-FORMAT 常用的几个如下:

  • $aA  snmp trap的代理IP,即源IP

  • $* 所有变量

  • $n  n为数字,表示变量次序


    Variables 为trap变量,基本可以看懂

  • hwSecLOGINUser 登录用户名

  • hwSecLOGINIP 登录IP

  • hwSecLOGINTime 登录时间

  • hwSecLOGINType 登录类型

  • hwSecLOGINLevel 登录级别


    按照变量,可以对trap消息进行定制化,还支持中文!

    将FORMAT一行修改为

    FORMAT ZBXTRAP $aA User login succeed!userName = $1, loginIP = $2, loginTime = $3, accessType = $4, userLevel = $5

    修改后,登录USG,查看snmptt.log日志,日志已经被格式成需要的格式,已经可以看懂了!

    2019/09/27 15:08:49 hwSecLOGINSucced Normal "Status Events" 172.16.1.64 - ZBXTRAP 172.16.1.64 User login succeed!userName = admin, loginIP = 10.128.23.19, loginTime = 2019/09/27 16:54:08, accessType = web, userLevel = 15

    至此完成了snmp trap消息的接收及翻译工作。

三.配置Zabbix

1.zabbix安装注意事项

zabbix 可以配置读取接收到的trap文件,从而实现对对trap消息的告警,如果zabbix是编译安装,系统需要安装net-snmp-devel包,编译时需要添加以下参数

–with-net-snmp

2.修改zabbix server配置文件

修改zabbix server配置文件

SNMPTrapperFile=/var/log/snmptt/snmptt.log
StartSNMPTrapper=1

制定trap文件为snmptt日志文件,并开启strap 处理的poller,修改之后重启zabbix server。

3.配置snmptrap item

添加一个主机

SNMP interfaces添加机器Ip,添加之后创建item

  • Type 为SNMP trap

  • snmptrap为zabbix内置的key,用来获取trap文件内容

  • Type of information 选择log

  • Log time format 和snmptt配置一致,配置为yyyy/MM/dd hh:mm:ss


    直接配置Key为snmptrap,表示获取snmptt日志里的所有消息。

    配置之后登录设备,退出设备,可在Last data看到数据已经采集。

    (此截图为为进行翻译之前截取,翻译之后可显示中文,英文)


4.配置Trigger

目前已经采集了trap日志,需要配置对应的trigger对trap消息进行告警。以usg设备登录错误为例,登录错误时间类型为:hwSecLOGINFailed,因此配置如下trigger

配置之后,用错误的用户登录USG,发现已经告警了。

由于zabbix配置了微信告警,微信上可以看到如下消息:

告警内容有点模糊,同样修改下snmptt.conf.HUAWEI-SECURITY-LOGIN,将登录失败的内容修改为容易理解的中文,即修改FORMAT为中文

EVENT hwSecLOGINFailed .1.3.6.1.4.1.2011.6.122.62.2.2 "Status Events" Normal
FORMAT ZBXTRAP $aA 用户登录设备失败!用户名 = $1,登录ip = $2, 登录时间 = $3, 接入类型 = $4, 用户级别 = $5SDESC

The user login failed.
Variables: 1: hwSecLOGINUser
Syntax="OCTETSTR"
Descr="The user name."
2: hwSecLOGINIP
Syntax="OCTETSTR"
Descr="The User IP address."
3: hwSecLOGINTime
Syntax="OCTETSTR"
Descr="The User login time."
4: hwSecLOGINType
Syntax="OCTETSTR"
Descr="The User access type."EDESC

配置后告警内容

5分钟后故障自动恢复,至此配置完成。

5.一般用法

以上只是简单测试,生产环境中应该注意以下事项

  • 分析需要告警的trap event 类型


    如:hwSecLOGINFailed/warmStart/linkDown/coldStart/authenticationFailure 根据类型,配置对应的triger即可

  • 可直接配置对应的key来采集对应的指标,只要收到消息就告警。

    如下图配置只采集hwSecLOGINSucced的指标。



    配置对应的trigger,进行告警


  • 如只配置了采集对应的item,而没有配置snmptrapkey,建议配置一个snmptrap.fallback的item,配有匹配的item消息,都会保存到此item里

  • 更多配置及用法参考zabbix 官网配置zabbix trap

四.注意事项

1.MIB文件

一定要确保MIb文件的准确性,设备版本与MIB文件版本必须一致,包括大小版本。如不一致会看到解析文件出现类似似错误

2019/09/27 08:34:23 .1.3.6.1.4.1.2011.6.122.62.2.2 Normal "Status Events" 172.16.1.64 - the user 123 login with web on 10.128.23.19 in 2019/09/27 08:34:22 by time on 2019/09/27 08:34:22 ,status is Wrong Type (should be OCTET STRING): 0

说明mib文件里定义的trap变量类型和实际收到的trap消息变量类型不一致,解析错误。

2.zabbix配置

建议对同一类型设备配置统一的snmp trap模版,相同型号直接关联模版即可使用。

3.snmptt日志

随之snmp trap消息的增多,snmptt会逐渐变大,建议配置logrotate对日志进行切分,使用yum安装的snmptt已经自动配置了,使用编译安装的,可以参考
/etc/logrotate.d/snmptt

/var/log/snmptt/snmptt*.log var/log/snmptt/snm ptthandler.debug {
weekly
notifempty
missingok
}
/var/log/snmptt/snmptt.debug {
weekly
notifempty
missingok
postrotate
etc/init.d/snmptt reload >/dev/null 2>/dev/null || true
endscript
}

snmptt可开启debug日志,建议在测试阶段开启debug日志,以便进行排错。

以上为snmp trap告警的全面解读,下期预告:《基于Web方式的snmp trap管理》敬请关注!

参考文档
1.http://snmptt.sourceforge.net/docs/snmptt.shtml
2.https://www.miraclelinux.com/product-service/zabbix/tech-lounge/zbx-tl-001

在线课程

Zabbix整合Grafana

给你不一样的视觉体验


此次课程以Zabbix和Grafana介绍开始,深入探讨如何利用Zabbix+Grafana实现可视化。此外,通过API/SQL怎样实现优雅大方的图表和布局展示,并且使用前端代码满足你美观的视觉体验也将是此次课程的亮点之一。

讲师:王会新,Zabbix社区专家





立即报名

一键关注

关注公众号

加入社区群

Zabbix社区,因你而更美好










推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
author-avatar
up61
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有