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 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/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 プロトコルは、「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 のような強力な暗号方式を使用したい場合は、バージョン 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

参照