BLOG
2018 年 11 月 12 日
Perl trap receiver(zabbix_trap_receiver.pl)を使用したSNMPトラップ監視
本ドキュメントでは SNMP トラップ監視を SNMPTT を使用せずに Perl trap receiver(zabbix_trap_receiver.pl) で行う方法を解説します。
はじめに
SNMP トラップ監視を行う方法には、SNMPTT を使用する他に Perl trap receiver(zabbix_trap_receiver.pl) を使用する方法があります。
SNMPTT を使用した場合と同じく、SNMP トラップの受信は snmptrapd(Net-SNMP) が行います。受信したデータを SNMP トラップ監視で監視できるように、監視データを取得するファイル ( 以下、snmptrapper ファイル ) に、定められたフォーマットで書き込みます。それらの処理が SNMP trap receiver を組み込むことによって追加された機能により行われます。
処理の流れは下記となります。
- snmptrapd が SNMP トラップを受信する
- snmptrapd に組み込まれた SNMP trap receiver が受信したデータを成形して snmptrapper ファイルに書き出す
- Zabbix サーバの SNMP Trapper プロセスが snmptrapper ファイルを読み込む
- 該当するアイテムの監視データとして登録する
Perl trap receiver は Net-SNMP の Perl による機能拡張を利用して実装されていいます。そのため、使用するにはパッケージ net-snmp-perl がインストールが必要です。また、net-snmp は --enable-embedded-perl オプションを付与してコンパイルされている必要があります。
設定方法
1. Perl trap receiver(zabbix_trap_receiver.pl) を用意する
該当する Perl スクリプトは、MIRACLE ZBX パッケージでは下記のパスにインストールされています。
/var/lib/zabbix/zabbix_trap_receiver.pl
Perl スクリプトには、下記 2 つのパラメータがあります。
- $SNMPTrapperFile: データを出力するファイル (snmptrapper ファイル )
- $DateTimeFormat: 日付のフォーマット
設定例)
$SNMPTrapperFile = '/var/log/zabbix/zabbix_traps.tmp'; $DateTimeFormat = '%H:%M:%S %Y/%m/%d';
2. snmptrapd に Perl trap receiver を組み込む
Net-SNMP の Perl を使用した機能拡張を使用して、snmptrapd に Perl スクリプトを組み込みます。perl do の引数に Perl スクリプトのパスを指定します。
設定ファイル :/etc/snmp/snmptrapd.conf
設定例 ) 説明を簡略化するためコミュニティ名による認証は無効にしています。
perl do "/var/lib/zabbix/zabbix_trap_receiver.pl";
disableAuthorization yes
3. OID をシンボル名に変換する設定
OID をシンボル名に変換する処理は snmptrapd で行います。snmptrapd の環境変数 MIBS と MIBDIRS に MIB ファイルとそれを設置したディレクトリを設定することで可能となります。
-m オプションにより環境変数 MIBS に MIB ファイルを指定します。ALL を指定することにより MIBDIRS 指定したディレクトリにある全ての MIB ファイルを読み込みます。
-M オプションにより環境変数 MIBDIRS に MIB ファイルを設置したディレクトリを指定します。デフォルトでは /usr/share/snmp/mibs が使用されます。複数のディレクトリ使用する場合は ":" で区切って記載します。
設定ファイル :/etc/sysconfig/snmptrapd
設定例 )
OPTIONS="-m ALL -M /usr/share/snmp/mibs:/usr/share/snmp/mibs/enterprise -Lsd -p /var/run/snmptrapd.pid"
4. snmptrapd の設定変更を反映する
設定を反映するために snmptrapd を再起動します。
# systemctl restart snmptrapd
5. Zabbix サーバを設定する
設定する必要があるパラメータは下記です。
SNMPTrapperFile:
SNMP Trapper プロセスが監視データを読み込むファイル (snmptrapper ファイル )。Perl trap receiver がデータを書き出すファイルのパスを指定する。
StartSNMPTrapper:
処理を行う SNMP Trapper プロセスを起動する場合は 1、起動しない場合は 0 を設定する。
SNMPTrapperFile=/var/log/zabbix/zabbix_traps.tmp StartSNMPTrapper=1
6. Zabbix サーバの設定を反映する
設定を反映させるために Zabbix サーバを再起動します。
# systemctl restart zabbix-server
7. テスト
SNMP トラップを送信して、該当するデータが snmptrapper ファイルに書き出されることを確認します。
SNMP トラップの送信
例 )
#snmptrap -v 2c -c public 192.168.0.17 '' .1.3.6.1.6.3.1.1.5.3 .1.3.6.1.6.3.1.1.5.4 s testdata
出力例 )
/var/log/zabbix/zabbix_traps.tmp
10:50:54 2018/09/27 ZBXTRAP 192.168.0.17 PDU INFO: notificationtype TRAP version 1 receivedfrom UDP: [192.168.0.17]:60120->[192.168.0.17]:162 errorstatus 0 messageid 0 community public transactionid 31 errorindex 0 requestid 1203775419 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (17234835) 1 day, 23:52:28.35 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkDown IF-MIB::linkUp type=4 value=STRING: "testdata"
8. Web フロントエンドの設定
- SNMP インターフェースを追加
該当するホストに SNMP インターフェースを追加します。 - アイテムの作成
SNMP トラップ監視のアイテムには、以下の 2 種類があります。
データ型には " ログ " に設定する必要があります。
1. snmptrap[regexp]
2. nmptrap.fallback - ログ出力
SNMP インターフェースにマッチしない SNMP トラップを Zabbix サーバのログに出力する場合は下記の設定にチェックをいれます。
[ 管理 ]->[ 一般設定 ]->[ その他 ]-> マッチしない SNMP トラップをログに記録
注意点
snmptrapper ファイルの最大のサイズは 2GB までとなっています。( 下記ソースコードの L.541)※バージョン 4.0.x ではこの制限はありません。
snmptrapper ファイルをローテートする必要がありますが、Zabbix にはその機能がありません。実装を考慮すると、ローテートを行う際は、既存のファイルを移動したあとにファイルを新規に作成した方が良いです。
実装を確認します。該当するソースコードは下記となります。
stat() が成功しない、inode の変更があった場合、ファイルのサイズが前回よりも小さい場合に、ローテートが行われと判定されます。
その場合、既に開いているファイルのデータを全て処理して閉じた後、SNMPTrapperFile に設定したパスの snmptrapper ファイルを開きます。
src/zabbix_server/snmptrapper/snmptrapper.c
517 static int get_latest_data() 518 { ... 521 if (-1 != trap_fd) /* a trap file is already open */ 522 { 523 if (0 != zbx_stat(CONFIG_SNMPTRAP_FILE, &file_buf)) 524 { 525 /* file might have been renamed or deleted, process the current file */ ... 533 while (0 < read_traps()) 534 ; ... 540 } 541 else if (ZBX_SNMP_TRAPFILE_MAX_SIZE <= (zbx_uint64_t)file_buf.st_size) 542 { 543 close_trap_file(); 544 } 545 else if (file_buf.st_ino != trap_ino || file_buf.st_size < trap_lastsize) 546 { 547 /* file has been rotated, process the current file */ 548 549 while (0 < read_traps()) 550 ; ... 556 } ... 579 }
以上、簡単ですが Perl trap receiver(zabbix_trap_receiver.pl) を使用して SNMP トラップ監視を行う方法を解説しました。
参考情報
-
https://www.cybertrust.co.jp/blog/linux-oss/system-monitoring/tech-lounge/zbx-tl-001.html
https://www.zabbix.com/documentation/3.0//manual/config/items/itemtypes/snmptrap
https://www.zabbix.com/documentation/4.0//manual/config/items/itemtypes/snmptrap
注意事項
- 本ドキュメントの内容は、予告なしに変更される場合があります。
- 本ドキュメントは、限られた評価環境における検証結果をもとに作成しており、全ての環境での動作を保証するものではありません。
- 本ドキュメントの内容に基づき、導入、設定、運用を行なったことにより損害が生じた場合でも、当社はその損害についての責任を負いません。あくまでお客さまのご判断にてご使用ください。