接收 SNMP 陷阱与查询启用 SNMP 的设备正好相反。
在这种情况下,信息由启用 SNMP 的设备发送至 snmptrapd,并由 Zabbix server 或从文件中“捕获”或收集该信息的 Zabbix proxy 接收。
通常,陷阱是在某些条件发生变化时发送的,agent 会通过端口 162 连接到服务器(与 agent 一侧用于 queries 的端口 161 相反)。使用陷阱可以检测在 query 间隔期间发生且可能被 query 数据遗漏的短暂问题。
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)节点切换期间,Zabbix 将在最后一个 ISO 8601 时间戳内的最后一条记录之后继续处理;如果未找到相同的记录,则仅使用时间戳来标识最后的位置。
此类监控项需要以下前端配置。
1。为您的主机创建一个SNMP接口
2。配置监控项
键 | ||
---|---|---|
描述 | 返回值 | 备注 |
snmptrap[regexp] | ||
捕获所有与在regexp中指定的regular expression匹配的SNMP trap。如果未指定regexp,则捕获任何trap。 | SNMP trap | 此监控项只能为SNMP接口设置。 此监控项键的参数中支持用户宏和全局正则表达式。 |
snmptrap.fallback | ||
捕获所有未被该接口的任何snmptrap[] 监控项捕获的SNMP trap。 | SNMP trap | 此监控项只能为SNMP接口设置。 |
目前不支持多行正则表达式匹配。
要读取SNMP陷阱,必须配置Zabbix server或proxy以启动SNMP陷阱进程,并指向由SNMPTT或Bash/Perl陷阱接收器写入的陷阱file。为此,请编辑配置文件file (zabbix_server.conf或 zabbix_proxy.conf):
如果使用了systemd参数 PrivateTmp ,此file在/tmp目录下可能无法正常工作。
要求:仅需snmptrapd。
可以使用Bash陷阱接收器script通过陷阱file将陷阱从snmptrapd传递给Zabbix server。要配置它,请将traphandle
选项添加到snmptrapd配置文件file中(snmptrapd.conf
),参见example。
snmptrapd可能需要重启以应用对其配置的更改。
要求:Perl,且Net-SNMP需使用--enable-embedded-perl编译(自Net-SNMP 5.4 起默认启用)
可以使用一个Perl trap接收器(查找misc/snmptrap/zabbix_trap_receiver.pl),以直接从snmptrapd传递trap给Zabbix server。配置方法如下:
可能需要重启snmptrapd以使其配置更改生效。
如果脚本名称未使用引号括起,snmptrapd将拒绝启动,并显示类似以下信息:
首先,应配置 snmptrapd 以使用 SNMPTT。
为了获得最佳性能,应将 SNMPTT 配置为守护进程,并使用 snmptthandler-embedded 将 trap 传递给它。请参阅 configuring SNMPTT 中的说明。
当 SNMPTT 配置为接收 trap 时,请配置 snmptt.ini
:
"net-snmp-perl" 包在 RHEL 8.0-8.2 中已被移除; 在 RHEL 8.3 中重新添加。更多信息,请参见 known issues。
现在格式化 trap 以便 Zabbix 能够识别它们(编辑 snmptt.conf):
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
不要使用未知 trap - Zabbix 将无法识别它们。 未知 trap 可以通过在 snmptt.conf 中定义一个通用事件来处理:
所有自定义的 Perl trap 接收器和 SNMPTT trap 配置必须以如下方式格式化 trap:
其中
请注意,"ZBXTRAP" 和 "[address]" 在处理过程中将从消息中被截取。如果 trap 的格式不符合要求,Zabbix 可能会意外地解析 trap。
示例 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 接口生成如下 trap:
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
建议install MIB files,以确保监控项值以正确的格式显示。 如果没有MIB文件,可能会出现格式化问题的情况,例如以HEX格式而非UTF-8显示数值,或相反的情况。
Zabbix 对 SNMP trapper 文件有较大的 file 支持。Zabbix 可读取的最大 file 大小为 2^63(即 8 EiB)。请注意,文件系统可能会对 file 大小施加更低的限制。
Zabbix 不提供任何日志轮转系统 - 这应该由用户来处理。日志轮转应首先重命名旧的 file,然后才去 delete 它,以确保不会丢失任何 trap:
由于 trap file 的实现,Zabbix 需要 file 系统支持使用 inode 来区分文件(该信息通过 stat() 调用获取)。
本示例使用snmptrapd和Bash接收器脚本将陷阱传递给Zabbix server。
配置步骤:
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变量,请先create父目录:
snmtrapd.conf
中添加以下内容(参考有效的example):可能需要重启snmptrapd以应用配置更改。
Create一个SNMP监控项测试(注意初始configuration requirements):
类型:SNMP陷阱
信息类型:日志
主机接口:SNMP 127.0.0.1
键值:snmptrap["linkUp"]
日志时间格式:yyyyMMdd.hhmmss
注意使用ISO 8601日期时间格式。
snmptrapd
,并使用snmptrap
工具发送测试陷阱。SNMPv1和SNMPv2协议依赖"community string"认证。以下示例中我们将使用"secret"作为community string,该值必须在SNMP陷阱发送端保持一致。
请注意,虽然SNMPv2仍在生产环境中广泛使用,但它不提供任何加密和真实的发送方认证。数据以明文发送,因此这些协议版本应仅在私有网络等安全环境中使用,切勿在任何公共或第三方网络中使用。
SNMPversion1实际上已不再使用,因为它不支持64位计数器,被视为遗留协议。
要启用接收SNMPv1或SNMPv2陷阱,应在snmptrapd.conf
中添加以下行。将"secret"替换为SNMP陷阱发送端配置的community string:
接下来可以使用snmptrap
发送测试陷阱。本示例使用常见的"link up" OID:
SNMPv3解决了SNMPv1/v2的安全问题问题,提供认证和加密功能。您可以使用MD5或多种SHA认证方法,以及DES/多种AES加密算法。
要启用接收SNMPv3,在snmptrapd.conf
中添加以下行:
请注意"execute"关键字,允许为该用户安全模型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等强加密方法,请使用version5.8.开头的net-snmp。可能需要使用configure
选项重新编译:--enable-blumenthal-aes
。 旧版net-snmp不支持AES192/AES256。 另见: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