3 SNMP陷阱

概述

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

在这种情况下,信息由启用 SNMP 的设备发送至 snmptrapd,并由 Zabbix server 或从文件中“捕获”或收集该信息的 Zabbix proxy 接收。

通常,陷阱是在某些条件发生变化时发送的,agent 会通过端口 162 连接到服务器(与 agent 一侧用于 queries 的端口 161 相反)。使用陷阱可以检测在 query 间隔期间发生且可能被 query 数据遗漏的短暂问题。

Zabbix 中接收 SNMP 陷阱的设计是与 snmptrapd 一起工作,并且传递陷阱给 Zabbix 的机制之一是使用 Bash 或 Perl 脚本或 SNMPTT。

在配置 Zabbix 后设置陷阱监控的最简单方法是使用 Bash 脚本解决方案,因为现代发行版中通常缺少 Perl 和 SNMPTT,而且它们的配置更为复杂。然而,该解决方案使用配置为 traphandle 的脚本。在生产系统上为了获得更好的性能,请使用嵌入式 Perl 解决方案(使用 do perl 选项的脚本或 SNMPTT)。

接收陷阱的工作流程:

  1. snmptrapd 接收一个陷阱
  2. snmptrapd 将该陷阱传递给接收脚本(Bash、Perl)或 SNMPTT
  3. 接收器解析、格式化并将该陷阱写入 file
  4. Zabbix SNMP trapper 读取并解析该陷阱 file
  5. 对于每个陷阱,Zabbix 会查找所有“SNMP trapper”监控项,其 主机 接口与接收到的陷阱地址匹配。请注意,在匹配过程中仅使用 主机 接口中选择的“IP”或“DNS”。
  6. 对于每个找到的 监控项,将陷阱与 snmptrap[regexp] 中的正则表达式进行比较。该陷阱将被设置为所有匹配的 监控项 的值。如果没有找到匹配的 监控项,但存在 snmptrap.fallback 监控项,则该陷阱将被设置为该值。
  7. 如果该陷阱未被设置为任何 监控项 的值,则 Zabbix 默认会记录未匹配的陷阱。(此行为可在“管理”>“常规”>“其他”中通过“记录未匹配的 SNMP 陷阱”进行配置。)
HA故障转移注意事项

在高可用性(HA)节点切换期间,Zabbix 将在最后一个 ISO 8601 时间戳内的最后一条记录之后继续处理;如果未找到相同的记录,则仅使用时间戳来标识最后的位置。

配置SNMP陷阱

此类监控项需要以下前端配置。

1。为您的主机创建一个SNMP接口

  • 数据采集 > 主机 中,创建/编辑主机,在 接口 字段中,添加接口类型“SNMP”,并指定IP或DNS地址。

    每个接收到的trap的地址将与所有SNMP接口的IP和DNS地址进行比较,以找到对应的主机。

2。配置监控项

  • 数据采集 > 主机 中,创建/编辑必要的监控项。
  • 键值 字段中,使用以下SNMP trap键之一:
描述 返回值 备注
snmptrap[regexp]
捕获所有与在regexp中指定的regular expression匹配的SNMP trap。如果未指定regexp,则捕获任何trap。 SNMP trap 此监控项只能为SNMP接口设置。
此监控项键的参数中支持用户宏和全局正则表达式。
snmptrap.fallback
捕获所有未被该接口的任何snmptrap[] 监控项捕获的SNMP trap。 SNMP trap 此监控项只能为SNMP接口设置。

目前不支持多行正则表达式匹配。

  • 信息类型设置为“日志”,以便解析时间戳。其他格式如“数字”也可以接受,但可能需要自定义trap处理程序。

设置 SNMP trap 监控

配置 Zabbix server/proxy

要读取SNMP陷阱,必须配置Zabbix server或proxy以启动SNMP陷阱进程,并指向由SNMPTT或Bash/Perl陷阱接收器写入的陷阱file。为此,请编辑配置文件file (zabbix_server.confzabbix_proxy.conf):

