[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]: # ({7db2f34b-0aa82990})
##### Perlトラップレシーバーの設定

要件: Perl、--enable-embedded-perl 付きでコンパイルされた Net-SNMP（Net-SNMP 5.4 以降ではデフォルトで有効）

Perl トラップレシーバー（misc/snmptrap/zabbix\_trap\_receiver.pl を参照）を使用すると、snmptrapd から Zabbixサーバーへ直接トラップを渡すことができます。設定するには、次のようにします。

-   snmptrapd の設定ファイル（snmptrapd.conf）に Perl スクリプトを追加します。例:

```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
最高のパフォーマンスを得るには、トラップを渡すために **snmptthandler-embedded** を使用するデーモンとして SNMPTT を設定してください。手順については、[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\] - このトラップに対応するホストを見つけるために使用されるIPアドレス

処理中に、メッセージから "ZBXTRAP" と "\[address\]" は削除されることに注意してください。
トラップがこれ以外の形式になっている場合、Zabbixがトラップを想定外に解析する可能性があります。

トラップの例:

```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]: # ({40179940-357f1824})
#### システム要件

::: noteclassic
アイテムの値が正しい形式で表示されるようにするため、[MIBファイルをインストールする](/manual/config/items/itemtypes/snmp/mibs)ことを推奨します。
MIBファイルがない場合、UTF-8ではなくHEXで値が表示される、またはその逆になるなど、書式設定の問題が発生する可能性があります。 
:::

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

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

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

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

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

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

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

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

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

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

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

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

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

セットアップ:

1.  Zabbix で SNMP trapper を起動し、
    トラップファイルを設定します。`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/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh
```

必要に応じて、スクリプト内の ZABBIX_TRAPS_FILE 変数を調整してください。デフォルト値を使用するには、
まず親ディレクトリを作成します:

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

3. `snmtrapd.conf` に以下を追加します（動作する[例](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/Dockerfiles/snmptraps/alpine/conf/etc/snmp/snmptrapd.conf)も参照してください）

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

:::notetip
設定変更を反映するために、snmptrapd の再起動が必要になる場合があります。
:::

4.  SNMP アイテム TEST を[作成](/manual/config/items/item)します（初期の[設定要件](/manual/config/items/itemtypes/snmptrap#configuring-snmp-traps)に注意してください）:\

    タイプ: SNMPトラップ\
    情報の型: ログ
    ホストインターフェース: SNMP 127.0.0.1\
    キー: `snmptrap["linkUp"]`\
    ログの時間形式: yyyyMMdd.hhmmss

ISO 8601 の日付および時刻形式が使用されていることに注意してください。

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

##### SNMPv1、SNMPv2

SNMPv1 および SNMPv2 プロトコルは、「コミュニティ文字列」認証に依存しています。以下の例では、
コミュニティ文字列として "secret" を使用します。これは SNMP トラップ送信元でも同じ値に設定する必要があります。

本番環境で依然として広く使用されている一方で、SNMPv2 は
暗号化も実際の送信元認証も提供しない点に注意してください。データは平文で送信されるため、 
これらのプロトコルバージョンは、プライベートネットワークのような安全な環境でのみ使用し、 
パブリックネットワークや第三者のネットワーク上では決して使用しないでください。

SNMP version 1 は 64 ビットカウンターをサポートしておらず、
レガシープロトコルと見なされているため、現在ではほとんど使用されていません。

SNMPv1 または SNMPv2 トラップの受信を有効にするには、`snmptrapd.conf` に以下の行を追加します。
"secret" は、SNMP トラップ送信元で設定されている SNMP コミュニティ文字列に置き換えてください:

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

次に、`snmptrap` を使用してテストトラップを送信できます。この例では、一般的な "link up" OID を使用します:

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

##### SNMPv3

SNMPv3 は SNMPv1/v2 のセキュリティ上の問題に対処し、認証と暗号化を提供します。
認証方式として MD5 または複数の SHA を、暗号方式として DES/複数の AES を使用できます。

SNMPv3 トラップの受信を有効にするには、`snmptrapd.conf` に以下の行を追加します:

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

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

```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 をサポートしていません。
あわせて参照: [Strong Authentication or Encryption](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]: # ({/001c0e2c-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})
