You are viewing documentation for the development version, it may be incomplete.
Join our translation project and help translate Zabbix documentation into your native language.

3 SNMPトラップ

概要

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

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

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

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

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トラップをログに記録"で設定されます。)
HAフェイルオーバーに関する注意事項

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

SNMPトラップの設定

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

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

  • データ収集 > ホストで、ホストを作成/編集し、インターフェースフィールドに、インターフェースタイプ"SNMP"を追加、IPまたはDNSアドレスを指定します。

    受信した各トラップのアドレスは、すべてのSNMPインターフェイスのIPおよびDNSアドレスと比較され、対応するホストを見つけます。

2. アイテムの設定

  • データ収集 > ホストで、必要なアイテムを作成/編集します。
  • キーフィールドで、SNMPトラップキーの1つを使用します。
キー
説明 戻り値 コメント
snmptrap[regexp]
regexpで指定された正規表現に一致するすべてのSNMPトラップをキャッチします。 regexpが指定されていない場合、すべてのトラップをキャッチします。 SNMPトラップ このアイテムは、SNMPインターフェースに対してのみ設定できます。
このアイテムキーのパラメーターでは、ユーザーマクロとグローバル正規表現がサポートされています。
snmptrap.fallback
そのインターフェースのsnmptrap[]アイテムのいずれによってもキャッチされなかったすべてのSNMPトラップをキャッチします。 SNMPトラップ このアイテムは、SNMPインターフェースに対してのみ設定できます。

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

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

SNMPトラップ監視の設定

Zabbixサーバー/プロキシの設定

トラップを読み取るには、ZabbixサーバーまたはプロキシがSNMPトラッパープロセスを開始し、SNMPTTまたはBash/Perlトラップレシーバーによって書き込まれているトラップファイルを指すように構成されている必要があります。これを行うには設定ファイル(zabbix_server.confまたは zabbix_proxy.conf)を編集します。

StartSNMPTrapper=1
       SNMPTrapperFile=[TRAP FILE]

systemdパラメーターPrivateTmpが使用されている場合、このファイルは/tmpでは機能しません。

Bashトラップレシーバーの設定

要件: snmptrapdのみ。

Bashトラップレシーバースクリプトを使用して、trapperファイルを使用してsnmptrapdからZabbixサーバーにトラップを渡すことができます。設定するには、snmptrapd設定ファイル(snmptrapd.conf)にtraphandleオプションを追加します。 を参照してください。

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

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レシーバースクリプトへのフルパス]";
  • レシーバーを設定します。例:
$SNMPTrapperFile = '[TRAPファイル]';
       $DateTimeFormat = '[日付時刻フォーマット]';

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

スクリプト名が引用符で囲まれていない場合、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
SNMPTTの設定

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

最高のパフォーマンスを得るために、SNMPTTはsnmptthandler-embeddedを使用してデーモンとして設定し、トラップを渡すようにしてください。SNMPTTの設定の手順を参照してください。

SNMPTTがトラップを受信するように設定されたら、snmptt.iniを設定します:

  1. NET-SNMPパッケージのPerlモジュールの使用を有効にします:
net_snmp_perl_enable = 1
  1. Zabbixが読み取るトラップファイルにトラップを記録します:
log_enable = 1
       log_file = [TRAP FILE]
  1. 日時フォーマットを設定します:
date_time_format = %Y-%m-%dT%H:%M:%S%z

"net-snmp-perl"パッケージはRHEL 8.0-8.2で削除され、RHEL 8.3で再追加されました。詳細は既知の問題を参照してください。

次に、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)
  1. SNMPトラップのフォーマットについては、以下を参照してください。

不明なトラップは使用しないでください。Zabbixはそれらを認識できません。
不明なトラップは、snmptt.confで一般的なイベントを定義することで処理できます:

EVENT general .* "General event" Normal
SNMPトラップのフォーマット

すべてのカスタマイズされたPerlトラップレシーバーおよびSNMPTTトラップの設定は、以下のようにトラップをフォーマットする必要があります:

[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はトラップを予期せず解析する可能性があります。

トラップの例:

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インターフェースに対して、次のようなトラップになります:

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

システム要件

アイテム値が正しい形式で表示されるように、MIBファイルをインストールすることを推奨します。 MIBファイルがない場合、値がUTF-8ではなくHEXで表示される、またはその逆など、フォーマットの問題が発生する可能性があります。

ラージファイルサポート

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

ログローテーション

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

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

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

異なるSNMPプロトコルバージョンを使用したセットアップ例

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

セットアップ手順:

  1. ZabbixでSNMPトラッパーを起動し、トラップファイルを設定します。zabbix_server.confに以下を追加します:
StartSNMPTrapper=1
       SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Bashスクリプトを/usr/sbin/zabbix_trap_handler.shにダウンロードします:
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変数を調整してください。デフォルト値を使用する場合は、 親ディレクトリを先に作成してください:

mkdir -p /var/lib/zabbix/snmptraps
  1. snmtrapd.confに以下を追加します(動作するを参照)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

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

  1. SNMPアイテムTESTを作成します(初期の設定要件に注意):

    タイプ: SNMPトラップ
    情報のタイプ: ログ ホストインターフェース: SNMP 127.0.0.1
    キー: snmptrap["linkUp"]
    ログ時刻フォーマット: yyyyMMdd.hhmmss

ISO 8601の日付と時刻のフォーマットが使用されていることに注意してください。

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

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

SNMPv2は現在も多くの本番環境で使用されていますが、暗号化や実際の送信者認証を提供しません。 データは平文で送信されるため、これらのプロトコルバージョンはプライベートネットワークなどの安全な環境でのみ使用し、 パブリックネットワークや第三者ネットワークでは絶対に使用しないでください。

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

SNMPv1またはSNMPv2トラップの受信を有効にするには、snmptrapd.confに以下の行を追加します。 「secret」はSNMPトラップ送信側で設定したコミュニティストリングに置き換えてください:

authCommunity log,execute,net secret

次に、snmptrapを使用してテストトラップを送信できます。この例では一般的な「リンクアップ」OIDを使用します:

snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3

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

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

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

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

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

AES192やAES256などの強力な暗号化方式を使用したい場合は、 バージョン5.8以降のnet-snmpを使用してください。configure オプション: --enable-blumenthal-aesで再コンパイルが必要な場合があります。 古いバージョンのnet-snmpはAES192/AES256をサポートしていません。 参考: Strong Authentication or Encryption

検証

どちらの例でも、/var/lib/zabbix/snmptraps/snmptraps.logに以下のような行が表示されます:

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のアイテム値は次のようになります:

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を使った例:

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

参照