Sidebar

Zabbix Summit 2022
Register for Zabbix Summit 2022

3 SNMP trap

概要

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

この場合、情報はSNMP対応デバイスから送信され、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トラップをログに記録" で設定されます。)

SNMP トラップの設定

フロントエンドで以下のフィールドを設定することは、このアイテムタイプ特有のものです。

  • ホストには SNMP インターフェースが必要です

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

  • アイテムの設定

キー フィールドでは、SNMP トラップ キーのいずれかを使用します。

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

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

タイムスタンプを解析するには、データ型を'ログ' に設定します。 '数値(整数)'など、他の形式も使用できますが、カスタム トラップ ハンドラが必要になる場合があることに注意してください。

SNMP トラップ監視を機能させるには、まず正しく設定する必要があります (以下を参照)。

SNMP Trap 監視の設定

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

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

StartSNMPTrapper=1
       SNMPTrapperFile=[トラップファイル]

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

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

要件: snmptrapd のみ。

Bashトラップ レシーバー スクリプトを使用して、snmptrapd から直接 Zabbix サーバーにトラップを渡すことができます。設定するには、snmptrapd 設定ファイル (snmptrapd.conf) に traphandle オプションを追加します。 [例] (https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/Dockerfiles/snmptraps/alpine /conf/etc/snmp/snmptrapd.conf)。

SNMPTT の設定

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

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

SNMPTT がトラップを受信するように構成されている場合は'snmptt.ini'を設定します。

  1. NET-SNMP パッケージの Perl モジュールの使用を有効にします。

    net_snmp_perl_enable = 1

  2. Zabbix によって読み取られるトラップ ファイルにトラップを記録します。

    log_enable = 1 log_file = [トラップファイル]

  3. 日付フォーマットを設定します。

    date_time_format = %H:%M:%S %Y/%m/%d = [日付フォーマット]

"net-snmp-perl"パッケージは RHEL/CentOS 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)

  2. 以下の SNMP トラップ形式の詳細を参照してください。

未知のトラップは使用しないでください。Zabbix はそれらを認識できません。 snmptt.conf: EVENT general .* "General event" Normal で一般イベントを定義することにより、不明なトラップを処理できます。

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 RECEIVER SCRIPT へのフルパス]";
  • レシーバーを設定します。例:

    $SNMPTrapperFile = '[トラップ ファイル]'; $DateTimeFormat = '[日時フォーマット]';

スクリプト名が引用符で囲まれていない場合、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
SNMP トラップのフォーマット

カスタマイズされたすべての Perl トラップ レシーバーと SNMPTT トラップ構成は、次の方法でトラップをフォーマットする必要があります。

[timestamp] [the trap, part1] ZBXTRAP [address] [the trap, part 2]

内訳

  • [timestamp] - ログ項目に使用されるタイムスタンプ
  • ZBXTRAP - 新しいトラップがこの行で開始することを示すヘッダー
  • [address] - このトラップのホストを見つけるために使用される IP アドレス

"ZBXTRAP"と"[address]"は、処理中にメッセージから切り取られることに注意してください。 トラップが別の方法でフォーマットされている場合、Zabbix は予期せずトラップを解析する可能性があります。

トラップの例:

11:30:15 2011/07/27 .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 インターフェースに対して次のトラップが発生します。

11:30:15 2011/07/27 .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

システム要件

ラージファイルサポート

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

ログローテーション

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

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

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

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

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

設定:

  1. SNMP トラッパーを起動し、トラップ ファイルを設定するように Zabbix を構成します。 zabbix_server.confに以下を追加:

    StartSNMPTrapper=1 SNMPTrapperFile=/tmp/my_zabbix_traps.tmp

  2. Bash スクリプトを/usr/sbin/zabbix_trap_handler.shとしてダウンロード

    curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/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

  2. SNMP アイテム TEST: を作成します。

    ホスト SNMP インターフェース IP: 127.0.0.1 キー: snmptrap["linkup"] ログタイムフォーマット: yyyyMMdd.hhmmss

  3. 選択した SNMP プロトコル バージョンに対してsnmptrapdを構成し、snmptrapユーティリティを使用してテスト トラップを送信します。

SNMPv1, SNMPv2

SNMPv1 and SNMPv2 protocols rely on "community string" authentication. In the example below we will use "secret" as community string. It must be set to the same value on SNMP trap senders. SNMPv1 および SNMPv2 プロトコルは"コミュニティ ストリング"認証に依存しています。 以下の例では、コミュニティ ストリングとして"secret"を使用します。 SNMP トラップ送信側で同じ値に設定する必要があります。

SNMPv2 は実稼働環境でまだ広く使用されていますが、暗号化と実際の送信者認証を提供していないことに注意してください。 データはプレーン テキストとして送信されるため、これらのプロトコル バージョンは、プライベート ネットワークなどの安全な環境でのみ使用し、公共またはサード パーティのネットワークでは決して使用しないでください。

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

SNMPv1 または SNMPv2 トラップの受け入れを有効にするには、次の行を snmptrapd.conf に追加する必要があります。 "secret"を、SNMP トラップ送信者で構成された SNMP コミュニティ文字列に置き換えます。

authCommunity log,execute,net secret

次にsnmptrapを使用してテストトラップを送信します。 この例では、共通の"linkUp" OID を使用します。

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

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

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 をサポートしていません。 参照: http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption

検証

どちらの例でも、/var/lib/zabbix/snmptraps/snmptraps.log に同様の行が表示されます:

20220805.102235 ZBXTRAP 127.0.0.1
       UDP: [127.0.0.1]:35736->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Zabbix のアイテム値は次のようになります。

2022-08-05 10:54:43 2022-08-05 10:54:41 
       
       20220805.105441 UDP: [127.0.0.1]:44262->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

参照