[comment]: # translation:outdated

[comment]: # ({622befb9-622befb9})
# 3 SNMPトラップ

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

[comment]: # ({d14ae1e6-ff07904b})
#### 概要

SNMPトラップの受信は、SNMP対応デバイスへのクエリとは逆です。

この場合、情報はSNMP対応デバイスからsnmptrapdへ送信され、ファイルからZabbixサーバーまたはZabbixプロキシによって収集または"トラップ"されます。

通常、何らかの条件が変化するとトラップが送信され、エージェントはポート162でサーバーに接続します (クエリに使用されるエージェント側のポート161とは対照的です)。トラップを使用すると、クエリ間隔中に発生し、クエリ データによって見逃される可能性のあるいくつかの短い障害を検出できます。

ZabbixでのSNMPトラップの受信は、**snmptrapd**と、トラップをZabbixに渡すためのメカニズムの1つ (BashまたはPerlスクリプト、SNMPTT)で動作するように設計されています。

::: noteclassic
Zabbixの構成後にトラップ監視をセットアップする最も簡単な方法は、Bashスクリプトソリューションを使用することです。これは、最近のディストリビューションではPerlとSNMPTTが欠落していることが多く、より複雑な構成が必要になるためです。
ただし、このソリューションでは、`traphandle`として構成されたスクリプトが使用されます。
本番システムでのパフォーマンスを向上させるには、組み込みのPerlソリューション(`do perl`オプション付きのスクリプトまたはSNMPTT)を使用してください。
:::

トラップを受信するワークフロー:

1.  `snmptrapd`がトラップを受信
2.  `snmptrapd`はトラップをレシーバースクリプト(Bash、Perl)またはSNMPTTに渡す
3.  受信者はトラップを解析、フォーマットし、ファイルに書き込む
4.  Zabbix SNMPトラッパーは、トラップファイルを読み取り、解析
5.  Zabbixはトラップごとに、受信したトラップアドレスと一致するホストインターフェースを持つすべての"SNMPトラッパー"アイテムを検索します。 マッチングでは、ホスト インターフェースで選択した"IP"または"DNS"のみが使用されることに注意してください。
6.  見つかったアイテムごとに、トラップは`snmptrap[regexp]`の正規表現と比較されます。 トラップは一致した**すべて**のアイテムの値として設定されます。 一致するアイテムが見つからず、snmptrap.fallbackアイテムが存在する場合、トラップはその値として設定されます。
7.  トラップがアイテムの値として設定されていない場合、Zabbixはデフォルトで一致しないトラップをログに記録します。 (これは、管理 > 一般設定 > その他の"マッチしないSNMPトラップをログに記録"で設定されます。)

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

[comment]: # ({3b1ff1a9-657fb528})
##### HAフェイルオーバーに関する注意事項

高可用性(HA)ノードの切り替え中、Zabbixは最後のISO 8601タイムスタンプ内の最後のレコードの後に処理を続行します。同じレコードが見つからない場合は、タイムスタンプのみを使用して最後の位置を識別します。

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

[comment]: # ({4c8b1bcc-a8df124c})
#### SNMPトラップの設定

このアイテムタイプには、次のフロントエンド設定が必要です。

1\. ホスト用のSNMPインターフェースを作成

-   *データ収集 > ホスト*で、ホストを作成/編集し、*インターフェース*フィールドに、インターフェースタイプ"SNMP"を追加、IPまたはDNSアドレスを指定します。<br><br>受信した各トラップのアドレスは、すべてのSNMPインターフェイスのIPおよびDNSアドレスと比較され、対応するホストを見つけます。

2\. アイテムの設定

-   *データ収集 > ホスト*で、必要なアイテムを作成/編集します。
-   *キー*フィールドで、SNMPトラップキーの1つを使用します。

|キー|<|<|
|--|--|------|
|説明|戻り値|コメント|
|**snmptrap**\[regexp\]|<|<|
|**regexp**で指定された[正規表現](/manual/regular_expressions)に一致するすべてのSNMPトラップをキャッチします。 regexpが指定されていない場合、すべてのトラップをキャッチします。|SNMPトラップ|このアイテムは、SNMPインターフェースに対してのみ設定できます。<br>このアイテムキーのパラメーターでは、ユーザーマクロとグローバル正規表現がサポートされています。|
|**snmptrap.fallback**|<|<|
|そのインターフェースのsnmptrap\[\]アイテムのいずれによってもキャッチされなかったすべてのSNMPトラップをキャッチします。|SNMPトラップ|このアイテムは、SNMPインターフェースに対してのみ設定できます。|

