English

お問い合わせ

BLOG

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 を組み込むことによって追加された機能により行われます。

処理の流れは下記となります。

  1. snmptrapd が SNMP トラップを受信する
  2. snmptrapd に組み込まれた SNMP trap receiver が受信したデータを成形して snmptrapper ファイルに書き出す
  3. Zabbix サーバの SNMP Trapper プロセスが snmptrapper ファイルを読み込む
  4. 該当するアイテムの監視データとして登録する

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 トラップ監視を行う方法を解説しました。

参考情報

注意事項

  • 本ドキュメントの内容は、予告なしに変更される場合があります。
  • 本ドキュメントは、限られた評価環境における検証結果をもとに作成しており、全ての環境での動作を保証するものではありません。
  • 本ドキュメントの内容に基づき、導入、設定、運用を行なったことにより損害が生じた場合でも、当社はその損害についての責任を負いません。あくまでお客さまのご判断にてご使用ください。
サイバートラストのテレワークソリューション
採用情報ページ リニューアル
組込み Linux にプラスして 長期間の製品ライフサイクルをサポート EM+PLS