目次

LibreNMSでのSNMPTrap

SNMPTrap関係の調査
どこまで対応しているのか、どう対応できるのか

公式には「LinkUP/Downしかサポートしません」とある

/etc/snmp/snmptrapd.confの編集

authCommunity log,execute,net public
traphandle default /opt/librenms/snmptrap.php

snmptrapdデーモンを起動

systemctl enable snmptrapd
systemctl start snmptrapd
systemctl status snmptrapd -l

snmpポート開放は忘れずに

/opt/librenms/includes/snmptrap以下にファイルがある
これがtrapに対応したファイルっぽい

snmptrap.phpの動き

  1. 受け付けた引数をカンマで区切って$entryに代入
  2. 引数を全てログファイルに書き込み
  3. $entry[0]とdevicesテーブルのhostnameフィールドを検索して$deviceに代入
  4. $device[device_id]が未定義なら、entry[0]とipv4_addressesテーブルを検索して$deviceに代入
  5. $device[device_id]が未定義なら、処理終了
  6. includes/snmptrap/「entry[1]」.inc.phpを呼び出す
  7. 「entry[1]」.inc.phpがなければunknown trapとしてechoする

つまり、「entry[1]」.inc.phpを作成することで各種snmptrapに対応できると見た
デフォルトではlinkUpとlinkDownの2つがある

TRA発生時、entry[1]に設定されている文字列がポイントになる

linkUp.inc.phpの動き

  1. $device[device_id]と$entry[2]を元にportsテーブルからインターフェース名を検索して$interfaceに代入
  2. $interfaceが定義されなければ終了
  3. インターフェース名等をログに記録
  4. $ifAdminStatusと$ifOperStatusを比較してインターフェースが有効になったのかupになったのかを判断
  5. 結果をログ
  6. 結果をDbUpdate

通常、linuxのsnmptrapdは標準入力に対して複数行のTRAP文字列を送出している
この時点でLibreNMSに導入されているsnmptrap.phpは利用できない
なぜなら引数をカンマ区切りで処理しているからだ
という事が分かったので別の手法で実現するのが現実的(後述)

https://github.com/librenms/librenms/issues/1380ここでsnmpttを利用してtrapできたよ!って
この流れかな

MIB

mib回りの調査

mibs/process.plがある

  1. MIBSディレクトリ内の全ファイルを変数に代入
  2. ファイルからsnmpttconvertmibを実行して/etc/snmp/snmptt-d.confを作成

snmpttを利用しているんだね

snmptrapの現実的な組み込み

標準提供のsnmptrap.phpとsnmpttツールを組み合わせた現実的な組み込み