ZABBIXでSNMPトラップ監視する
Zabbix serverをインストールしただけではSNMPトラップは監視出来ません。
SNMPトラップを受信してログとして整形してZabbixに渡す仕組みが必要です。
以下3通りの方法が有ります。
・SNMPトラップフォーマッタ (Zabbixサポート契約者が入手可能)
・SNMPTT (オープンソースツール)
・zabbix_trap_receiver.pl (Zabbixのソースに含まれている)
本記事ではログフォーマットのカスタマイズ度が高く、MIBを使ってOIDからメッセージへの変換が可能なSNMPTT(SNMP Trap Translator)を使った方法について解説します。
ポーリングによる通常のSNMP監視についてはこちら↓
必要なパッケージインストール
.# dnf install net-snmp net-snmp-utils net-snmp-libs net-snmp-perl perl-Time-HiRes perl-Config-General perl-Text-Balanced perl-Config-IniFiles perl-Net-IP
perl-Config-General、perl-Config-IniFiles、perl-Net-IPがdnfで見つからない時はcpanを使ってインストールして下さい
SNMPTTインストール
SNMPTTはsourceforgeからダウンロードします。(2025/3現在 ver1.5)
https://sourceforge.net/projects/snmptt/files/
公式サイト:ドキュメントはこちら
https://www.snmptt.org/
ファイル配置
.# tar xvf snmptt_1.5.tgz
.# cd snmptt_1.5
配置して解凍します。
.# cp snmptt /usr/sbin/
.# chmod +x snmptt /usr/sbin/snmptt
.# cp snmptthandler /usr/sbin/
.# chmod +x /usr/sbin/snmptthandler
.# cp snmpttconvertmib /usr/sbin/
.# chmod +x /usr/sbin/snmpttconvertmib
snmptt、snmptthandler、snmpttcomvertmibを/usr/sbin/にコピーし、実行権限を付与します。
.# adduser -r snmptt
.# mkdir /etc/snmptt
.# chown -R snmptt.snmptt /etc/snmptt
.# chmod 750 /etc/snmptt
.# cp snmptt.ini /etc/snmptt/
ユーザを作成し、snmptt.iniをコピーします。
.# mkdir /var/log/snmptt
.# chown -R snmptt.snmptt /var/log/snmptt
.# chmod -R 755 /var/log/snmptt
ログディレクトリを作成します。
.# mkdir /var/spool/snmptt/
.# chown -R snmptt.snmptt /var/spool/snmptt
.# chmod -R 750 /var/spool/snmptt
spoolディレクトリを作成します。
.# cp snmptt.service /usr/lib/systemd/system/snmptt.service
.# chmod -x /usr/lib/systemd/system/snmptt.service
.# cp snmptt.logrotate /etc/logrotate.d/snmptt
systemdのservice起動ファイルとlogrotate.dファイルをコピーします。
設定
.# vi /etc/snmptt/snmptt.ini
net_snmp_perl_enable = 1
translate_log_trap_oid = 4
log_enable = 1
log_file = /var/log/snmptt/snmptt.log
date_time_format = %Y/%m/%d %H:%M:%S
syslog_enable = 0
mode=daemon
.# vi /etc/snmptt/snmptt.conf
EVENT general .* “General event” Normal
FORMAT ZBXTRAP $aA $N $*
後で出てくるMIBから変換したフォーマットで定義されていないトラップは、このsnmptt.confで定義されたフォーマットでログに出力されます。
SNMPTT起動
.# systemctl start snmptt
.# systemctl enable snmptt
.# systemctl status snmptt
snmptrapd 設定/起動
.# vi/etc/snmp/snmptrapd.conf
authCommunity log,execute,net public
traphandle default /usr/sbin/snmptthandler
.# vi /etc/sysconfig/snmptrapd
OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid -M /usr/share/snmp/mibs:/usr/share/snmp/venders -m all"
コミュニティはpublicとしています。
.# systemctl start snmptrapd
.# systemctl enable snmptrapd
.# systemctl status snmptrapd
snmptrapd snmptt 動作確認
snmptrap -v 2c -c public 127.0.0.1 "" 1.3.6.1.4.1.8072.9999 1.3.6.1.4.1.8072.9999 s TestTrap
.# tail /var/log/snmptt/snmptt.log
2025/03/08 03:23:53 NET-SNMP-MIB::.iso.org.dod.internet.private.enterprises.netSnmp.netSnmpExperimental Normal "General event" localhost - ZBXTRAP 127.0.0.1 general TestTrap
snmptrapコマンドで127.0.0.1宛にテストトラップを送信し、/var/log/snmptt/snmptt.logにログが出力される事を確認します。
MIB配置と変換
YAMAHA RTXのMIBファイルは以下URLで配布されています。
https://www.rtpro.yamaha.co.jp/RT/docs/mib/
今回はMIBファイルを/usr/share/snmp/venders/に配置します。
.# export MIBDIRS=/usr/share/snmp/mibs:/usr/share/snmp/venders
.# export MIBS=ALL
.# snmpttconvertmib --in=/usr/share/snmp/venders/YOUR-MIB.mib --out=/etc/snmptt/snmptt-convert.conf
MIBを配置したらsnmpttconvertmibコマンドを使ってMIBをSNMPTTが理解出来るフォーマットに変換します。
最初にexportでsnmpttconvertmibコマンドがMIB配置ディレクトリを見つけられるようにします。
snmpttconvertmibコマンドは配置したMIB全てに実行します。
トラップ情報が含まれないMIBの場合はその事が表示され、トラップが含まれるMIBの場合は変換処理の結果数が最後に出力されます。
トラップは標準MIBに含まれているものも有るので、/usr/share/snmp/mibs配下のMIBに対しても、snmpconvertmibコマンドを実行して下さい。
sed -i 's/FORMAT/FORMAT ZBXTRAP $aA $N/g' /etc/snmptt/snmptt-convert.conf
ZABBIXはトラップログとして/var/log/snmptt/snmptt.logを参照しますが、文字列にZBXTRAPが含まれている必要が有ります。
上記コマンドでフォーマットをその様に修正します。
.# vi /etc/snmptt/snmptt.ini
snmptt_conf_files = <<END
/etc/snmptt/snmptt.conf
/etc/snmptt/snmptt-convert.conf ←※追記
END
SNMPTTが変換されたMIBファイルを参照出来る様に指定します。
.# systemctl restart snmptt
ZABBIX設定
Zabbix server設定
.# /etc/zabbix/zabbix_server.conf
StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.log
.# systemctl restart zabbix-server
SNMPトラップを受けるにはUDP162が開いている必要が有ります。
必要に応じてfirewalldを調整して下さい。今回は検証の為、firewalldを停止しています。
ホスト設定
RTX1200のホストを作成します。
Network Generic Device by SNMPテンプレートをアサインし、SNMPインターフェースを作成します。
トリガー作成
Network Generic Device by SNMPテンプレートにはSNMPトラップアイテム(snmp.fallback)は有るものの、障害を発生させるトリガーが有りません。
それでトリガーを作成します。
条件式:length(last(/Network Generic Device by SNMP/snmptrap.fallback))>=1
障害イベント生成モード:複数 (複数のトラップが同時に来た時の為)
今回の設定は障害の自動復旧は考慮していません。
ダッシュボードから手動クローズする必要が有ります。
RTX1200の設定
administrator
password
.# snmpv2c trap host 192.168.100.210 trap public
.# save
snmpv2cでトラップ送信先とコミュニティを指定します。
テスト
RTX1200にL2TP/IPsec接続してトラップを発生させます。
上記の様に2つトラップが来ました。
PP Anonymous interface is upとyrlTunnelLinkUpです。
ユーザ名部分は伏せています。
snmpttconvertmibで変換したファイルを使って、トラップの説明がログに出力されZABBIXに表示されている事が分かります。
RTXのLANポートのLinkUp/Downをトラップする方法はこちら↓
まとめ
SNMPTTを使った方法は工数が必要なのは事実ですが、MIBを使って詳細な説明をメッセージとして出力したりフォーマットの自由度が高い特徴が有ります。
最初に設定すれば運用に有用だと思いますのでトライして下さい。
リンク