这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.
2022 Zabbix中国峰会
2022 Zabbix中国峰会

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)。

接收陷阱的工作流程:

  1. snmptrapd 收到陷阱
  2. snmptrapd 将陷阱传递给接收器脚本(Bash、Perl)或 SNMPTT
  3. 接收方解析、格式化并将trap写入文件
  4. Zabbix SNMP trapper读取并解析trap文件
  5. 对于每个陷阱,Zabbix 会找到主机接口与接收到的陷阱地址匹配的所有“SNMP trapper”监控项。 请注意,在匹配过程中,只会使用在主机界面中选择的“IP”或“DNS”。
  6. 对于每个找到的项目,将陷阱与 snmptrap[regexp] 中的正则表达式进行比较。陷阱设置为 all 的匹配的监控项值。如果没有找到匹配的监控项并且有“snmptrap.fallback”监控项,陷阱设置为那个值。
  7. 如果陷阱没有设置为任何项的值,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.confzabbix_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

  1. 启用 NET-SNMP 包中的 Perl 模块:
    net_snmp_perl_enable = 1
  2. 将陷阱记录到 Zabbix 将读取的陷阱文件中::
    log_enable = 1
    log_file = [TRAP FILE]
  3. 设置日期时间格式:
    · 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):

  1. 每个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)
  2. 在下面查看更多关于 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:

  1. Zabbix在最后一个已知位置打开trap文件,并转到步骤3
  2. Zabbix通过比较inode号和定义trap文件的inode号,检查当前打开的文件是否已经轮换。如果没有打开的文件,Zabbix将重置最后一个位置并转到步骤1。
  3. Zabbix从当前打开的文件中读取数据并设置新的位置。
  4. 新数据被解析。如果这是轮询的文件,文件将关闭并返回到步骤2。
  5. 如果没有新的数据,Zabbix 等待1秒钟后,然后回到步骤2。
文件系统

由于Trap文件的执行,Zabbix需要文件系统支持inode来区分文件(该信息由stat()调用获取)。

使用不同 SNMP 协议版本的设置示例

此示例使用 snmptrapd 和 Bash 接收器脚本将陷阱传递到 Zabbix 服务器。

设置:

  1. 配置Zabbix启动SNMP trapper并设置trap文件。 添加到 zabbix_server.conf

StartSNMPTrapper=1 SNMPTrapperFile=/tmp/my_zabbix_traps.tmp

  1. 下载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

  1. 创建一个 SNMP 测试监控项:

Host SNMP interface IP: 127.0.0.1 Key: snmptrap["linkup"] Log time format: yyyyMMdd.hhmmss

  1. 接下来我们将为我们选择的 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

请参阅