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 に渡します。snmptrap[regexp]
の正規表現と比較されます。 トラップは、一致した すべて のアイテムの値として設定されます。 一致するアイテムが見つからず、snmptrap.fallback アイテムが存在する場合、トラップはその値として設定されます。フロントエンドで以下のフィールドを設定することは、このアイテムタイプ特有のものです。
設定 → ホスト の インターフェース フィールドで、正しい IP アドレスまたは DNSを使用して SNMP インターフェースを設定します。受信した各トラップからのアドレスは、対応するホストを見つけるために、すべての SNMP インターフェースの IP および DNS アドレスと比較されます。
キー フィールドでは、SNMP トラップ キーのいずれかを使用します。
キー | ||
---|---|---|
説明 | 戻り値 | コメント |
snmptrap[regexp] | ||
regexp で指定された 正規表現 に一致するすべての SNMP トラップをキャッチします。 regexp が指定されていない場合、すべてのトラップをキャッチします。 | SNMP トラップ | この項目は、SNMP インターフェースに対してのみ設定できます。 この項目キーのパラメーターでは、ユーザー マクロとグローバル正規表現がサポートされています。 |
snmptrap.fallback | ||
そのインターフェースの snmptrap[] アイテムのいずれによってもキャッチされなかったすべての SNMP トラップをキャッチします。 | SNMP トラップ | このアイテムは、SNMP インターフェースに対してのみ設定できます。 |
現時点では、複数行の正規表現一致はサポートされていません。
タイムスタンプを解析するには、データ型を'ログ' に設定します。 '数値(整数)'など、他の形式も使用できますが、カスタム トラップ ハンドラが必要になる場合があることに注意してください。
SNMP トラップ監視を機能させるには、まず正しく設定する必要があります (以下を参照)。
トラップを読み取るには、Zabbix サーバーまたはプロキシが、SNMP トラッパー プロセスを開始し、SNMPTT または Bash/Perl トラップ レシーバーによって書き込まれているトラップ ファイルを指すように構成されている必要があります。これを行うには設定ファイル (zabbix_server.conf または zabbix_proxy.conf) を編集します。
systemd パラメーターPrivateTmpが使用されている場合、このファイルは /tmp では機能しません。
要件: 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 を使用するよう、 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 で一般イベントを定義することにより、不明なトラップを処理できます。
要件: Perl および --enable-embedded-perl でコンパイルされた Net-SNMP (Net-SNMP 5.4 以降はデフォルトで実行)
Perl トラップ レシーバー (misc/snmptrap/zabbix_trap_receiver.pl を参照) を使用して、snmptrapd から直接 Zabbix サーバーにトラップを渡すことができます。
設定するには: - Perl スクリプトを snmptrapd設定ファイル(snmptrapd.conf)に追加します。例:
レシーバーを設定します。例:
$SNMPTrapperFile = '[トラップ ファイル]'; $DateTimeFormat = '[日時フォーマット]';
スクリプト名が引用符で囲まれていない場合、snmptrapd は次のようなメッセージで起動を拒否します。
カスタマイズされたすべての Perl トラップ レシーバーと SNMPTT トラップ構成は、次の方法でトラップをフォーマットする必要があります。
内訳
"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はログローテーションシステムを提供していません。ログローテーションはユーザが処理する必要があります。
ログのローテーションは、トラップが失われることがないようにまず古いファイルの名前を変更し、その後で削除する必要があります。
Trap ファイルの実装のため、Zabbixはファイルを区別するために inodeをサポートする
ファイルシステムを必要とします(この情報は stat() 呼出で取得します)。
この例では、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 変数を調整します。 デフォルト値を使用するには、最初に親ディレクトリを作成します。
以下を 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 プロトコルは"コミュニティ ストリング"認証に依存しています。 以下の例では、コミュニティ ストリングとして"secret"を使用します。 SNMP トラップ送信側で同じ値に設定する必要があります。
SNMPv2 は実稼働環境でまだ広く使用されていますが、暗号化と実際の送信者認証を提供していないことに注意してください。 データはプレーン テキストとして送信されるため、これらのプロトコル バージョンは、プライベート ネットワークなどの安全な環境でのみ使用し、公共またはサード パーティのネットワークでは決して使用しないでください。
SNMP バージョン 1 は、64 ビット カウンターをサポートしておらず、レガシー プロトコルと見なされているため、最近では実際には使用されていません。
SNMPv1 または SNMPv2 トラップの受け入れを有効にするには、次の行を snmptrapd.conf
に追加する必要があります。 "secret"を、SNMP トラップ送信者で構成された SNMP コミュニティ文字列に置き換えます。
次にsnmptrap
を使用してテストトラップを送信します。 この例では、共通の"linkUp" OID を使用します。
SNMPv3 は、SNMPv1/v2 のセキュリティ問題に対処し、認証と暗号化を提供します。 認証方式として SHA または MD5 を使用し、暗号として AES または DES を使用できます。
SNMPv3 の受け入れを有効にするには、次の行を snmptrapd.conf
に追加します。
このユーザー セキュリティ モデルのスクリプトを実行できるようにする "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