::: noteclassic
現時点では、複数行の正規表現一致はサポートされていません。
:::

-   *データ型*をタイムスタンプが解析されるように"ログ"に設定します。"数値"などの他の形式も受け入れられますが、カスタムトラップハンドラーが必要になる場合があります。

[comment]: # ({/4c8b1bcc-a8df124c})

[comment]: # ({56d22f70-a08bce2a})
#### SNMPトラップ監視の設定

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

[comment]: # ({5dbc07a2-581aa946})
##### Zabbixサーバー/プロキシの設定

トラップを読み取るには、ZabbixサーバーまたはプロキシがSNMPトラッパープロセスを開始し、SNMPTTまたはBash/Perlトラップレシーバーによって書き込まれているトラップファイルを指すように構成されている必要があります。これを行うには設定ファイル([zabbix\_server.conf](/manual/appendix/config/zabbix_server)または [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/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh)を使用して、trapperファイルを使用してsnmptrapdからZabbixサーバーにトラップを渡すことができます。設定するには、snmptrapd設定ファイル(`snmptrapd.conf`)に`traphandle`オプションを追加します。 [例](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/Dockerfiles/snmptraps/alpine/conf/etc/snmp/snmptrapd.conf)を参照してください。

::: notetip
snmptrapdは設定の変更を取得するために再起動する必要がある場合があります。
:::

[comment]: # ({/5dbc07a2-581aa946})

[comment]: # ({10d6ab28-0aa82990})
##### Perl トラップ レシーバーの設定

要件: 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 "[PERL RECEIVER SCRIPT へのフルパス]";

- レシーバーを設定します。例:

     $SNMPTrapperFile = '[トラップ ファイル]';
     $DateTimeFormat = '[日時フォーマット]';

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

:::

[comment]: # ({/10d6ab28-0aa82990})

[comment]: # ({77a3b13d-af1e38f9})
##### SNMPTT の設定

最初にSNMPTT を使用するよう、 snmptrapd を設定する必要があります。

::: notetip
最高のパフォーマンスを得るためには**snmptthandler-embedded** を使用してトラップを渡すデーモンとして SNMPTT を構成する必要があります。 [SNMPTTの設定](http://snmptt.sourceforge.net/docs/snmptt.shtml)手順を参照してください。
:::

SNMPTT がトラップを受信するように構成されている場合は'snmptt.ini'を設定します。

1. NET-SNMP パッケージの Perl モジュールの使用を有効にします。

    net\_snmp\_perl\_enable = 1

2. Zabbix によって読み取られるトラップ ファイルにトラップを記録します。

    log_enable = 1
    log_file = [トラップファイル]
    
3. 日付フォーマットを設定します。

    date_time_format = %H:%M:%S %Y/%m/%d = [日付フォーマット]

::: 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 アドレスと比較されます。例:

    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:\ EVENT general .\* "General event" Normal で一般イベントを定義することにより、不明なトラップを処理できます。
:::

[comment]: # ({/77a3b13d-af1e38f9})

[comment]: # ({80d68ddd-cd001892})
##### SNMP トラップのフォーマット

カスタマイズされたすべての Perl トラップ レシーバーと SNMPTT トラップ構成は、次の方法でトラップをフォーマットする必要があります。

    [timestamp] [the trap, part1] ZBXTRAP [address] [the trap, part 2]

内訳

- \[timestamp\] - ログ項目に使用されるタイムスタンプ
- ZBXTRAP - 新しいトラップがこの行で開始することを示すヘッダー
- \[address\] - このトラップのホストを見つけるために使用される IP アドレス

"ZBXTRAP"と"\[address\]"は、処理中にメッセージから切り取られることに注意してください。 トラップが別の方法でフォーマットされている場合、Zabbix は予期せずトラップを解析する可能性があります。

トラップの例:

    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

[comment]: # ({/80d68ddd-cd001892})

[comment]: # ({536ec22b-357f1824})
#### システム要件

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

[comment]: # ({3866234a-6245c6ae})
##### ラージファイルサポート

Zabbixは、SNMPトラッパーのラージファイルをサポートしています。Zabbix が読み取れる最大ファイル サイズは 2\^63 (8 EiB) です。 ファイルシステムによってはファイルサイズに下限があることに注意してください。

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

[comment]: # ({0f27a9bb-0f27a9bb})
##### ログローテーション

Zabbixはログローテーションシステムを提供していません。ログローテーションはユーザが処理する必要があります。<br>
ログのローテーションは、トラップが失われることがないようにまず古いファイルの名前を変更し、その後で削除する必要があります。

1.  Zabbixは最後に確認された場所にある Trap ファイルを開き、ステップ3へ進みます。
2.  Zabbixは現在開いているファイルがローテーションされているかどうか、inode番号と定義された Trap ファイルの
    inode番号を比較することで確認します。
    開いているファイルがない場合、Zabbixは最後の場所をリセットし、ステップ1へ進みます。
3. Zabbixは現在開いているファイルからデータを読み込み、新しい場所を設定します。
4. 新しいデータがパースされます。ローテートされたファイルの場合、ファイルは閉じられ、ステップ2に戻ります。
5. 新しいデータがない場合、Zabbix は 1 秒間スリープし、ステップ 2 に戻ります。

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

[comment]: # ({608a14bd-608a14bd})
##### ファイルシステム

Trap ファイルの実装のため、Zabbixはファイルを区別するために inodeをサポートする<br>
ファイルシステムを必要とします(この情報は stat() 呼出で取得します)。

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

[comment]: # ({8619e951-ee69482d})
#### 異なる SNMP プロトコル バージョンを使用したセットアップ例

この例では、snmptrapd と Bash レシーバー スクリプトを使用して、トラップを Zabbix サーバーに渡します。

設定：

1.  SNMP トラッパーを起動し、トラップ ファイルを設定するように Zabbix を構成します。 `zabbix_server.conf`に以下を追加:

    StartSNMPTrapper=1
    SNMPTrapperFile=/tmp/my_zabbix_traps.tmp

2.  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

4.  SNMP アイテム TEST:\ を作成します。

    ホスト SNMP インターフェース IP: 127.0.0.1
    キー: `snmptrap["linkup"]`
    ログタイムフォーマット: yyyyMMdd.hhmmss

5.  選択した SNMP プロトコル バージョンに対して`snmptrapd`を構成し、`snmptrap`ユーティリティを使用してテスト トラップを送信します。

##### SNMPv1, SNMPv2

SNMPv1 および SNMPv2 プロトコルは"コミュニティ ストリング"認証に依存しています。 以下の例では、コミュニティ ストリングとして"secret"を使用します。 SNMP トラップ送信側で同じ値に設定する必要があります。

SNMPv2 は実稼働環境でまだ広く使用されていますが、暗号化と実際の送信者認証を提供していないことに注意してください。 データはプレーン テキストとして送信されるため、これらのプロトコル バージョンは、プライベート ネットワークなどの安全な環境でのみ使用し、公共またはサード パーティのネットワークでは決して使用しないでください。

SNMP バージョン 1 は、64 ビット カウンターをサポートしておらず、レガシー プロトコルと見なされているため、最近では実際には使用されていません。

SNMPv1 または SNMPv2 トラップの受け入れを有効にするには、次の行を `snmptrapd.conf` に追加する必要があります。 "secret"を、SNMP トラップ送信者で構成された SNMP コミュニティ文字列に置き換えます。

    authCommunity log,execute,net secret

次に`snmptrap`を使用してテストトラップを送信します。 この例では、共通の"linkUp" 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

:::noteimportant
このユーザー セキュリティ モデルのスクリプトを実行できるようにする "execute" キーワードに注意してください。
:::

    # 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` に同様の行が表示されます:

    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

[comment]: # ({/8619e951-ee69482d})

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

-   [Zabbix blog article on SNMP
    traps](https://blog.zabbix.com/snmp-traps-in-zabbix)
-   [Configuring snmptrapd (net-snmpの公式ドキュメント)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd)
-   [Configuring snmptrapd to receive SNMPv3 notifications (net-snmpの公式ドキュメント)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd_to_receive_SNMPv3_notifications)

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