amegonの雑なブログ

日常的なものから技術的なものまでメモの雑記

SNMP トラップを送信する実機がなくてもトラップを送受信する術をメモる

経緯

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.fallback)

設定完了後、以下のコマンドを実行してトラップを受信。

snmptrap -v 2c -c test 127.0.0.1 '' .1.1.1 .1.1.1 s "This is a test."

Zabbix で結果を確認する。

Zabbixトラップ確認(最新データ)

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 の実装の確認にも利用できるので、利用できる方は利用してみてください。