[comment]: # translation:outdated

[comment]: # ({49f474a1-622befb9})
# 3 SNMP 陷阱

[comment]: # ({/49f474a1-622befb9})

[comment]: # ({258e22b6-ff07904b})
####概述

接收 SNMP 陷阱与查询启用 SNMP 的设备相反。

在这种情况下，信息从启用 SNMP 的设备发送到 snmptrapd，并由 Zabbix 服务器或 Zabbix 代理从文件收集或“捕获”。

通常，陷阱是在某些条件发生变化时发送的，代理会通过端口 162 连接到服务器（而不是用于查询的代理端的端口 161）。使用陷阱可能会检测到查询间隔期间发生的一些短暂问题，而查询数据可能会遗漏这些问题。

在 Zabbix 中接收 SNMP 陷阱要与 **snmptrapd** 一起使用，以及将snmp陷阱传递给 Zabbix 的机制之一，Bash 或 Perl 脚本或 SNMPTT 。

::: noteclassic
配置 Zabbix 后设置陷阱监控的最简单方法是使用 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 陷阱”配置的。）

[comment]: # ({/258e22b6-ff07904b})

[comment]: # ({3b1ff1a9-657fb528})
#####HA 故障转移注意事项

在高可用性（HA）节点切换期间，Zabbix 将在最后一个 ISO 8601 时间戳内的最后一条记录之后继续处理；如果未找到相同的记录，则仅使用时间戳来识别最后位置。

[comment]: # ({/3b1ff1a9-657fb528})

[comment]: # ({7a9bcd70-a8df124c})
#### - 配置 SNMP 陷阱

在前端配置以下字段是特定于该监控项类型：

- 您的主机必须有 SNMP 接口

在 *配置 → 主机* 中，在 **主机接口** 字段中填入正确的 IP 或 DNS 地址设置 SNMP 接口。将每个接收到的陷阱的地址与所有 SNMP 接口的 IP 和 DNS 地址进行比较，以找到相应的主机。

- 配置监控项

在 **键值** 字段中，使用 SNMP 陷阱key之一：

|键|<|<|
|---|-|-|
|描述|返回值|注释|
|**snmptrap**\[regexp\]|<|<|
|捕获与 **regexp** 中指定的 [正则表达式](/manual/regular_expressions) 匹配的所有 SNMP 陷阱。如果未指定 regexp，则捕获任何陷阱。|SNMP 陷阱|此监控项只能为 SNMP 接口设置。<br>此监控项键的参数支持用户宏和全局正则表达式。|
|snmptrap.fallback|<|<|
|捕获所有未被该接口的任何 snmptrap\[\] 监控项捕获的 SNMP 陷阱。|SNMP 陷阱|只能为 SNMP 接口设置此监控项。|

::: noteclassic
此处不支持多行正则表达式匹配。
:::

将 **信息类型** 设置为“Log”以获取要解析的时间戳。 请注意，其他格式（例如“数字”）也是可以接受的，但可能需要自定义陷阱处理程序。

::: notetip
要使 SNMP 陷阱监控工作，它必须首先正确设置（见下文）。
:::

[comment]: # ({/7a9bcd70-a8df124c})

[comment]: # ({56d22f70-a08bce2a})
#### 设置SNMP trap监控

[comment]: # ({/56d22f70-a08bce2a})

[comment]: # ({12c8ba6b-581aa946})
##### 配置 Zabbix Server/Proxy

要读取trap，必须将Zabbix Server/Proxy配置为启动SNMPtrap进程，并指向由SNMPTT或perl trap接收器写入的trap文件。为此，编辑配置文件
([zabbix\_server.conf](/manual/appendix/config/zabbix_server) or
[zabbix\_proxy.conf](/manual/appendix/config/zabbix_proxy)):

```ini
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
```

