####概述
接收 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)。
接收陷阱的工作流程:
snmptrapd
收到陷阱snmptrapd
将陷阱传递给接收器脚本(Bash、Perl)或 SNMPTTsnmptrap[regexp]
中的正则表达式进行比较。陷阱设置为 all 的匹配的监控项值。如果没有找到匹配的监控项并且有“snmptrap.fallback”监控项,陷阱设置为那个值。#####HA 故障转移注意事项
在高可用性(HA)节点切换期间,Zabbix 将在最后一个 ISO 8601 时间戳内的最后一条记录之后继续处理;如果未找到相同的记录,则仅使用时间戳来识别最后位置。
在前端配置以下字段是特定于该监控项类型:
在 配置 → 主机 中,在 主机接口 字段中填入正确的 IP 或 DNS 地址设置 SNMP 接口。将每个接收到的陷阱的地址与所有 SNMP 接口的 IP 和 DNS 地址进行比较,以找到相应的主机。
在 键值 字段中,使用 SNMP 陷阱key之一:
键 | ||
---|---|---|
描述 | 返回值 | 注释 |
snmptrap[regexp] | ||
捕获与 regexp 中指定的 正则表达式 匹配的所有 SNMP 陷阱。如果未指定 regexp,则捕获任何陷阱。 | SNMP 陷阱 | 此监控项只能为 SNMP 接口设置。 此监控项键的参数支持用户宏和全局正则表达式。 |
snmptrap.fallback | ||
捕获所有未被该接口的任何 snmptrap[] 监控项捕获的 SNMP 陷阱。 | SNMP 陷阱 | 只能为 SNMP 接口设置此监控项。 |
此处不支持多行正则表达式匹配。
将 信息类型 设置为“Log”以获取要解析的时间戳。 请注意,其他格式(例如“数字”)也是可以接受的,但可能需要自定义陷阱处理程序。
要使 SNMP 陷阱监控工作,它必须首先正确设置(见下文)。
要读取trap,必须将Zabbix Server/Proxy配置为启动SNMPtrap进程,并指向由SNMPTT或perl trap接收器写入的trap文件。为此,编辑配置文件 (zabbix_server.conf or zabbix_proxy.conf):
如果使用systemd参数 PrivateTmp 则该文件不太可能在/tmp下工作。
要求:只有snmptrapd。
Bash 陷阱接收器 脚本 可用于将陷阱直接从 snmptrapd 传递给 Zabbix 服务器。 要配置它,请将 traphandle
选项添加到 snmptrapd 配置文件 (snmptrapd.conf
),参见 示例.
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,使用 --enable-embedded-perl 编译的 Net-SNMP(自 Net-SNMP 5.4 起默认完成)
Perl 陷阱接收器(查找misc/snmptrap/zabbix_trap_receiver.pl) 可用于将陷阱直接从 snmptrapd 传递到 Zabbix 服务器。 配置它:
snmptrapd 可能需要重新启动才能使配置更改生效。
如果没有引用脚本名称,snmptrapd 将拒绝启动并显示消息,类似于这些:
所有自定义的 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
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
注意:在 7.0 版本之前,请使用此链接获取脚本下载.
如有必要,调整脚本中的 ZABBIX_TRAPS_FILE 变量。 要使用默认值,首先创建父目录:
3.将以下内容添加到snmtrapd.conf
(参考工作[示例]refer to working example)
snmptrapd 可能需要重新启动才能获取其配置更改。
创建一个 SNMP 测试监控项:
Host SNMP interface IP: 127.0.0.1
Key: snmptrap["linkUp"]
Log time format: yyyy-MM-ddThh:mm:ss
请注意,使用的是 ISO 8601 日期和时间格式。
snmptrapd
,并使用 snmptrap
实用程序发送测试陷阱。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:
接下来我们可以使用 snmptrap 发送测试陷阱。 我们将在此示例中使用通用的“link up”OID:
SNMPv3 解决了 SNMPv1/v2 安全问题并提供身份验证和加密。您可以使用 SHA 或 MD5 作为身份验证方法,使用 AES 或 DES 作为密码。
要启用接受 SNMPv3,请将以下行添加到 snmptrapd.conf
:
请注意允许为此用户安全模型执行脚本的“执行”关键字。
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