3 SNMP 陷阱

概览

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

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

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

在Zabbix中接收SNMP陷阱设计用于与snmptrapd 一起工作,并通过以下机制之一将陷阱传递给Zabbix - Bash或Perl脚本或SNMPTT。

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

接收陷阱的工作流程:

  1. snmptrapd接收一个陷阱
  2. snmptrapd将陷阱传递给接收脚本(Bash,Perl) 或SNMPTT
  3. 接收器解析、格式化并将陷阱写入 文件
  4. Zabbix SNMP trapper读取并解析陷阱文件
  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地址。

    从每个接收到的陷阱中获取的地址将与所有SNMP接口的IP和DNS地址进行比较,以找到相应的主机。

2. 配置项目

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

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

  • 信息类型 设置为 "日志" 以便解析时间戳。其他格式,如 "数字" 也是可接受的,但可能需要自定义陷阱处理器。

设置SNMP trap监控

配置 Zabbix server/proxy

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

StartSNMPTrapper=1
       SNMPTrapperFile=[TRAP FILE]

如果使用了 systemd 参数 PrivateTmp 此文件在 /tmp 中可能无法工作。

配置 Bash 陷阱接收器

要求:仅需 snmptrapd。

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

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

配置 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
配置 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
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

系统要求

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

大文件支持

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陷阱处理器并 设置陷阱文件。添加到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变量。为了使用默认值, 首先创建父目录:

mkdir -p /var/lib/zabbix/snmptraps
  1. 将以下内容添加到snmtrapd.conf(参考工作示例
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

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

  1. 创建一个SNMP项目 TEST(请记住初始配置要求):

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

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

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

SNMPv1和SNMPv2协议依赖于“社区字符串”认证。在下面的示例中 我们将使用“secret”作为社区字符串。它必须在SNMP陷阱发送者上设置为相同的值。

请注意,尽管在生产环境中仍然广泛使用,SNMPv2并不提供 任何加密和真正的发送者认证。数据以明文形式发送,因此 这些协议版本仅应在私有网络等安全环境中使用 并且绝不能在任何公共或第三方网络上使用。

SNMP版本1在当今已不再使用,因为它不支持64位计数器并且 被认为是一种遗留协议。

为了接收SNMPv1或SNMPv2陷阱,您应该在snmptrapd.conf中添加以下行。 将“secret”替换为在SNMP陷阱发送者上配置的SNMP社区字符串:

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”关键字,它允许为此用户安全模型执行脚本。

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。 另请参阅:强大的认证或加密

验证

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

请参阅