StartSNMPTrapper=1
       SNMPTrapperFile=[TRAP FILE]

如果使用了systemd参数 PrivateTmp ,此file在/tmp目录下可能无法正常工作。

配置Bash陷阱接收器

要求:仅需snmptrapd。

可以使用Bash陷阱接收器script通过陷阱file将陷阱从snmptrapd传递给Zabbix server。要配置它,请将traphandle选项添加到snmptrapd配置文件file中(snmptrapd.conf),参见example

snmptrapd可能需要重启以应用对其配置的更改。

配置 Perl trap 接收器

要求:Perl,且Net-SNMP需使用--enable-embedded-perl编译(自Net-SNMP 5.4 起默认启用)

可以使用一个Perl trap接收器(查找misc/snmptrap/zabbix_trap_receiver.pl),以直接从snmptrapd传递trap给Zabbix server。配置方法如下:

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

可能需要重启snmptrapd以使其配置更改生效。

如果脚本名称未使用引号括起,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
配置 SNMPTT

首先,应配置 snmptrapd 以使用 SNMPTT。

为了获得最佳性能,应将 SNMPTT 配置为守护进程,并使用 snmptthandler-embedded 将 trap 传递给它。请参阅 configuring SNMPTT 中的说明。

当 SNMPTT 配置为接收 trap 时,请配置 snmptt.ini

  1. 启用来自 NET-SNMP 包的 Perl 模块:
net_snmp_perl_enable = 1
  1. 将 trap 日志记录到 trap file,该文件将被 Zabbix 读取:
log_enable = 1
       log_file = [TRAP FILE]
  1. 设置日期时间格式:
date_time_format = %Y-%m-%dT%H:%M:%S%z

"net-snmp-perl" 包在 RHEL 8.0-8.2 中已被移除; 在 RHEL 8.3 中重新添加。更多信息,请参见 known issues

现在格式化 trap 以便 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)
  1. 更多关于 SNMP trap 格式的信息,请参见下方。

不要使用未知 trap - Zabbix 将无法识别它们。 未知 trap 可以通过在 snmptt.conf 中定义一个通用事件来处理:

EVENT general .* "General event" Normal
SNMP trap 格式

所有自定义的 Perl trap 接收器和 SNMPTT trap 配置必须以如下方式格式化 trap:

[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]

其中

  • [timestamp] - 以 "%Y-%m-%dT%H:%M:%S%z" 格式表示的时间戳
  • ZBXTRAP - 表示新 trap 从此行开始的头部信息
  • [address] - 用于查找此 trap 的 主机 的 IP 地址

请注意,"ZBXTRAP" 和 "[address]" 在处理过程中将从消息中被截取。如果 trap 的格式不符合要求,Zabbix 可能会意外地解析 trap。

示例 trap:

2024-01-11T15:28:47+0200 .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

这将为 IP=192.168.1.1 的 SNMP 接口生成如下 trap:

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events"
       localhost - Link down on interface 2. Admin state: 1. Operational state: 2

系统要求

建议install MIB files,以确保监控项值以正确的格式显示。 如果没有MIB文件,可能会出现格式化问题的情况,例如以HEX格式而非UTF-8显示数值,或相反的情况。

大文件支持

Zabbix 对 SNMP trapper 文件有较大的 file 支持。Zabbix 可读取的最大 file 大小为 2^63(即 8 EiB)。请注意,文件系统可能会对 file 大小施加更低的限制。

日志轮转

Zabbix 不提供任何日志轮转系统 - 这应该由用户来处理。日志轮转应首先重命名旧的 file,然后才去 delete 它,以确保不会丢失任何 trap:

  1. Zabbix 在最后已知的位置打开 trap file,然后转到步骤 3
  2. Zabbix 通过将打开的文件的 inode 编号与定义的 trap 文件的 inode 编号进行比较,检查当前打开的 file 是否已被轮转。 如果没有打开的文件,Zabbix 将重置最后的位置,并转到步骤 1
  3. Zabbix 从当前打开的 file 读取数据,并设置新的位置。
  4. 解析新数据。如果这是轮转后的文件,则关闭 file,并返回到步骤 2
  5. 如果没有新数据,Zabbix 睡眠 1 秒,然后返回到步骤 2
