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 trapper がトラップファイルを読み取り、解析します。
  5. 各トラップについて、Zabbix は受信したトラップのアドレスに一致するホストインターフェースを持つすべての SNMP trapper アイテムを検索します。 この照合では、ホストインターフェースで選択された 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トラッパーを起動し、トラップファイルを設定します。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プロトコルは、「コミュニティ文字列」認証に依存します。以下の例では、 コミュニティ文字列として「secret」を使用します。SNMPトラップ送信元でも同じ値を設定する必要があります。

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

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

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

authCommunity log,execute,net secret

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

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

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

snmptrapd.confに以下の行を追加して、SNMPv3トラップを受信するようにsnmptrapdを設定します。

# 認証とプライバシーを使用するSNMPv3 USMユーザーを作成
createUser -e <engineID> <securityName> SHA <authKey> AES <privKey>
# ユーザーによるトラップのログ記録とトラップハンドラースクリプトの実行を許可
authUser log,execute <securityName>

例:

createUser -e 0x8000000001020304 traptest SHA myAuthPassword AES myPrivPassword
authUser log,execute traptest

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

SNMPv3トラップの設定をテストするには、以下のコマンドを使用してテストトラップを送信します。

snmptrap -v 3 -n "" -a SHA -A myAuthPassword -x AES -X myPrivPassword -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

参照