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サーバーへ直接トラップを渡すことができます。設定するには、次のようにします。

  • snmptrapd の設定ファイル(snmptrapd.conf)に Perl スクリプトを追加します。例:
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 を使用するように設定されている必要があります。

最高のパフォーマンスを得るには、トラップを渡すために snmptthandler-embedded を使用するデーモンとして SNMPTT を設定してください。手順については、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 プロトコルは、「コミュニティ文字列」認証に依存しています。以下の例では、 コミュニティ文字列として "secret" を使用します。これは SNMP トラップ送信元でも同じ値に設定する必要があります。

本番環境で依然として広く使用されている一方で、SNMPv2 は 暗号化も実際の送信元認証も提供しない点に注意してください。データは平文で送信されるため、 これらのプロトコルバージョンは、プライベートネットワークのような安全な環境でのみ使用し、 パブリックネットワークや第三者のネットワーク上では決して使用しないでください。

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

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

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

参照