####概述
接收 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 可能需要重新启动才能获取其配置更改。
要求: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: 2Zabbix为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.0Zabbix 中的监控项值将是:
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.0Perl 示例:
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