接收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)。
接收陷阱的工作流程:
snmptrapd
接收一个陷阱snmptrapd
将陷阱传递给接收脚本(Bash,Perl) 或SNMPTTsnmptrap[regexp]
中的正则表达式进行比较。陷阱设置为所有 匹配项的值。如果没有找到匹配项并且存在 snmptrap.fallback
项,陷阱将设置为该值。#####HA 故障转移注意事项
在高可用性(HA)节点切换期间,Zabbix 将在最后一个 ISO 8601 时间戳内的最后一条记录之后继续处理;如果未找到相同的记录,则仅使用时间戳来识别最后位置。
此项目类型需要以下前端配置。
1. 为您的主机创建SNMP接口
2. 配置项目
键 | ||
---|---|---|
描述 | 返回值 | 注释 |
snmptrap[regexp] | ||
捕获所有与 regexp 中指定的正则表达式匹配的SNMP陷阱。如果未指定regexp,捕获任何陷阱。 | SNMP陷阱 | 此项目只能为SNMP接口设置。 用户宏和全局正则表达式在此项目键的参数中得到支持。 |
snmptrap.fallback | ||
捕获所有未被该接口的snmptrap[]项目捕获的SNMP陷阱。 | SNMP陷阱 | 此项目只能为SNMP接口设置。 |
目前不支持多行正则表达式匹配。
为了读取陷阱,Zabbix server 或 proxy 必须配置为启动 SNMP trapper 进程并指向由 SNMPTT 或 Bash/Perl 陷阱接收器写入的陷阱文件。为此,请编辑 配置文件 (zabbix_server.conf 或 zabbix_proxy.conf):
如果使用了 systemd 参数 PrivateTmp 此文件在 /tmp 中可能无法工作。
要求:仅需 snmptrapd。
可以使用 Bash 陷阱接收器 脚本 从 snmptrapd 通过 trapper 文件将陷阱传递给 Zabbix server。要 配置它,请在 snmptrapd 配置文件 (snmptrapd.conf
) 中添加 traphandle
选项, 参见 示例。
可能需要重启 snmptrapd 以应用其配置更改。
要求:Perl,使用 --enable-embedded-perl 编译的 Net-SNMP(自 Net-SNMP 5.4 起默认完成)
Perl 陷阱接收器(查找misc/snmptrap/zabbix_trap_receiver.pl) 可用于将陷阱直接从 snmptrapd 传递到 Zabbix 服务器。 配置它:
snmptrapd 可能需要重新启动才能使配置更改生效。
如果没有引用脚本名称,snmptrapd 将拒绝启动并显示消息,类似于这些:
首先,snmptrapd 应该配置为使用 SNMPTT。
为获得最佳性能,SNMPTT 应配置使用 snmptthandler-embedded 将陷阱传递给它的守护进程。请参阅 配置 SNMPTT 的说明。
当 SNMPTT 配置为接收陷阱时,配置 snmptt.ini
:
“net-snmp-perl”包已在RHEL 8.0-8.2被移除;但在 RHEL 8.3 中重新添加。有关详细信息,请参阅已知问题。
现在格式化陷阱以便 Zabbix 识别它们(编辑 snmptt.conf):
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
不要使用未知的陷阱 - Zabbix 将无法识别它们。 可以通过在 snmptt.conf 中定义一般事件来处理未知陷阱:
所有自定义的 Perl 陷阱接收器和 SNMPTT 陷阱配置必须按以下方式格式化陷阱:
在哪里
请注意,“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:
由于Trap文件的执行,Zabbix需要文件系统支持inode来区分文件(该信息由stat()调用获取)。
此示例使用snmptrapd和一个Bash接收脚本来将陷阱传递给Zabbix服务器。
设置:
zabbix_server.conf
:/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变量。为了使用默认值, 首先创建父目录:
snmtrapd.conf
(参考工作示例)可能需要重启snmptrapd以应用配置更改。
类型:SNMP陷阱 信息类型:日志 主机接口:SNMP 127.0.0.1 键:snmptrap["linkUp"]
日志时间格式:yyyyMMdd.hhmmss
请注意,使用的是ISO 8601日期和时间格式。
snmptrapd
并 使用snmptrap
实用程序发送测试陷阱。SNMPv1和SNMPv2协议依赖于“社区字符串”认证。在下面的示例中 我们将使用“secret”作为社区字符串。它必须在SNMP陷阱发送者上设置为相同的值。
请注意,尽管在生产环境中仍然广泛使用,SNMPv2并不提供 任何加密和真正的发送者认证。数据以明文形式发送,因此 这些协议版本仅应在私有网络等安全环境中使用 并且绝不能在任何公共或第三方网络上使用。
SNMP版本1在当今已不再使用,因为它不支持64位计数器并且 被认为是一种遗留协议。
为了接收SNMPv1或SNMPv2陷阱,您应该在snmptrapd.conf
中添加以下行。 将“secret”替换为在SNMP陷阱发送者上配置的SNMP社区字符串:
接下来我们可以使用snmptrap
发送一个测试陷阱。我们将使用常见的“link up”OID作为示例:
SNMPv3解决了SNMPv1/v2的安全问题并提供了认证和加密。 您可以使用MD5或多个SHA认证方法以及DES/多个AES作为密码。
为了接收SNMPv3,您应该在snmptrapd.conf
中添加以下行:
请注意“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