[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]: # ({c50351de-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/templates/scripts/snmptraps/zabbix_trap_handler.sh)
を使用すると、トラッパーファイルを使って snmptrapd から Zabbixサーバーへトラップを渡すことができます。設定するには、`traphandle` オプションを snmptrapd の設定ファイル (`snmptrapd.conf`) に追加します。詳細は[例](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/config/snmptraps/snmp/snmptrapd.conf)を参照してください。

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

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

[comment]: # ({7db2f34b-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
perl do "[PERLレシーバースクリプトへのフルパス]";
```

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

```ini
$SNMPTrapperFile = '[TRAPファイル]';
$DateTimeFormat = '[日付時刻フォーマット]';
```

:::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]: # ({0cbbed23-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]: # ({/0cbbed23-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]: # ({cc0a20fd-ee69482d})
#### 異なるSNMPプロトコルバージョンを使用したセットアップ例

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

セットアップ:

1.  SNMP trapper を起動し、トラップファイルを設定するように Zabbix を構成します。`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/templates/scripts/snmptraps/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/templates/config/snmptraps/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トラップ<br>
    情報の型: ログ<br>
    ホストインターフェース: SNMP 127.0.0.1<br>
    キー: `snmptrap["linkUp"]`<br>
    ログ時間の形式: 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]: # ({/cc0a20fd-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})
