はじめに
ZabbixではデフォルトではSNMPポーリングを使った機器の監視をすることは可能ですが、SNMP Trapの監視を行うことはできません。今回はこの機能を実現する方法を記事にしました。
前回の記事
今回使用するzabbixの構築手順は以下の記事で紹介しています。
zabbixサーバの情報
OS:AlmaLinux 8.9 (Midnight Oncilla)
カーネル:Linux 4.18.0-513.24.1.el8_9.x86_64
Zabbixのバージョン:6.4
DB:MySQL
なぜ構築が難しいのか
まず、どのようにzabbixでSNMP Trapが処理されるのか確認します。
・NW機器からSNMP Trapが発信 ・zabbix serverのsnmptrapdで受信 ・snmp trapperで受信したトラップを成形、ログファイルに保存 ・ログをzabbixが監視 ・監視結果をアイテムとして保存 ・設定に応じてトリガー判定を実施
参考:https://www.ashisuto.co.jp/enishi/system_management/zabbix_snmp.html
3つ目のプロセスである「snmp trapper」が厄介です。
実は同じ機能でありながら3種類存在していて、それぞれで微妙に仕様などが異なります。
もちろん、設定方法も異なります。
そして、検索しても整理された記事がありません。情報が散在しているのが現状です。
今回は、この中でもperlスクリプトを用いた方法を紹介します。
手順
必要なパッケージのインストール
snmpやperl関連のパッケージをインストールします。
yum install net-snmp net-snmp-utils net-snmp-libs net-snmp-devel net-snmp-perl -y
確認します。
[root@zabbix ~]# yum list installed | grep snmp
SNMP Trapperプロセスを起動
/etc/zabbix/zabbix_server.confを修正します。
StartSNMPTrapperで、0を1に変更します。コメントも外します。
[root@zabbix ~]# vi /etc/zabbix/zabbix_server.conf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Option: StartSNMPTrapper # StartSNMPTrapper=0 ※viのビューモードで / を入力後、StartSNMPTrapper= を入力しエンターキーを押すと検索できます。 続いてnを押すと、次の検索候補に飛びます。
修正後は次のようになります。
[root@zabbix ~]# cat /etc/zabbix/zabbix_server.conf | grep StartSNMPTrapper
### Option: StartSNMPTrapper
StartSNMPTrapper=1
SNMPTrapperファイルの指定(ログの出力先の指定)
こちらはデフォルトのものを使用します。
[root@zabbix ~]# cat /etc/zabbix/zabbix_server.conf | grep trap
# Listen port for trapper.
# Number of pre-forked instances of trappers.
# At least one trapper process must be running to display server availability and view queue
# Temporary file used for passing data from SNMP trap daemon to the server.
# Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
# SNMPTrapperFile=/tmp/zabbix_traps.tmp
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
# If 1, SNMP trapper process is started.
# List of comma delimited IP addresses that the trapper should listen on.
# Specifies how many seconds trapper may spend processing new data.
ログ出力用のディレクトリとログファイルを作成
ログ用のディレクトリやファイルがデフォルトでは存在しないので作成します。
[root@zabbix ~]# mkdir /var/log/snmptrap/ [root@zabbix ~]# touch /var/log/snmptrap/snmptrap.log [root@zabbix ~]# ll /var/log/snmptrap/ total 0 -rw-r--r-- 1 root root 0 5月 21 04:57 snmptrap.log [root@zabbix ~]#
ログファイルのアクセス権限の変更
システムユーザーであるzabbixでアクセスできるように変更します。
[root@zabbix ~]# chown zabbix.zabbix /var/log/snmptrap/snmptrap.log
[root@zabbix ~]# ll /var/log/snmptrap/
total 0
-rw-r--r-- 1 zabbix zabbix 0 5月 21 04:57 snmptrap.log
[root@zabbix ~]#
rsyslogの設定変更
rsyslog.confに次の文字を追加します。
[追加]
# SNMPTrap
local6.* /var/log/snmptrap/snmptrap.log
[root@zabbix ~]# vi /etc/rsyslog.conf
確認します。
[root@zabbix ~]# cat /etc/rsyslog.conf # SNMPTrap local6.* /var/log/snmptrap/snmptrap.log
設定を反映させるためにサービスの再起動を行います。
[root@zabbix ~]# systemctl restart rsyslog.service
確認します。
[root@zabbix ~]# systemctl list-unit-files --type=service | grep rsyslog
rsyslog.service enabled
snmptrapdの設定変更
snmptrapd.confに次の文字を追加します。
[追加]
authCommunity log,execute,net test ※testはCommunity名です。
perl do “/usr/local/bin/zabbix_trap_receiver.pl”; ※perlスクリプトの配置場所を指定
OPTIONS=”-Ls6 -p /var/run/snmptrapd.pid”
※起動パラメータの設定。ファシリティは6で設定。引数が正しいか確認中です。
[root@zabbix ~]# vi /etc/snmp/snmptrapd.conf
確認します。
[root@zabbix ~]# cat /etc/snmp/snmptrapd.conf # Example configuration file for snmptrapd # # No traps are handled by default, you must edit this file! # # authCommunity log,execute,net public # traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold authCommunity log,execute,net test perl do "/usr/local/bin/zabbix_trap_receiver.pl"; OPTIONS="-Ls6 -On -p /var/run/snmptrapd.pid"
また、次のファイルも修正します。
[追加]
OPTIONS=”-Ls6 -p /var/run/snmptrapd.pid”
[root@zabbix ~]# vi /etc/sysconfig/snmptrapd
確認します。
[root@zabbix ~]# cat /etc/sysconfig/snmptrapd
i# snmptrapd command line options
# '-f' is implicitly added by snmptrapd systemd unit file
# OPTIONS="-Lsd"
OPTIONS="-m ALL -M /usr/share/snmp/mibs -Ls6 -On -p /var/run/snmptrapd.pid"
※Ls6:ファシリティは6とする
snmptrapdの有効化
[root@zabbix ~]# systemctl enable snmptrapd.service --now Created symlink /etc/systemd/system/multi-user.target.wants/snmptrapd.service → /usr/lib/systemd/system/snmptrapd.service.
確認します。
[root@zabbix ~]# systemctl list-unit-files --type=service | grep snmp
snmpd.service disabled
snmptrapd.service enabled
snmptrapdの起動(再起動)
[root@zabbix ~]# systemctl (re)start snmptrapd.service
確認します。
[root@zabbix ~]# ps -aux | grep snmp
root 2836 0.0 0.2 106900 16316 ? Ss 06:34 0:00 /usr/sbin/snmptrapd -Lsd -f
perlスクリプトの入手
次のURLにブラウザからアクセスします。
右側の方にダウンロードボタンがあるのでraw fileをローカルにダウンロードします。
その後、teratermのSSH SCP機能などを用いてzabbixサーバに送信します。
perlスクリプトの権限の変更
デフォルトではumaskが0022で設定されているため、ファイルの権限が0644となります。
実行権限を与えるため権限を755に変更します。
[root@zabbix ~]# chmod 755 zabbix_trap_receiver.pl
[root@zabbix ~]# ll
total 24
-rw-r--r--. 1 root root 279 5月 18 15:09 anaconda-post_nochroot.log
-rw-r--r-- 1 root root 3854 5月 18 19:51 old_index.html
-rw-------. 1 root root 9997 5月 18 15:09 original-ks.cfg
-rwxr-xr-x 1 root root 3717 5月 21 04:26 zabbix_trap_receiver.pl
perlスクリプトの修正
perlスクリプトを次のように修正します。
[root@zabbix ~]# vi zabbix_trap_receiver.pl
$SNMPTrapperFile = '/tmp/zabbix_traps.tmp';
→ $SNMPTrapperFile = '/var/log/snmptrap/snmptrap.log';
確認します。
[root@zabbix ~]# cat zabbix_trap_receiver.pl | grep SNMPTrapperFile
### Option: SNMPTrapperFile
$SNMPTrapperFile = '/var/log/snmptrap/snmptrap.log';
unless (sysopen(OUTPUT_FILE, $SNMPTrapperFile, O_WRONLY|O_APPEND|O_CREAT, 0666))
print STDERR "Cannot open [$SNMPTrapperFile]: $!\n";
[root@zabbix ~]#
スクリプトファイルの移動
rootユーザーのカレントディレクトリにあるので、snmptrapd.confで指定したディレクトリに移動します。
[root@zabbix ~]# mv zabbix_trap_receiver.pl /usr/local/bin/
確認します。
[root@zabbix ~]# ll
total 20
-rw-r--r--. 1 root root 279 5月 18 15:09 anaconda-post_nochroot.log
-rw-r--r-- 1 root root 3854 5月 18 19:51 old_index.html
-rw-------. 1 root root 9997 5月 18 15:09 original-ks.cfg
[root@zabbix ~]# ls /usr/local/bin/
zabbix_trap_receiver.pl
[root@zabbix ~]#
動作確認
次のコマンドで確認します。コミュニティ名は必要に応じて変更してください。
[root@zabbix ~]# snmptrap -v 2c -c test 127.0.0.1 8640000 .1.3.6.1.6.3.1.1.5.3
確認します。ログに出力されていれば成功です。
[root@zabbix ~]# cat /var/log/snmptrap/snmptrap.log 2024-05-21T05:03:37+0900 ZBXTRAP 127.0.0.1 PDU INFO: requestid 1206601597 errorstatus 0 messageid 0 version 1 errorindex 0 transactionid 1 notificationtype TRAP community test receivedfrom UDP: [127.0.0.1]:47867->[127.0.0.1]:162 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (8640000) 1 day, 0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkDown
また、デフォルトでは /var/log/messagesに出力されます。
[root@zabbix ~]# cat /var/log/messages May 21 07:23:30 zabbix snmptrapd[3127]: 2024-05-21 07:23:30 localhost [UDP: [127.0.0.1]:52956->[127.0.0.1]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8640000) 1 day, 0:00:00.00#011SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkDown [root@zabbix ~]#
SNMPv3でSNMP Trapを行う方法
別記事としました。こちらを参照ください。
参考
Perl trap receiver(zabbix_trap_receiver.pl)を使用したSNMPトラップ監視|BLOG| サイバートラスト (cybertrust.co.jp)
コメント
「動作確認」時にsnmptrapを使用して試験を行った結果が、/var/log/snmptrap/snmptrap.logで人が見やすい結果となっています。
この時のMIBファイルは何も設定しなくても、そのように人が見やすい結果としてログ(/var/log/snmptrap/snmptrap.log)に残るのでしょうか。
それともMIBファイルの設定を別途実施したのでしょうか。
別途設定した場合、それらの保存場所、設定ファイルの内容を知りたいです。