3 SNMP 陷阱

概述

接收 SNMP 陷阱与查询启用 SNMP 的设备相反。

在这种情况下,信息是从支持 SNMP 的设备发送的,并且是被 Zabbix 收集或“捕获”。

通常,在某些条件更改时会发送陷阱,并且客户端的 162端口 连接到服务器(与用于查询客户端的端口 161 不同)。使用陷阱可能会检测到在查询间隔中发生的一些短期问题,并且可能会遗漏查询数据。

在 Zabbix 中接收 SNMP 陷阱要与 snmptrapd 一起使用,以及将snmp陷阱传递给 Zabbix 的内置机制Perl 脚本或 SNMPTT之一 。

接收陷阱的工作流程:

  1. snmptrapd 收到陷阱
  2. snmptrapd 将陷阱传递给 SNMPTT 或调用 Perl 陷阱接收器
  3. SNMPTT 或 Perl 陷阱接收器解析、格式化并将陷阱写入到一份文件
  4. Zabbix SNMP trapper读取并解析trap文件
  5. 对于每个陷阱,Zabbix 找到所有带有主机的“SNMP 陷阱”项与接收到的陷阱地址匹配的接口。请注意,只有在主机接口中选择的“IP”或“DNS”在使用期间匹配。
  6. 对于每个找到的项目,将陷阱与 regexp 进行比较 “snmptrap[正则表达式]”。陷阱设置为 all 的值 匹配的监控项。如果没有找到匹配的项目并且有“snmptrap.fallback”项,陷阱设置为那个值。
  7. 如果trap没有设置为任何监控项的值,Zabbix默认 记录不匹配的陷阱。 (这是由“记录不匹配的 SNMP陷阱”在管理 → 常规 → 其它中。)

1 配置 SNMP 陷阱

在前端配置以下字段是特定于该监控项类型:

  • 您的主机必须有 SNMP 接口

Configuration → Hosts 中,在 Host interface 字段中填入正确的 IP 或 DNS 地址设置 SNMP 接口。将每个接收到的陷阱的地址与所有 SNMP 接口的 IP 和 DNS 地址进行比较,以找到相应的主机。

  • 配置监控项

Key 字段中,使用 SNMP 陷阱key之一:

key
描述返回值评论
snmptrap[正则表达式]
捕获与 regexp 中指定的 正则表达式 匹配的所有 SNMP 陷阱。如果未指定 regexp,则捕获任何陷阱。SNMP 陷阱此项只能为 SNMP 接口设置。
自 Zabbix 2.0.0 起支持此项。
注意:从 Zabbix 开始2.0.5,此项key的参数中支持用户宏和全局正则表达式。
snmptrap.fallback
捕获该接口的任何 snmptrap[] 项未捕获的所有 SNMP 陷阱。SNMP 陷阱只能为 SNMP 接口设置此项目。
自 Zabbix 2.0.0 起支持此项目。

此处不支持多行正则表达式匹配。

Type of information 设置为 ‘Log’ 以使时间戳为解析。请注意,也可以接受其他格式,例如“数字”但可能需要自定义陷阱处理程序。

要使 SNMP 陷阱监控工作,它必须首先正确设置。

2 设置SNMP trap监控

配置 Zabbix Server/Proxy

要读取trap,必须将ZabbixZabbix Server/Proxy配置为启动SNMPtrap进程,并指向由SNMPTT或perl trap接收器写入的trap文件。为此,请编辑配置文件 (zabbix_server.conf或者 zabbix_proxy.conf):

  1. StartSNMPTrapper=1
  2. SNMPTrapperFile=[TRAP FILE]

如果使用系统参数 PrivateTmp,则该文件不能在/tmp下使用。

配置 SNMPTT

首先,snmptrapd 应该配置为使用 SNMPTT。

为获得最佳性能,SNMPTT 应配置使用 snmptthandler-embedded 将陷阱传递给它的守护进程。在其主页中有配置 SNMPTT 的说明: http://snmptt.sourceforge.net/docs/snmptt.shtml

当 SNMPTT 配置为接收陷阱时,配置 snmptt.ini

  1. 启用 NET-SNMP 包中的 Perl 模块:
    net_snmp_perl_enable = 1
  2. 将陷阱记录到 Zabbix 将读取的陷阱文件中::
    log_enable = 1
    log_file = [TRAP FILE]
  3. 设置日期时间格式:
    · date_time_format = %H:%M:%S %Y/%m/%d = [DATE TIME FORMAT]

“net-snmp-perl”包已在RHEL/CentOS 8.0-8.2;在 RHEL 8.3 中重新添加。有关详细信息,请参阅 已知问题

现在格式化陷阱以便 Zabbix 识别它们(编辑 snmptt.conf):

  1. 每个FORMAT格式化语句应以“ZBXTRAP [address]”开头,其中[address] 将与 Zabbix 上 SNMP 接口的 IP 和 DNS 地址进行比较。例如:
    EVENT coldStart .1.3.6.1.6.3.1.1.5.1 “Status Events” Normal
    FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  2. 在下面查看更多关于 SNMP 陷阱格式的信息。

