3 SNMPトラップ
概要
SNMPトラップの受信は、SNMP対応デバイスへのクエリとは逆です。
この場合、情報はSNMP対応デバイスから送信され、Zabbixによって収集または"トラップ"されます。
通常、何らかの条件が変化するとトラップが送信され、エージェントはポート162でサーバーに接続します (クエリに使用されるエージェント側のポート161とは対照的です)。トラップを使用すると、クエリ間隔中に発生し、クエリ データによって見逃される可能性のあるいくつかの短い障害を検出できます。
ZabbixでのSNMPトラップの受信は、snmptrapdと、トラップをZabbixに渡すためのメカニズムの1つ (BashまたはPerlスクリプト、SNMPTT)で動作するように設計されています。
Zabbixの構成後にトラップ監視をセットアップする最も簡単な方法は、Bashスクリプトソリューションを使用することです。これは、最近のディストリビューションではPerlとSNMPTTが欠落していることが多く、より複雑な構成が必要になるためです。
ただし、このソリューションでは、traphandleとして構成されたスクリプトが使用されます。
本番システムでのパフォーマンスを向上させるには、組み込みのPerlソリューション(do perlオプション付きのスクリプトまたはSNMPTT)を使用してください。
トラップを受信するワークフロー:
snmptrapdがトラップを受信snmptrapdはトラップをレシーバースクリプト(Bash、Perl)またはSNMPTTに渡す- 受信者はトラップを解析、フォーマットし、ファイルに書き込む
- Zabbix SNMPトラッパーは、トラップファイルを読み取り、解析
- Zabbixはトラップごとに、受信したトラップアドレスと一致するホストインターフェースを持つすべての"SNMPトラッパー"アイテムを検索します。 マッチングでは、ホスト インターフェースで選択した"IP"または"DNS"のみが使用されることに注意してください。
- 見つかったアイテムごとに、トラップは
snmptrap[regexp]の正規表現と比較されます。 トラップは一致したすべてのアイテムの値として設定されます。 一致するアイテムが見つからず、snmptrap.fallbackアイテムが存在する場合、トラップはその値として設定されます。 - トラップがアイテムの値として設定されていない場合、Zabbixはデフォルトで一致しないトラップをログに記録します。 (これは、管理 > 一般設定 > その他の"マッチしないSNMPトラップをログに記録"で設定されます。)
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トラップレシーバースクリプトを使用して、snmptrapdから直接Zabbixサーバーにトラップを渡すことができます。設定するには、snmptrapd設定ファイル(snmptrapd.conf)にtraphandleオプションを追加します。 [例](https://raw.githubusercontent.com/zabbix/zabbix-docker/6.2/Dockerfiles/snmptraps/alpine /conf/etc/snmp/snmptrapd.conf)を参照してください。
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
SNMPTT の設定
最初にSNMPTT を使用するよう、 snmptrapd を設定する必要があります。
最高のパフォーマンスを得るためにはsnmptthandler-embedded を使用してトラップを渡すデーモンとして SNMPTT を構成する必要があります。 SNMPTTの設定手順を参照してください。
SNMPTT がトラップを受信するように構成されている場合は'snmptt.ini'を設定します。
-
NET-SNMP パッケージの Perl モジュールの使用を有効にします。
net_snmp_perl_enable = 1
-
Zabbix によって読み取られるトラップ ファイルにトラップを記録します。
log_enable = 1 log_file = [トラップファイル]
-
日付フォーマットを設定します。
date_time_format = %H:%M:%S %Y/%m/%d = [日付フォーマット]
"net-snmp-perl"パッケージは RHEL 8.0-8.2 で削除されましたが、RHEL 8.3で再度追加されました。詳細については既知の問題を参照してください。
Zabbix が認識できるようにトラップをフォーマットします (snmptt.conf を編集します)。
-
各 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)
-
以下の SNMP トラップ形式の詳細を参照してください。
未知のトラップは使用しないでください。Zabbix はそれらを認識できません。 snmptt.conf:\ EVENT general .* "General event" Normal で一般イベントを定義することにより、不明なトラップを処理できます。
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はログローテーションシステムを提供していません。ログローテーションはユーザが処理する必要があります。
ログのローテーションは、トラップが失われることがないようにまず古いファイルの名前を変更し、その後で削除する必要があります。
- Zabbixは最後に確認された場所にある Trap ファイルを開き、ステップ3へ進みます。
- Zabbixは現在開いているファイルがローテーションされているかどうか、inode番号と定義された Trap ファイルの inode番号を比較することで確認します。 開いているファイルがない場合、Zabbixは最後の場所をリセットし、ステップ1へ進みます。
- Zabbixは現在開いているファイルからデータを読み込み、新しい場所を設定します。
- 新しいデータがパースされます。ローテートされたファイルの場合、ファイルは閉じられ、ステップ2に戻ります。
- 新しいデータがない場合、Zabbix は 1 秒間スリープし、ステップ 2 に戻ります。
ファイルシステム
Trap ファイルの実装のため、Zabbixはファイルを区別するために inodeをサポートする
ファイルシステムを必要とします(この情報は stat() 呼出で取得します)。
異なる SNMP プロトコル バージョンを使用したセットアップ例
この例では、snmptrapd と Bash レシーバー スクリプトを使用して、トラップを Zabbix サーバーに渡します。
設定:
-
SNMP トラッパーを起動し、トラップ ファイルを設定するように Zabbix を構成します。
zabbix_server.confに以下を追加:StartSNMPTrapper=1 SNMPTrapperFile=/tmp/my_zabbix_traps.tmp
-
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
-
以下を
snmtrapd.confに追加します (参照動作例)traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
-
SNMP アイテム TEST:\ を作成します。
ホスト SNMP インターフェース IP: 127.0.0.1 キー:
snmptrap["linkup"]ログタイムフォーマット: yyyyMMdd.hhmmss -
選択した 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を使用してテストトラップを送信します。 この例では、共通の"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