2022 Zabbix中国峰会
2022 Zabbix中国峰会

3 SNMP 陷阱

####概述

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

在这种情况下,信息从启用 SNMP 的设备发送到 snmptrapd,并由 Zabbix 服务器或 Zabbix 代理从文件收集或“捕获”。

通常,陷阱是在某些条件发生变化时发送的,代理会通过端口 162 连接到服务器(而不是用于查询的代理端的端口 161)。使用陷阱可能会检测到查询间隔期间发生的一些短暂问题,而查询数据可能会遗漏这些问题。

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

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

接收陷阱的工作流程:

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

#####HA 故障转移注意事项

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

1 配置 SNMP 陷阱

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

  • 您的主机必须有 SNMP 接口

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

  • 配置监控项

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

描述 返回值 注释
snmptrap[regexp]
捕获与 regexp 中指定的 正则表达式 匹配的所有 SNMP 陷阱。如果未指定 regexp,则捕获任何陷阱。 SNMP 陷阱 此监控项只能为 SNMP 接口设置。
此监控项键的参数支持用户宏和全局正则表达式。
snmptrap.fallback
捕获所有未被该接口的任何 snmptrap[] 监控项捕获的 SNMP 陷阱。 SNMP 陷阱 只能为 SNMP 接口设置此监控项。

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

信息类型 设置为“Log”以获取要解析的时间戳。 请注意,其他格式(例如“数字”)也是可以接受的,但可能需要自定义陷阱处理程序。

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

设置SNMP trap监控

配置 Zabbix Server/Proxy

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

StartSNMPTrapper=1
       SNMPTrapperFile=[TRAP FILE]

如果使用systemd参数 PrivateTmp 则该文件不太可能在/tmp下工作。

配置 Bash 陷阱接收器

要求:只有snmptrapd。

Bash 陷阱接收器 脚本 可用于将陷阱直接从 snmptrapd 传递给 Zabbix 服务器。 要配置它,请将 traphandle 选项添加到 snmptrapd 配置文件 (snmptrapd.conf),参见 示例.

snmptrapd 可能需要重新启动才能获取其配置更改。

配置 SNMPTT

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

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

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

  1. 启用 NET-SNMP 包中的 Perl 模块:
net_snmp_perl_enable = 1
  1. 将陷阱记录到 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 中重新添加。有关详细信息,请参阅已知问题

现在格式化陷阱以便 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 陷阱格式的信息

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

EVENT general .* "General event" Normal
配置 Perl trap 接收器

要求:Perl,使用 --enable-embedded-perl 编译的 Net-SNMP(自 Net-SNMP 5.4 起默认完成)

Perl 陷阱接收器(查找misc/snmptrap/zabbix_trap_receiver.pl) 可用于将陷阱直接从 snmptrapd 传递到 Zabbix 服务器。 配置它:

  • 将 Perl 脚本添加到 snmptrapd 配置文件(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
SNMP 陷阱格式

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

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

在哪里

  • [timestamp] - “%Y-%m-%dT%H:%M:%S%z”格式的时间戳
  • ZBXTRAP - 头表示一个新的陷阱从这一行开始
  • [address] - 用于查找此trap的主机的 IP 地址

请注意,“ZBXTRAP”和“[address]”将在处理过程中从消息中删除。 如果陷阱以其他方式格式化,Zabbix 可能会意外地解析陷阱。

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 接口出现以下陷阱:

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

系统要求

大文件支持

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()调用获取)。

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

此示例使用 snmptrapd 和 Bash 接收器脚本将陷阱传递到 Zabbix 服务器。

设置:

  1. 配置Zabbix启动SNMP trapper并设置trap文件。 添加到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

注意:在 7.0 版本之前,请使用此链接获取脚本下载.

如有必要,调整脚本中的 ZABBIX_TRAPS_FILE 变量。 要使用默认值,首先创建父目录:

mkdir -p /var/lib/zabbix/snmptraps

3.将以下内容添加到snmtrapd.conf(参考工作[示例]refer to working example

traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

snmptrapd 可能需要重新启动才能获取其配置更改。

  1. 创建一个 SNMP 测试监控项:

    Host SNMP interface IP: 127.0.0.1
    Key: snmptrap["linkUp"]
    Log time format: yyyy-MM-ddThh:mm:ss

请注意,使用的是 ISO 8601 日期和时间格式。

  1. 接下来我们将为我们选择的 SNMP 协议版本配置 snmptrapd,并使用 snmptrap 实用程序发送测试陷阱。
SNMPv1, SNMPv2

SNMPv1 和 SNMPv2 协议依赖于“团体名”身份验证。 在下面的示例中,我们将使用“secret”作为团体名。 它必须在 SNMP 陷阱发送器上设置为相同的值。

请注意,虽然 SNMPv2 仍在生产环境中广泛使用,但它不提供任何加密和真实发件人身份验证。 数据以纯文本形式发送,因此这些协议版本只能在安全环境(例如专用网络)中使用,绝不能在任何公共或第三方网络上使用。

SNMPv1 目前并没有真正被使用,因为它不支持 64 位计数器并且被认为是一个遗留协议。

To enable accepting SNMPv1 or SNMPv2 traps you should add the following line to snmptrapd.conf. Replace "secret" with the SNMP community string configured on SNMP trap senders:

authCommunity log,execute,net secret

接下来我们可以使用 snmptrap 发送测试陷阱。 我们将在此示例中使用通用的“link up”OID:

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

SNMPv3 解决了 SNMPv1/v2 安全问题并提供身份验证和加密。您可以使用 SHA 或 MD5 作为身份验证方法,使用 AES 或 DES 作为密码。

要启用接受 SNMPv3,请将以下行添加到 snmptrapd.conf

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

请注意允许为此用户安全模型执行脚本的“执行”关键字。

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

如果您希望使用 AES192 或 AES256 等强加密方法,从 5.8 版本开始请使用 net-snmp。 您可能必须使用“configure”选项重新编译它:“--enable-blumenthal-aes”。旧版本的 net-snmp 不支持 AES192/AES256。另请参阅:http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption

确认

在这两个示例中,您将在“/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

请参阅