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の動き
- 受け付けた引数をカンマで区切って$entryに代入
- 引数を全てログファイルに書き込み
- $entry[0]とdevicesテーブルのhostnameフィールドを検索して$deviceに代入
- $device[device_id]が未定義なら、entry[0]とipv4_addressesテーブルを検索して$deviceに代入
- $device[device_id]が未定義なら、処理終了
- includes/snmptrap/「entry[1]」.inc.phpを呼び出す
- 「entry[1]」.inc.phpがなければunknown trapとしてechoする
つまり、「entry[1]」.inc.phpを作成することで各種snmptrapに対応できると見た
デフォルトではlinkUpとlinkDownの2つがある
TRA発生時、entry[1]に設定されている文字列がポイントになる
linkUp.inc.phpの動き
- $device[device_id]と$entry[2]を元にportsテーブルからインターフェース名を検索して$interfaceに代入
- $interfaceが定義されなければ終了
- インターフェース名等をログに記録
- $ifAdminStatusと$ifOperStatusを比較してインターフェースが有効になったのかupになったのかを判断
- 結果をログ
- 結果をDbUpdate
通常、linuxのsnmptrapdは標準入力に対して複数行のTRAP文字列を送出している
この時点でLibreNMSに導入されているsnmptrap.phpは利用できない
なぜなら引数をカンマ区切りで処理しているからだ
という事が分かったので別の手法で実現するのが現実的(後述)
https://github.com/librenms/librenms/issues/1380ここでsnmpttを利用してtrapできたよ!って
この流れかな
MIB
mib回りの調査
mibs/process.plがある
- MIBSディレクトリ内の全ファイルを変数に代入
- ファイルからsnmpttconvertmibを実行して/etc/snmp/snmptt-d.confを作成
snmpttを利用しているんだね
snmptrapの現実的な組み込み
標準提供のsnmptrap.phpとsnmpttツールを組み合わせた現実的な組み込み