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)を使用してください。
トラップを受信するワークフロー:
snmptrapdがトラップを受信snmptrapdはトラップをレシーバースクリプト(Bash、Perl)またはSNMPTTに渡すsnmptrap[regexp]の正規表現と比較されます。 トラップは一致したすべてのアイテムの値として設定されます。 一致するアイテムが見つからず、snmptrap.fallbackアイテムが存在する場合、トラップはその値として設定されます。高可用性(HA)ノードの切り替え中、Zabbixは最後のISO 8601タイムスタンプ内の最後のレコードの後に処理を続行します。同じレコードが見つからない場合は、タイムスタンプのみを使用して最後の位置を識別します。
このアイテムタイプには、次のフロントエンド設定が必要です。
1. ホスト用のSNMPインターフェースを作成
2. アイテムの設定
| キー | ||
|---|---|---|
| 説明 | 戻り値 | コメント |
| snmptrap[regexp] | ||
| regexpで指定された正規表現に一致するすべてのSNMPトラップをキャッチします。 regexpが指定されていない場合、すべてのトラップをキャッチします。 | SNMPトラップ | このアイテムは、SNMPインターフェースに対してのみ設定できます。 このアイテムキーのパラメーターでは、ユーザーマクロとグローバル正規表現がサポートされています。 |
| snmptrap.fallback | ||
| そのインターフェースのsnmptrap[]アイテムのいずれによってもキャッチされなかったすべてのSNMPトラップをキャッチします。 | SNMPトラップ | このアイテムは、SNMPインターフェースに対してのみ設定できます。 |
現時点では、複数行の正規表現一致はサポートされていません。
トラップを読み取るには、ZabbixサーバーまたはプロキシがSNMPトラッパープロセスを開始し、SNMPTTまたはBash/Perlトラップレシーバーによって書き込まれているトラップファイルを指すように構成されている必要があります。これを行うには設定ファイル(zabbix_server.confまたは zabbix_proxy.conf)を編集します。
systemdパラメーターPrivateTmpが使用されている場合、このファイルは/tmpでは機能しません。
要件: snmptrapdのみ。
Bashトラップレシーバースクリプトを使用して、trapperファイルを使用してsnmptrapdからZabbixサーバーにトラップを渡すことができます。設定するには、snmptrapd設定ファイル(snmptrapd.conf)にtraphandleオプションを追加します。 例を参照してください。
snmptrapdは設定の変更を取得するために再起動する必要がある場合があります。
要件: Perl、--enable-embedded-perlでコンパイルされたNet-SNMP(Net-SNMP 5.4以降はデフォルトで有効)
Perlトラップレシーバー(misc/snmptrap/zabbix_trap_receiver.plを参照)は、snmptrapdから直接Zabbixサーバーにトラップを渡すために使用できます。設定方法は以下の通りです。
snmptrapdは、設定の変更を反映するために再起動が必要な場合があります。
スクリプト名が引用符で囲まれていない場合、snmptrapdは以下のようなメッセージとともに起動を拒否します。
まず、snmptrapdをSNMPTTを使用するように設定する必要があります。
最高のパフォーマンスを得るために、SNMPTTはsnmptthandler-embeddedを使用してデーモンとして設定し、トラップを渡すようにしてください。SNMPTTの設定の手順を参照してください。
SNMPTTがトラップを受信するように設定されたら、snmptt.iniを設定します:
"net-snmp-perl"パッケージはRHEL 8.0-8.2で削除され、RHEL 8.3で再追加されました。詳細は既知の問題を参照してください。
次に、Zabbixがトラップを認識できるようにトラップのフォーマットを設定します(snmptt.confを編集):
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)不明なトラップは使用しないでください。Zabbixはそれらを認識できません。
不明なトラップは、snmptt.confで一般的なイベントを定義することで処理できます:
すべてのカスタマイズされたPerlトラップレシーバーおよびSNMPTTトラップの設定は、以下のようにトラップをフォーマットする必要があります:
ここで
"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はログローテーションシステムを提供していません。これはユーザーが管理する必要があります。ログローテーションは、トラップが失われないように、まず古いファイルの名前を変更し、その後で削除する必要があります。
Trap ファイルの実装のため、Zabbixはファイルを区別するために inodeをサポートする
ファイルシステムを必要とします(この情報は stat() 呼出で取得します)。
この例では、snmptrapdとBash受信スクリプトを使用して、トラップをZabbixサーバーに渡します。
セットアップ手順:
zabbix_server.confに以下を追加します:/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変数を調整してください。デフォルト値を使用する場合は、 親ディレクトリを先に作成してください:
snmtrapd.confに以下を追加します(動作する例を参照)snmptrapdは、設定の変更を反映させるために再起動が必要な場合があります。
SNMPアイテムTESTを作成します(初期の設定要件に注意):
タイプ: SNMPトラップ
情報のタイプ: ログ ホストインターフェース: SNMP 127.0.0.1
キー: snmptrap["linkUp"]
ログ時刻フォーマット: yyyyMMdd.hhmmss
ISO 8601の日付と時刻のフォーマットが使用されていることに注意してください。
snmptrapdを設定し、 snmptrapユーティリティを使用してテストトラップを送信します。SNMPv1およびSNMPv2プロトコルは、「コミュニティストリング」認証に依存しています。以下の例では 「secret」をコミュニティストリングとして使用します。SNMPトラップ送信側でも同じ値に設定する必要があります。
SNMPv2は現在も多くの本番環境で使用されていますが、暗号化や実際の送信者認証を提供しません。 データは平文で送信されるため、これらのプロトコルバージョンはプライベートネットワークなどの安全な環境でのみ使用し、 パブリックネットワークや第三者ネットワークでは絶対に使用しないでください。
SNMPバージョン1は64ビットカウンタをサポートしておらず、レガシープロトコルと見なされているため、現在はほとんど使用されていません。
SNMPv1またはSNMPv2トラップの受信を有効にするには、snmptrapd.confに以下の行を追加します。 「secret」はSNMPトラップ送信側で設定したコミュニティストリングに置き換えてください:
次に、snmptrapを使用してテストトラップを送信できます。この例では一般的な「リンクアップ」OIDを使用します:
SNMPv3はSNMPv1/v2のセキュリティ問題に対応し、認証と暗号化を提供します。 MD5または複数のSHA認証方式、およびDES/複数のAES暗号を使用できます。
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.0AES192や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.0Zabbixのアイテム値は次のようになります:
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.0Perlを使った例:
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