3 SNMP 陷阱
概述
接收 SNMP 陷阱与查询启用 SNMP 的设备相反。
在这种情况下,信息是从支持 SNMP 的设备发送的,并且是被 Zabbix 收集或“捕获”。
通常,在某些条件更改时会发送陷阱,并且客户端的 162端口 连接到服务器(与用于查询客户端的端口 161 不同)。使用陷阱可能会检测到在查询间隔中发生的一些短期问题,并且可能会遗漏查询数据。
在 Zabbix 中接收 SNMP 陷阱要与 snmptrapd 一起使用,以及将snmp陷阱传递给 Zabbix 的机制之一,Bash 或 Perl 脚本或 SNMPTT 。
配置Zabbix后设置trap监控最简单的方法是使用Bash脚本方案,因为Perl和SNMPTT在现代发行版中经常缺失,需要更复杂的配置。但是,该方案使用配置为traphandle
的脚本。为了在生产系统上获得更好的性能,请使用嵌入式 Perl 解决方案(带有“do perl”选项的脚本或 SNMPTT)。
接收陷阱的工作流程:
snmptrapd
收到陷阱snmptrapd
将陷阱传递给接收器脚本(Bash、Perl)或 SNMPTT- 接收方解析、格式化并将trap写入文件
- Zabbix SNMP trapper读取并解析trap文件
- 对于每个陷阱,Zabbix 会找到主机接口与接收到的陷阱地址匹配的所有“SNMP trapper”监控项。 请注意,在匹配过程中,只会使用在主机界面中选择的“IP”或“DNS”。
- 对于每个找到的项目,将陷阱与
snmptrap[regexp]
中的正则表达式进行比较。陷阱设置为 all 的匹配的监控项值。如果没有找到匹配的监控项并且有“snmptrap.fallback”监控项,陷阱设置为那个值。 - 如果陷阱没有设置为任何项的值,Zabbix 默认记录不匹配的陷阱。 (这是通过管理 → 一般 → 其他中的“记录不匹配的 SNMP 陷阱”配置的。)
1 配置 SNMP 陷阱
在前端配置以下字段是特定于该监控项类型:
- 您的主机必须有 SNMP 接口
在 配置 → 主机 中,在 主机接口 字段中填入正确的 IP 或 DNS 地址设置 SNMP 接口。将每个接收到的陷阱的地址与所有 SNMP 接口的 IP 和 DNS 地址进行比较,以找到相应的主机。
- 配置监控项
在 键值 字段中,使用 SNMP 陷阱key之一:
键 | ||
---|---|---|
描述 | 返回值 | 注释 |
snmptrap[regexp] | ||
捕获与 regexp 中指定的 正则表达式 匹配的所有 SNMP 陷阱。如果未指定 regexp,则捕获任何陷阱。 | SNMP 陷阱 | 此监控项只能为 SNMP 接口设置。 此监控项键的参数支持用户宏和全局正则表达式。 |
snmptrap.fallback | ||
捕获所有未被该接口的任何 snmptrap[] 监控项捕获的 SNMP 陷阱。 | SNMP 陷阱 | 只能为 SNMP 接口设置此监控项。 |
此处不支持多行正则表达式匹配。
将 信息类型 设置为“Log”以获取要解析的时间戳。 请注意,其他格式(例如“数字”)也是可以接受的,但可能需要自定义陷阱处理程序。
要使 SNMP 陷阱监控工作,它必须首先正确设置(见下文)。
2 设置SNMP trap监控
配置 Zabbix Server/Proxy
要读取trap,必须将Zabbix Server/Proxy配置为启动SNMPtrap进程,并指向由SNMPTT或perl trap接收器写入的trap文件。为此,编辑配置文件 (zabbix_server.conf 或 zabbix_proxy.conf):
StartSNMPTrapper=1 SNMPTrapperFile=[TRAP FILE]
如果使用systemd参数 PrivateTmp,则该文件不太可能在/tmp下工作。
配置 Bash 陷阱接收器
要求:只有snmptrapd。
Bash 陷阱接收器 脚本 可用于将陷阱直接从 snmptrapd 传递给 Zabbix 服务器。 要配置它,请将 traphandle
选项添加到 snmptrapd 配置文件 (snmptrapd.conf
),参见 [示例](https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/Dockerfiles/snmptraps/alpine /conf/etc/snmp/snmptrapd.conf)。
配置 SNMPTT
首先,snmptrapd 应该配置为使用 SNMPTT。
为获得最佳性能,SNMPTT 应配置使用 snmptthandler-embedded 将陷阱传递给它的守护进程。请参阅 配置 SNMPTT 的说明。
当 SNMPTT 配置为接收陷阱时,配置 snmptt.ini
:
- 启用 NET-SNMP 包中的 Perl 模块:
net_snmp_perl_enable = 1 - 将陷阱记录到 Zabbix 将读取的陷阱文件中::
log_enable = 1
log_file = [TRAP FILE] - 设置日期时间格式:
· date_time_format = %H:%M:%S %Y/%m/%d = [DATE TIME FORMAT]
“net-snmp-perl”包已在RHEL 8.0-8.2被移除;但在 RHEL 8.3 中重新添加。有关详细信息,请参阅 已知问题。
现在格式化陷阱以便 Zabbix 识别它们(编辑 snmptt.conf):
- 每个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) - 在下面查看更多关于 SNMP 陷阱格式的信息。
不要使用未知的陷阱 - Zabbix 将无法识别它们。 可以通过在 snmptt.conf 中定义一般事件来处理未知陷阱:
EVENT general .* “General event” Normal
配置 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 将拒绝启动并显示消息,类似于这些:
· 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
SNMP 陷阱格式
所有自定义的 Perl 陷阱接收器和 SNMPTT 陷阱配置必须按以下方式格式化陷阱:
[timestamp] [the trap, part1] ZBXTRAP [address] [the trap, part 2]
在哪里
- · [timestamp] - 用于日志监控项的时间戳
- · ZBXTRAP - 头表示一个新的陷阱从这一行开始
- · [address] - 用于查找此trap的主机的 IP 地址
请注意,“ZBXTRAP”和“[address]”将在处理过程中从消息中删除。 如果陷阱以其他方式格式化,Zabbix 可能会意外地解析陷阱。
trap示例:
· 11:30:15 2011/07/27 .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 接口出现以下陷阱:
· 11:30:15 2011/07/27 .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
3 系统要求
大文件支持
Zabbix为SNMP trap文件提供了“大文件支持”。Zabbix可以读取的最大文件大小为2^63(8 EiB)。请注意,文件系统可能会对文件大小添加下限。
日志轮询
Zabbix不提供任何日志轮询系统(它应由用户处理)。 日志轮询应该首先重命名旧文件,然后才能将其删除,以免丢失trap:
- Zabbix在最后一个已知位置打开trap文件,并转到步骤3
- Zabbix通过比较inode号和定义trap文件的inode号,检查当前打开的文件是否已经轮换。如果没有打开的文件,Zabbix将重置最后一个位置并转到步骤1。
- Zabbix从当前打开的文件中读取数据并设置新的位置。
- 新数据被解析。如果这是轮询的文件,文件将关闭并返回到步骤2。
- 如果没有新的数据,Zabbix 等待1秒钟后,然后回到步骤2。
文件系统
由于Trap文件的执行,Zabbix需要文件系统支持inode来区分文件(该信息由stat()调用获取)。
使用不同 SNMP 协议版本的设置示例
此示例使用 snmptrapd 和 Bash 接收器脚本将陷阱传递到 Zabbix 服务器。
设置:
- 配置Zabbix启动SNMP trapper并设置trap文件。 添加到
zabbix_server.conf
:
StartSNMPTrapper=1 SNMPTrapperFile=/tmp/my_zabbix_traps.tmp
- 下载Bash脚本到
/usr/sbin/zabbix_trap_handler.sh
:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix\_trap\_handler.sh
如有必要,调整脚本中的 ZABBIX_TRAPS_FILE 变量。 要使用默认值,首先创建父目录:
mkdir -p /var/lib/zabbix/snmptraps
3.将以下内容添加到snmtrapd.conf
(参考工作[示例](https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/Dockerfiles/snmptraps/alpine/conf/etc/snmp/snmptrapd .conf))
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
- 创建一个 SNMP 测试监控项:
Host SNMP interface IP: 127.0.0.1 Key: snmptrap["linkup"]
Log time format: yyyyMMdd.hhmmss
- 接下来我们将为我们选择的 SNMP 协议版本配置
snmptrapd
,并使用snmptrap
实用程序发送测试陷阱。
SNMPv1,SNMPv2
SNMPv1 和 SNMPv2 协议依赖于“团体名”身份验证。 在下面的示例中,我们将使用“secret”作为团体名。 它必须在 SNMP 陷阱发送器上设置为相同的值。
请注意,虽然 SNMPv2 仍在生产环境中广泛使用,但它不提供任何加密和真实发件人身份验证。 数据以纯文本形式发送,因此这些协议版本只能在安全环境(例如专用网络)中使用,绝不能在任何公共或第三方网络上使用。
SNMPv1 目前并没有真正被使用,因为它不支持 64 位计数器并且被认为是一个遗留协议。
要启用接受 SNMPv1 或 SNMPv2 陷阱,您应该将以下行添加到 snmptrapd.conf
。将“secret”替换为在 SNMP 陷阱发件人上配置的 SNMP 团体字:
authCommunity log,execute,net secret
接下来我们可以使用 snmptrap 发送测试陷阱。 我们将在此示例中使用通用的“link up”OID:
snmptrap -v 2c -c secret localhost 0 linkUp.0
SNMPv3
SNMPv3 解决了 SNMPv1/v2 安全问题并提供身份验证和加密。您可以使用 SHA 或 MD5 作为身份验证方法,使用 AES 或 DES 作为密码。
要启用接受 SNMPv3,请将以下行添加到 snmptrapd.conf
:
createUser -e 0x8000000001020304 traptest SHA mypassword AES authuser log,execute traptest
请注意允许为此用户安全模型执行脚本的“执行”关键字。
# 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”中看到类似的行:
20220805.102235 ZBXTRAP 127.0.0.1 UDP: [127.0.0.1]:35736->[127.0.0.1]:162 DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0
Zabbix 中的监控项值将是:
2022-08-05 10:54:43→2022-08-05 10:54:41→ 20220805.105441 UDP: [127.0.0.1]:44262->[127.0.0.1]:162 DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0