文件系统

由于 trap file 的实现,Zabbix 需要 file 系统支持使用 inode 来区分文件(该信息通过 stat() 调用获取)。

使用不同SNMP协议版本的配置示例

本示例使用snmptrapd和Bash接收器脚本将陷阱传递给Zabbix server。

配置步骤:

  1. 配置Zabbix启动SNMP trapper并设置陷阱file。在zabbix_server.conf中添加:
StartSNMPTrapper=1
       SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. 将Bash脚本下载到/usr/sbin/zabbix_trap_handler.sh
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/7.0/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh

如需调整脚本中的ZABBIX_TRAPS_FILE变量,请先create父目录:

mkdir -p /var/lib/zabbix/snmptraps
  1. snmtrapd.conf中添加以下内容(参考有效的example):
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

可能需要重启snmptrapd以应用配置更改。

  1. Create一个SNMP监控项测试(注意初始configuration requirements):

    类型:SNMP陷阱
    信息类型:日志
    主机接口:SNMP 127.0.0.1
    键值:snmptrap["linkUp"]
    日志时间格式:yyyyMMdd.hhmmss

注意使用ISO 8601日期时间格式。

  1. 接下来我们将为选定的SNMP协议version配置snmptrapd,并使用snmptrap工具发送测试陷阱。
SNMPv1, SNMPv2

SNMPv1和SNMPv2协议依赖"community string"认证。以下示例中我们将使用"secret"作为community string,该值必须在SNMP陷阱发送端保持一致。

请注意,虽然SNMPv2仍在生产环境中广泛使用,但它不提供任何加密和真实的发送方认证。数据以明文发送,因此这些协议版本应仅在私有网络等安全环境中使用,切勿在任何公共或第三方网络中使用。

SNMPversion1实际上已不再使用,因为它不支持64位计数器,被视为遗留协议。

要启用接收SNMPv1或SNMPv2陷阱,应在snmptrapd.conf中添加以下行。将"secret"替换为SNMP陷阱发送端配置的community string:

authCommunity log,execute,net secret

接下来可以使用snmptrap发送测试陷阱。本示例使用常见的"link up" OID:

snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3

SNMPv3解决了SNMPv1/v2的安全问题问题,提供认证和加密功能。您可以使用MD5或多种SHA认证方法,以及DES/多种AES加密算法。

要启用接收SNMPv3,在snmptrapd.conf中添加以下行:

createUser -e 0x8000000001020304 traptest SHA mypassword AES
       authuser log,execute traptest

请注意"execute"关键字,允许为该用户安全模型execute脚本。

snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0

如需使用AES192或AES256等强加密方法,请使用version5.8.开头的net-snmp。可能需要使用configure选项重新编译:--enable-blumenthal-aes。 旧版net-snmp不支持AES192/AES256。 另见:Strong Authentication or Encryption

Verification

在这两个示例中,您将在/var/lib/zabbix/snmptraps/snmptraps.log中看到类似的行:

2024-01-30T10:04:23+0200 ZBXTRAP 127.0.0.1
       UDP: [127.0.0.1]:56585->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Zabbix中的监控项值将为:

2024-01-30 10:04:23 2024-01-30 10:04:21 
       
       2024-01-30T10:04:21+0200 UDP: [127.0.0.1]:56585->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Perl示例:

2024-01-30T11:42:54+0200 ZBXTRAP 127.0.0.1
       PDU INFO:
         receivedfrom                   UDP: [127.0.0.1]:58649->[127.0.0.1]:162
         notificationtype               TRAP
         version                        1
         community                      public
         errorstatus                    0
         transactionid                  1
         requestid                      2101882550
         messageid                      0
         errorindex                     0
       VARBINDS:
         DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (457671) 1:16:16.71
         SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkUp.0

另请参阅