::: notewarning
如果使用systemd参数
**[PrivateTmp](http://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateTmp=)**
则该文件不太可能在*/tmp*下工作。
:::

##### 配置 Bash 陷阱接收器

要求：只有snmptrapd。

Bash 陷阱接收器 [脚本](https://raw.githubusercontent.com/zabbix/zabbix-docker/master/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh)
可用于将陷阱直接从 snmptrapd 传递给 Zabbix 服务器。 要配置它，请将 `traphandle` 选项添加到 snmptrapd 配置文件 (`snmptrapd.conf`)，参见 [示例](https://raw.githubusercontent.com/zabbix/zabbix-docker/master/Dockerfiles/snmptraps/alpine/conf/etc/snmp/snmptrapd.conf).

:::notetip
snmptrapd 可能需要重新启动才能获取其配置更改。
:::

[comment]: # ({/12c8ba6b-581aa946})

[comment]: # ({7db2f34b-0aa82990})
##### 配置 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
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
```

-   配置接收器，例如:

```ini
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
```

:::notetip
snmptrapd 可能需要重新启动才能使配置更改生效。
:::

::: notetip
如果没有引用脚本名称，snmptrapd 将拒绝启动并显示消息，类似于这些：<br><br>

```yaml
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
```

:::

[comment]: # ({/7db2f34b-0aa82990})

[comment]: # ({064a37d6-af1e38f9})
##### 配置 SNMPTT

首先，snmptrapd 应该配置为使用 SNMPTT。

::: notetip
为获得最佳性能，SNMPTT 应配置使用 **snmptthandler-embedded** 将陷阱传递给它的守护进程。请参阅 [配置 SNMPTT](http://snmptt.sourceforge.net/docs/snmptt.shtml) 的说明。
:::

当 SNMPTT 配置为接收陷阱时，配置 `snmptt.ini`：

1.  启用 NET-SNMP 包中的 Perl 模块：

```ini
net_snmp_perl_enable = 1
```

2.  将陷阱记录到 Zabbix 将读取的陷阱文件中：

```ini
log_enable = 1
log_file = [TRAP FILE]
```
    
3.  设置日期时间格式：

```ini
date_time_format = %Y-%m-%dT%H:%M:%S%z
```

::: notewarning
“net-snmp-perl”包已在RHEL 8.0-8.2被移除；但在 RHEL 8.3 中重新添加。有关详细信息，请参阅[已知问题](/manual/installation/known_issues#snmp_traps)。
:::

现在格式化陷阱以便 Zabbix 识别它们（编辑 snmptt.conf）：

1.  每个FORMAT格式化语句应以“ZBXTRAP  \[address\]”开头，其中\[address\] 将与 Zabbix 上 SNMP 接口的 IP 和 DNS 地址进行比较。例如：:

```ini
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
```

2.  在下面查看更多关于 SNMP 陷阱格式的信息

::: noteimportant
不要使用未知的陷阱 - Zabbix 将无法识别它们。 可以通过在 snmptt.conf 中定义一般事件来处理未知陷阱：<br><br>

```ini
EVENT general .* "General event" Normal
```

:::

[comment]: # ({/064a37d6-af1e38f9})

[comment]: # ({599e4c33-cd001892})
##### SNMP 陷阱格式

所有自定义的 Perl 陷阱接收器和 SNMPTT 陷阱配置必须按以下方式格式化陷阱：

```yaml
[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]
```

在哪里

-   \[timestamp\] - “%Y-%m-%dT%H:%M:%S%z”格式的时间戳
-   ZBXTRAP - 头表示一个新的陷阱从这一行开始
-   \[address\] - 用于查找此trap的主机的 IP 地址

请注意，“ZBXTRAP”和“\[address\]”将在处理过程中从消息中删除。 如果陷阱以其他方式格式化，Zabbix 可能会意外地解析陷阱。

trap示例：

```bash
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 接口出现以下陷阱：

```bash
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
```

[comment]: # ({/599e4c33-cd001892})

[comment]: # ({536ec22b-357f1824})
#### 系统要求

[comment]: # ({/536ec22b-357f1824})

[comment]: # ({3866234a-6245c6ae})
##### 大文件支持

Zabbix为SNMP trap文件提供了“大文件支持”。Zabbix可以读取的最大文件大小为2^63（8 EiB）。请注意，文件系统可能会对文件大小添加下限。

[comment]: # ({/3866234a-6245c6ae})

[comment]: # ({0f27a9bb-0f27a9bb})
##### 日志轮询

Zabbix不提供任何日志轮询系统（它应由用户处理）。
日志轮询应该首先重命名旧文件，然后才能将其删除，以免丢失trap：\

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

[comment]: # ({/0f27a9bb-0f27a9bb})

[comment]: # ({5a17c0e4-608a14bd})
##### 文件系统

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

[comment]: # ({/5a17c0e4-608a14bd})

[comment]: # ({6095ffe0-ee69482d})
#### 使用不同 SNMP 协议版本的设置示例

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

设置：

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

```ini
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
```

2.  下载Bash脚本到 `/usr/sbin/zabbix_trap_handler.sh`:

```bash
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 版本之前，请使用此链接获取脚本[下载](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh).

如有必要，调整脚本中的 ZABBIX_TRAPS_FILE 变量。 要使用默认值，首先创建父目录：

```bash
mkdir -p /var/lib/zabbix/snmptraps
```

3.将以下内容添加到`snmtrapd.conf`（参考工作[示例]refer to working [example](https://raw.githubusercontent.com/zabbix/zabbix-docker/master/Dockerfiles/snmptraps/alpine/conf/etc/snmp/snmptrapd.conf)）

```ini
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
```

:::notetip
snmptrapd 可能需要重新启动才能获取其配置更改。
:::

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

    Host SNMP interface IP: 127.0.0.1\
    Key: `snmptrap["linkUp"]`\
    Log time format: yyyy-MM-ddThh:mm:ss

请注意，使用的是 ISO 8601 日期和时间格式。

5.  接下来我们将为我们选择的 SNMP 协议版本配置 `snmptrapd`，并使用 `snmptrap` 实用程序发送测试陷阱。

##### SNMPv1, SNMPv2

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:

```ini
authCommunity log,execute,net secret
```

接下来我们可以使用 snmptrap 发送测试陷阱。 我们将在此示例中使用通用的“link up”OID：

```bash
snmptrap -v 2c -c secret localhost '' linkUp.0
```

##### SNMPv3

SNMPv3 解决了 SNMPv1/v2 安全问题并提供身份验证和加密。您可以使用 SHA 或 MD5 作为身份验证方法，使用 AES 或 DES 作为密码。

要启用接受 SNMPv3，请将以下行添加到 `snmptrapd.conf`：

```ini
createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest
```

:::noteimportant
请注意允许为此用户安全模型执行脚本的“执行”关键字。
:::

```bash
snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0
```

::: notewarning
如果您希望使用 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”中看到类似的行：

```bash
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 中的监控项值将是：

```bash
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 示例：

```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
```

[comment]: # ({/6095ffe0-ee69482d})

[comment]: # ({91956d23-75026475})
#### 请参阅

- · [关于SNMP traps的Zabbix博客文章](https://blog.zabbix.com/snmp-traps-in-zabbix)
- · [配置snmptrapd（net-snmp官方文档）](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd)
- · [配置snmptrapd接收SNMPv3通知（net-snmp官方文档）](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd_to_receive_SNMPv3_notifications)

[comment]: # ({/91956d23-75026475})
