# - \#3 SNMP trap

#### 概述

接收SNMP trap与查询支持SNMP的设备相对。

在这种情况下，信息是从支持SNMP的设备发送的，由Zabbix收集或"trapped"。

通常情况下发送trap是发生变化并且代理连接到端口162上的服务器（而不是用于查询的代理端的端口161）。
使用trap可以检测在查询间隔期间发生的一些可能被查询数据丢失的短期问题。

在Zabbix中接收SNMP
trap旨在使用**snmptrapd**和内置机制之一来传递trap到Zabbix -
一个perl脚本或SNMPTT。

接收trap的工作流程：

1.  **snmptrapd** 收到trap
2.  snmptrapd将trap传递给SNMPTT或调用Perl接收器
3.  SNMPTT或Perl trap接收器解析，格式化并将trap写入文件
4.  Zabbix SNMP trap读取并解析trap文件
5.  对于每个trap，Zabbix发现主机接口与接收的trap地址匹配的所有“SNMP
    trap”监控项。请注意，在匹配期间只使用主机接口中选定的“IP”或“DNS”。
6.  对于每个找到的监控项，将trap与“snmptrap\[regexp\]”中的regexp进行比较。
    trap设置为**all**匹配项的值。如果没有找到匹配的监控项，并且有一个“snmptrap.fallback”监控项，则将trap设置为该值。
7.  如果trap未设置为任何监控项的值，Zabbix默认记录不匹配的trap。（这由管理 -
    >常规 - >其它中的“记录不匹配的SNMP trap（Log unmatched SNMP
    traps）”配置。）

#### - 配置SNMP Trap

在Web前端配置以下字段用于此监控项类型：

-   你的主机必须具有SNMP接口

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

-   配置监控项

在**Key**字段中使用一个SNMP trap Key：

|Key|<|<|
|---|-|-|
|描述                                                                                                                              返|值      注释|<|
|snmptrap\[regexp\]|<|<|
|捕获与[正则表达式](/zh/manual/regular_expressions)中指定的正则表达式匹配的所有SNMP trap。如果正则表达式未指定，则捕获任何trap。   SNMP trap   该监控项只能用于SNMP接口<br>|<|<此监控项从Zabbix **2.0.0.**开始支持<br>*注意*: 从Zabbix 2.0.5开始，该监控项的参数支持用户宏和全局正则表达式。|
|snmptrap.fallback|<|<|
|捕获未被该接口的任何snmptrap\[\]监控项捕获的所有SNMP trap。                                                                       SNMP trap   该监控项只能|于SNMP接口。<br>|<该监控项从Zabbix **2.0.0.**以后支持|

::: noteclassic
目前不支持多行正则表达式匹配。
:::

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

::: notetip
要使SNMP trap监控工作，必须首先正确设置。
:::

#### - Setting up SNMP trap monitoring

##### 配置 Zabbix 服务器/代理服务器

要读取trap，必须将Zabbix服务器或代理服务器配置为启动SNMP
trap进程，并指向由SNMPTT或perl
trap接收器写入的trap文件。为此，请编辑配置文件([zabbix\_server.conf](/zh/manual/appendix/config/zabbix_server)
或者 [zabbix\_proxy.conf](/zh/manual/appendix/config/zabbix_proxy))：

1.  StartSNMPTrapper=1
2.  SNMPTrapperFile=\[TRAP FILE\]

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

##### 配置SNMPTT

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

<note
tip>为了获得最佳性能，应将SNMPTT配置为使用**snmptthandler-embedded**的守护进程，并将trap传递给它。有关SNMPTT的配置，请查看其主页上的说明：\
<http://snmptt.sourceforge.net/docs/snmptt.shtml>
:::

当SNMPTT配置为接收trap时，配置SNMPTT记录trap：

1.  将trap记录到Zabbix将读取的trap文件中：\
    log\_enable = 1\
    log\_file = \[TRAP FILE\]
2.  设置日期时间格式：\
    date\_time\_format = %H:%M:%S %Y/%m/%d = \[DATE TIME FORMAT\]

现在格式化Zabbix的trap来识别它们（编辑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 trap格式说明，了解更多信息。

::: noteimportant
不要使用未知的trap -
Zabbix将无法识别它们。未知trap可以通过在snmptt.conf中定义一个常规事件来处理：\
EVENT general .\* "General event" Normal
:::

##### 配置 Perl trap 接收器

要求：Perl，Net-SNMP使用--enable-embedded-perl编译（默认情况下从Net-SNMP
5.4支持）\
\
Perl
trap接收器（查找misc/snmptrap/zabbix\_trap\_receiver.pl）可以直接从snmptrapd将trap传递给Zabbix服务器。配置过程:

-   将perl脚本添加到snmptrapd配置文件（snmptrapd.conf）中，例如：\
    perl do "\[FULL PATH TO PERL RECEIVER SCRIPT\]";
-   配置接收器, 例如:\
    $SNMPTrapperFile = '\[TRAP FILE\]';\
    $DateTimeFormat = '\[DATE TIME FORMAT\]';

::: notetip
如果没有引用脚本名称，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 trap 格式

所有定制的perl trap接收器和SNMPTT trap配置必须按以下方式格式化trap：
**\[timestamp\] \[the trap, part 1\] ZBXTRAP \[address\] \[the trap,
part 2\]**, 说明

-   \[timestamp\] - 用于日志监控项的时间戳
-   ZBXTRAP - 头表示新的trap从此行开始
-   \[address\] - 用于查找此trap的主机的IP地址

注意，“ZBXTRAP”和“\[address\]”将在处理过程中从消息中删除。如果trap格式化为其它方式，Zabbix也许能意外的解析trap。\
\
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\
This will result in the following trap for SNMP interface with
IP=192.168.1.1:\
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.

#### - 系统要求

##### 大文件支持

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 sleep 1秒钟，然后回到步骤2。

##### 文件系统

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

#### - 设置示例

本示例使用snmptrapd + SNMPTT将陷阱传递给Zabbix服务器。设置：

1.  **zabbix\_server.conf** - 配置Zabbix启动SNMP trap并设置trap文件：\
    StartSNMPTrapper=1\
    SNMPTrapperFile=/tmp/my\_zabbix\_traps.tmp
2.  **snmptrapd.conf** - 添加SNMPTT作为trap处理程序：\
    traphandle default snmptt
3.  **snmptt.ini** - 配置输出文件和时间格式：\
    log\_file = /tmp/my\_zabbix\_traps.tmp\
    date\_time\_format = %H:%M:%S %Y/%m/%d
4.  **snmptt.conf** - 定义默认trap格式：\
    EVENT general .\* "General event" Normal\
    FORMAT ZBXTRAP $aA $ar
5.  创建一个SNMP监控项测试：\
    Host's SNMP interface IP: 127.0.0.1\
    Key: snmptrap\["General"\]\
    Log time format: hh:mm:ss yyyy/MM/dd

结果如下：

1.  用于发送trap的命令：\
    snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6
    33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring000"
2.  接收到的trap:\
    15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event"
    localhost - ZBXTRAP 127.0.0.1 127.0.0.1
3.  测试监控项的值:\
    15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event"
    localhost - 127.0.0.1

<note
tip>这个简单的例子使用SNMPTT作为**traphandle**。为了在生产系统上获得更好的性能，请使用嵌入式Perl将trap从snmptrapd传递到SNMPTT或直接传递到Zabbix。
:::

#### - 请参阅

-   [基于CentOS的SNMP
    trap教程zabbix.org](https://www.zabbix.org/wiki/Start_with_SNMP_traps_in_Zabbix)
