経緯
Zabbix を用いて監視を行っています。
監視対象は SNMP 対応機器を中心に監視しています。
SNMP 対応機器ってだいたい SNMP トラップを送信することができるんですよね。
Zabbix 側では飛んできたトラップの種類によって、監視アイテムを分けて運用しています。
そんなSNMP トラップって、標準(一般的)のものもあればベンダー独自実装のものもあり、それらはMIBに定義されています。
MIB を見ればどんなトラップがくるかは想像できるのですが、実際にトラップ飛んだ時にどんな形で Zabbix で見えるのかあらかじめ知っておきたいと思った次第です。
そんなわけで、今回は MIB に定義されているプライベートなトラップを実機なしで送信して、Zabbix でどのように表示がされるのか確認をしてみたいと思います。
環境準備
今回はすでに Zabbix がインストール、稼働している状態となっている OS 上で SNMP のトラップを送受信してみたいと思います。 環境は以下の感じです。
- OS:CentOS 7
- Zabbix:4.0.13
Zabbix のインストールを知りたい方は、別途ググってみてください。
利用するモジュール
Zabbix で SNMP トラップを送受信するために、以下2つのパッケージをインストールします。
- net-snmp-utils
- net-snmp を使用して便利機能が提供されている
- 今回メインで使用するのは snmptrapd(受信) と snmptrap(送信) の2つ
- snmptt
- snmptrapd と連携して、SNMP トラップを人間が見やすい形式に翻訳(Translate)してくれる。
- どのように翻訳するかは、ユーザが作成する必要あり。
Zabbix が SNMP トラップを受信する仕組み
前述のモジュールがどんな感じで動作する仕組みなのか、ざっくり書くと以下の感じ。
[SNMP機器] === SNMP トラップ ===> ([snmptrapd] ---> [snmptt] ---> [Zabbix])
※ snmptrapd、snmptt、Zabbix は同一 OS 上で稼働
以下概要
- SNMP 機器が SNMP トラップを送信すると snmptrapd が受信する。
- snmptrapd はログを
/var/log/messages
に記録しつつ、snmptt に受信データを渡す。- ここで
/var/log/messages
に書かれる情報は人間としては見づらい。
- ここで
- snmptt は受信したデータを snmptt が個別に保持している翻訳用の情報を用いて翻訳して、ログを
/var/log/snmptt/snmptt.log
に記録する。 - Zabbix は
/var/log/snmptt/snmptt.log
を見て、Zabbix が監視している対象ホストからのトラップログが書かれたら受信データとして記録する。- Zabbix は監視していないホストから受信した SNMP トラップのログについては何もしない。
もっとざっくり言うと、受信したトラップは snmptt で人間がわかりやすいように翻訳して、その結果を Zabbix で記録、監視する。
(上記の説明は、以下で設定する内容を踏まえての説明になっています。
ログの保存場所などは設定内容によって変わるので、そのあたりは読み替えてください。)
設定
net-snmp-utils 系のインストール
yum install perl epel-release net-snmp-utils net-snmp-perl perl-Sys-Syslog
snmptrapd.conf の修正
snmptrapd.conf をエディタで開く
vi /etc/snmp/snmptrapd.conf
下記を追記する。(文末でOK)
traphandle default /usr/sbin/snmptthandler disableAuthorization yes
プロセスの起動(既に動いている場合は停止してから起動)
systemctl stop snmptrapd systemctl start snmptrapd
自動起動設定(毎回手動起動するなら不要)
systemctl enable snmptrapd
この時点で SNMP トラップを受信したら /var/log/messages
で確認できるようになる。
が、内容は SNMP トラップの生情報なので人間の目にはわかりづらい。
受信例
Aug 27 07:01:43 test-03 snmptrapd[2186]: 2022-08-27 07:01:43 localhost [UDP: [127.0.0.1]:51394->[127.0.0.1]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (124606) 0:20:46.06#011SNMPv2-MIB::snmpTrapOID.0 = OID: iso.1.1#011iso.1.1 = STRING: "This is a test."
snmptt のインストール
yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/s/snmptt-1.4.2-1.el7.noarch.rpm
snmptt.conf の設定
このファイルを作成しておくことで、受信したトラップが snmptt.log に記録されるようになる。
snmptt.conf をエディタで開く
vi /etc/snmp/snmptt.conf
今回の検証段階では、snmptt.conf には以下の記載がされていた。
# # # EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal FORMAT Device reinitialized (coldStart) #EXEC qpage -f TRAP notifygroup1 "Device reinitialized (coldStart)" SDESC A coldStart trap signifies that the SNMPv2 entity, acting in an agent role, is reinitializing itself and that its configuration may have been altered. EDESC # # # EVENT warmStart .1.3.6.1.6.3.1.1.5.2 "Status Events" Normal FORMAT Device reinitialized (warmStart) #EXEC qpage -f TRAP notifygroup1 "Device reinitialized (warmStart)" SDESC A warmStart trap signifies that the SNMPv2 entity, acting in an agent role, is reinitializing itself such that its configuration is unaltered. EDESC # # # EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal FORMAT Link down on interface $1. Admin state: $2. Operational state: $3 #EXEC qpage -f TRAP notifygroup1 "Link down on interface $1. Admin state: $2. Operational state: $3" SDESC A linkDown trap signifies that the SNMP entity, acting in an agent role, has detected that the ifOperStatus object for one of its communication links is about to enter the down state from some other state (but not from the notPresent state). This other state is indicated by the included value of ifOperStatus. EDESC # # # EVENT linkUp .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal FORMAT Link up on interface $1. Admin state: $2. Operational state: $3 #EXEC qpage -f TRAP notifygroup1 "Link up on interface $1. Admin state: $2. Operational state: $3" SDESC A linkUp trap signifies that the SNMP entity, acting in an agent role, has detected that the ifOperStatus object for one of its communication links left the down state and transitioned into some other state (but not into the notPresent state). This other state is indicated by the included value of ifOperStatus. EDESC # # # EVENT authenticationFailure .1.3.6.1.6.3.1.1.5.5 "Status Events" Normal FORMAT SNMP athentication failure #EXEC qpage -f TRAP notifygroup1 "SNMP authentication failure" SDESC An authenticationFailure trap signifies that the SNMPv2 entity, acting in an agent role, has received a protocol message that is not properly authenticated. While all implementations of the SNMPv2 must be capable of generating this trap, the snmpEnableAuthenTraps object indicates whether this trap will be generated. EDESC
上記の記述だと、coldStart、warmStart、linkDown、linkUp、authenticationFailure 以外のトラップを受信したとき何もログが残らないので、以下の記述を追記する。(文末でOK)
# # # EVENT general .* "General Events" Normal FORMAT ZBXTRAP $aA Unknown
上記では .*
と指定していて、どんな文字のトラップでも
、という記載をしている。
この部分を特定の文字(トラップのOID や変数)を指定することで、特定のトラップ受信時には特定のログを記録する、という設定をすることができる。
zabbix_server.conf の設定変更
zabbix_server.conf をエディタで開く
vi /etc/zabbix/zabbix_server.conf
定義されているパラメータを以下の内容に修正
SNMPTrapperFile=/var/log/snmptt/snmptt.log StartSNMPTrapper=1
zabbix-serverプロセスの再起動
systemctl restart zabbix-server
snmptt のデーモン設定
snmptt は standalone モードと daemon モードの2種類で動作可能。
daemon モードの方が多量のトラップを短時間で処理できるのでやっておく。
snmptt.ini をエディタで開く。
vi /etc/snmp/snmptt.ini
下記パラメータを修正。
mode = daemon net_snmp_perl_enable = 1 net_snmp_perl_best_guess = 2 sleep = 5 DEBUGGING = 0 multiple_event = 0 date_time_format = %Y/%m/%d %H:%M:%S DEBUGGING_FILE = /var/log/snmptt/snmptt.debug DEBUGGING_FILE_HANDLER = /var/log/snmptt/snmptthandler.debug
サービスの起動
systemctl start snmptt
トラップ送信テスト
localhost を指定して、自分から自分にトラップを送信して、それが受信できるか確認してみる。
snmptrap -v 2c -c test 127.0.0.1 '' .1.1.1 .1.1.1 s "This is a test."
ログの確認
cat /var/log/snmptt/snmptt.log
tail -f /var/log/snmptt/snmptt.log
以下のようなログがでれば成功。
[root@test-03 ~]# tail -f /var/log/snmptt/snmptt.log 2022/08/27 07:01:43 .1.1.1 Normal "General Events" localhost - ZBXTRAP 127.0.0.1 Unknown
上記のトラップは snmptt.conf に記載した EVENT general .* "General Events" Normal
にマッチして記録されたログです。
せっかくなので、同じく snmptt.conf に記載されていた coldStart を snmptrap コマンドで送信して結果を見てみる。
送信コマンド
[root@test-03 ~]# snmptrap -v 2c -c public localhost '' .1.3.6.1.6.3.1.1.5.1
受信ログ確認
[root@test-03 ~]# tail -f /var/log/snmptt/snmptt.log 2022/08/27 07:42:33 .1.3.6.1.6.3.1.1.5.1 Normal "Status Events" localhost - Device reinitialized (coldStart)
Zabbix での受信確認
Zabbix で受信したトラップを確認するにはアイテムを作成する必要がある。
また、SNMP トラップを受信するためには、SNMP インターフェースを持つ監視ホストを作成する必要があるので、以下画像のようにホストをアイテムを作成した。
設定完了後、以下のコマンドを実行してトラップを受信。
snmptrap -v 2c -c test 127.0.0.1 '' .1.1.1 .1.1.1 s "This is a test."
Zabbix で結果を確認する。
受信できた。
もともと snmptt.conf に記載されていた coldStart トラップを受信してみる
/etc/snmp/snmptt.conf
の設定を書き換えることで coldStart 等すでに記載されている SNMP トラップを Zabbix で受信できるようになる。
修正箇所は、各トラップの FORMAT
の行を FORMAT ZBXTRAP $aA
と置換する。
以下にサンプルを記載します。
[root@test-03 ~]# cat /etc/snmp/snmptt.conf # # # EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal FORMAT ZBXTRAP $aA Device reinitialized (coldStart) #EXEC qpage -f TRAP notifygroup1 "Device reinitialized (coldStart)" SDESC A coldStart trap signifies that the SNMPv2 entity, acting in an agent role, is reinitializing itself and that its configuration may have been altered. EDESC # # # EVENT warmStart .1.3.6.1.6.3.1.1.5.2 "Status Events" Normal FORMAT ZBXTRAP $aA Device reinitialized (warmStart) #EXEC qpage -f TRAP notifygroup1 "Device reinitialized (warmStart)" SDESC A warmStart trap signifies that the SNMPv2 entity, acting in an agent role, is reinitializing itself such that its configuration is unaltered. EDESC # # # EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal FORMAT ZBXTRAP $aA Link down on interface $1. Admin state: $2. Operational state: $3 #EXEC qpage -f TRAP notifygroup1 "Link down on interface $1. Admin state: $2. Operational state: $3" SDESC A linkDown trap signifies that the SNMP entity, acting in an agent role, has detected that the ifOperStatus object for one of its communication links is about to enter the down state from some other state (but not from the notPresent state). This other state is indicated by the included value of ifOperStatus. EDESC # # # EVENT linkUp .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal FORMAT ZBXTRAP $aA Link up on interface $1. Admin state: $2. Operational state: $3 #EXEC qpage -f TRAP notifygroup1 "Link up on interface $1. Admin state: $2. Operational state: $3" SDESC A linkUp trap signifies that the SNMP entity, acting in an agent role, has detected that the ifOperStatus object for one of its communication links left the down state and transitioned into some other state (but not into the notPresent state). This other state is indicated by the included value of ifOperStatus. EDESC # # # EVENT authenticationFailure .1.3.6.1.6.3.1.1.5.5 "Status Events" Normal FORMAT ZBXTRAP $aA SNMP athentication failure #EXEC qpage -f TRAP notifygroup1 "SNMP authentication failure" SDESC An authenticationFailure trap signifies that the SNMPv2 entity, acting in an agent role, has received a protocol message that is not properly authenticated. While all implementations of the SNMPv2 must be capable of generating this trap, the snmpEnableAuthenTraps object indicates whether this trap will be generated. EDESC # # # EVENT general .* "General Events" Normal FORMAT ZBXTRAP $aA Unknown [root@test-03 ~]#
上記設定変更して、snmptt を再起動。
systemctl restart snmptt
その後 Zabbix に以下のアイテムを作成。
キーに snmptrap[coldStart]
と設定すると、トラップ受信時のメッセージ中に coldStart
の文字列が含まれていたらこのアイテムにヒストリとして受信ログが書きこまれる。
[]
の中は正規表現で設定可能。
coldStart トラップを送信してみる。
snmptrap -v 2c -c public localhost '' .1.3.6.1.6.3.1.1.5.1
受信確認。
受信できた。
最後に
これで snmptrap コマンドでいろいろなトラップを送信することで、Zabbix 側での受信内容を確認することができる。
また、snmptt.conf の実装の確認にも利用できるので、利用できる方は利用してみてください。