不要使用未知陷阱 - Zabbix 将无法认出他们。未知的陷阱可以通过定义一个通用的来处理 snmptt.conf 中的事件:
EVENT general .* “General event” Normal

配置 Perl trap 接收器

要求:Perl,Net-SNMP使用—enable-embedded-perl编译(默认情况下从Net-SNMP 5.4支持)

Perl trap接收器(查找misc/snmptrap/zabbix_trap_receiver.pl)可以直接从snmptrapd将trap传递给Zabbix服务器。配置过程:

  • 将perl脚本添加到snmptrapd配置文件(snmptrapd.conf)中,例如:
    perl do “[FULL PATH TO PERL RECEIVER SCRIPT]“;
  • 配置接收器, 例如:
    $SNMPTrapperFile = ‘[TRAP FILE]‘;
    $DateTimeFormat = ‘[DATE TIME FORMAT]‘;

如果脚本名称以引号引起,snmptrapd将会拒绝启动消息,类似:

· Regexp modifiers “/l” and “/a” are mutually exclusive at (eval 2) line 1, at end of line · Regexp modifier “/l” may not appear twice at (eval 2) line 1, at end of line

net-snmp客户端不支持SNMPv3/USM的AES256。

SNMP trap 格式

所有定制的perl trap接收器和SNMPTT trap配置必须按以下方式格式化trap: [timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2], 说明

  • [timestamp] - 用于日志监控项的时间戳
  • ZBXTRAP - 头表示新的trap从此行开始
  • [address] - 用于查找此trap的主机的IP地址

注意,“ZBXTRAP”和“[address]”将在处理过程中从消息中删除。如果trap格式化为其它方式,Zabbix也许能意外的解析trap。

trap示例:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal “Status Events” localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state: 1. Operational state: 2
This will result in the following trap for SNMP interface with IP=192.168.1.1:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal “Status Events” localhost - Link down on interface 2. Admin state: 1.

3 系统要求

大文件支持

Zabbix为SNMP trap文件提供了“大文件支持”。Zabbix可以读取的最大文件大小为2^63(8 EiB)。请注意,文件系统可能会对文件大小添加下限。

日志轮询

Zabbix不提供任何日志轮询系统(它应由用户处理)。 日志轮询应该首先重命名旧文件,然后才能将其删除,以免丢失trap:

  1. Zabbix在最后一个已知位置打开trap文件,并转到步骤3
  2. Zabbix通过比较inode号和定义trap文件的inode号,检查当前打开的文件是否已经轮换。如果没有打开的文件,Zabbix将重置最后一个位置并转到步骤1。
  3. Zabbix从当前打开的文件中读取数据并设置新的位置。
  4. 新数据被解析。如果这是轮询的文件,文件将关闭并返回到步骤2。
  5. 如果没有新的数据,Zabbix 等待1秒钟后,然后回到步骤2。
文件系统

由于Trap文件的执行,Zabbix需要文件系统支持inode来区分文件(该信息由stat()调用获取)。

4 设置示例

此示例使用 snmptrapd + SNMPTT 将陷阱传递给 Zabbix 服务器。 设置:

  1. zabbix_server.conf - 配置 Zabbix 启动 SNMP Trapper 和 设置陷阱文件:
    启动SNMPTrapper=1
    SNMPTrapperFile=/tmp/my_zabbix_traps.tmp
  2. snmptrapd.conf - 添加 SNMPTT 作为陷阱处理程序:
    traphandle default snmptt
  3. snmptt.ini -启用 NET-SNMP 包中的 Perl 模块:
    net_snmp_perl_enable = 1
    配置输出文件和时间格式:
    log_file = /tmp/my_zabbix_traps.tmp
    date_time_format = %H:%M:%S %Y/%m/%d
  4. snmptt.conf - 定义默认陷阱格式:
    EVENT general .* “General event” Normal
    FORMAT ZBXTRAP $aA $ar
  5. 创建一个 SNMP 监控项测试:
    主机的SNMP接口IP:127.0.0.1
    键:snmptrap[“General”]
    日志时间格式:hh:mm:ss yyyy/MM/dd

返回结果:

  1. 用于发送陷阱的命令:
    snmptrap -v 1 -c public 127.0.0.1 ‘.1.3.6.1.6.3.1.1.5.3’ ‘0.0.0.0’ 6 33 ‘55’ .1.3.6.1.6.3.1.1.5.3 s “teststring000” 2.收到的trap:
    15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal “General event” localhost - ZBXTRAP 127.0.0.1 127.0.0.1
  2. 监控项的值:
    15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal “General event” localhost - 127.0.0.1

这个简单的示例使用 SNMPTT 作为 traphandle。为了在生产系统上性能更好,使用嵌入式 Perl 来通过从 snmptrapd 到 SNMPTT 或直接到 Zabbix 的陷阱。

5 请参阅