4 SNMPトラップ

概要

SNMPトラップの受信は、SNMP対応デバイスに問い合わせるのとは逆の動作です。

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

通常、トラップは何らかの条件変化時に送信され、エージェントはサーバーの162番ポートに接続します(問い合わせに使用されるエージェント側の161番ポートとは異なります)。トラップを使用すると、問い合わせ間隔の途中で発生して見逃される可能性のある短時間の問題を検出できる場合があります。

Zabbix での SNMPトラップ受信は、snmptrapd と、トラップを Zabbix に渡すためのいずれかの仕組み - 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トラップの設定

このアイテムタイプには、次のWebインターフェース設定が必要です。

手順1: ホストにSNMPインターフェースを作成する
  1. データ収集 > ホスト で、ホストを作成するか、既存のホストを編集します。
  2. インターフェース フィールドで、SNMP インターフェースタイプを選択します。
  3. IPアドレス/DNS名とポート番号を入力します。
  4. ドロップダウンから SNMPバージョン を選択し、(SNMPv1, SNMPv2 または SNMPv3)、選択したSNMPバージョンに応じてインターフェースの認証情報を追加します。

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

手順2: アイテムを設定する
  1. ホストに対して、アイテムを作成するか、既存のアイテムを編集します。
  2. キー フィールドで、次のSNMPトラップキーのいずれかを使用します。

    • snmptrap[regexp] - regexp パラメータで指定された正規表現に一致するすべてのSNMPトラップを取得します。regexp が指定されていない場合は、任意のトラップを取得します。
      このパラメータではユーザーマクロとグローバル正規表現がサポートされています。
      戻り値: SNMPトラップ。
      このアイテムはSNMPインターフェースに対してのみ設定できます。
    • snmptrap.fallback - そのインターフェースのいずれの snmptrap[] アイテムでも取得されなかったすべてのSNMPトラップを取得します。
      戻り値: SNMPトラップ。
      このアイテムはSNMPインターフェースに対してのみ設定できます。

現時点では、複数行の正規表現マッチングはサポートされていません。

  1. タイムスタンプを解析するために、情報の種類ログ に設定します。数値 などの他の形式も使用できますが、カスタムトラップハンドラーが必要になる場合があります。

SNMPトラップ監視の設定

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

トラップを読み取るには、Zabbix サーバーまたはプロキシで SNMP trapper プロセスを起動し、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 "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • 受信側を設定します。例:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

設定の変更を反映するには、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 trapper を起動し、トラップファイルを指定します。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/templates/scripts/snmptraps/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 を作成します(最初の 設定要件 に注意してください):

    Type: SNMP trap
    Type of information: Log
    Host interface: SNMP 127.0.0.1
    Key: snmptrap["linkUp"]
    Log time format: yyyyMMdd.hhmmss

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

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

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

SNMPv2 は本番環境で広く使用されている一方で、暗号化や送信元の真正性確認は提供しません。データは平文で送信されるため、これらのプロトコルバージョンはプライベートネットワークなどの安全な環境でのみ使用し、公開ネットワークや第三者のネットワークでは絶対に使用しないでください。

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

SNMPv1 または SNMPv2 トラップの受信を有効にするには、snmptrapd.conf に次の行を追加します。 secret は、SNMP トラップ送信側で設定されている SNMP community string に置き換えてください:

authCommunity log,execute,net secret

次に、snmptrap を使用してテストトラップを送信できます。この例では、一般的な "link up" の 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 などの強力な暗号化方式を使用する場合は、version 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

参照