|||||||||||||||||||||

なんぶ電子

- 更新: 

SNMPをDebian10のZabbix5.2で

#Zabbix5.2

以前の「ネットワーク調査の方法」の記事でSNMPについて触れましたが、SNMPのデータはそのままだと管理しづらいのでフリーの監視ツールであるZabbixに統合させたいと思います。

以前、筆者は同様のことができるMRTGを使っていたことがあるのですが、そちらはしばらく更新してないようだったので後継を探したところこのZabbixにたどり着きました。

Debian10にZabbix5.2をインストールして、SNMPのエージェントへの問い合わせとTRAP受信をしてデータを蓄積することを今回の目標にします。

Zabbixのインストールと初期設定

Zabbix:「パッケージからのインストール」に従ってDebianでパッケージをインストールします。

$ su -
...
# apt update
...
apt install zabbix-server-mysql zabbix-frontend-php

Zabbix:「Download」ページより、執筆時点での安定最新バージョンである5.2を指定して、筆者の環境であるDebian10-MySQL-Apache環境を選択しました。

Zabbixのダウンロード

先の選択状況により画面に出力されるテキストが変わります。今回は次のようになっていましたので、その通りに進めます。

# cd /usr/local/src
# wget https://repo.zabbix.com/zabbix/5.2/debian/pool/main/z/zabbix-release/zabbix-release_5.2-1Bdebian10_all.deb
# dpkg -i zabbix-release_5.2-1+debian10_all.deb
# apt update

続けてzabbix-server-mysql、zabbix-frontend-php、zabbix-apache-conf、zabbix-agentをインストールします。

# apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent

Zabbix用のデータベースとユーザーを作成します。mysqlとありますが、筆者の環境ではMariaDBなのでそちらを使います。

# mysql -u root
MariaDb[(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDb[(none)]> create user zabbix;
MariaDb[(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
MariaDb[(none)]> grant all privileges on zabbix.* to zabbix@'%' identified by 'password';
MariaDb[(none)]> exit

初期スキーマとデータをインポートします。zcatはgzファイルの圧縮・展開をするツールです。展開したファイルをパイプでMariaDBに渡します。

実行時パスワードを聞かれますので、先にMariaDBに設定したパスワードを入力します。ちなみに-uの後のzabbixはユーザー名、-pのあとのzabbixはデータベース名です。ちなみにここでは、-pオプションでパスワードを省略し、後から求められるようにしていますが、コマンドラインに含める際はスペースを付与せずに記述します。履歴に残ってしまうので、パスワードを付与するのはおすすめしません。

# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -u zabbix -p zabbix

データベースの設定ができたら今度はZabbix Serverの設定にDBへの接続情報を入力します。DBNameとDBUserは初期値であるzabbixになっています。先ほどの処理でこの値でデータベースとユーザーを作成していれば変更する必要はありません。そのあとDBPasswordという行がコメントアウトされた状態で存在するので、コメントアウトを外して先に設定したパスワードを入力して保存します。

Zabbixサーバーとエージェント、apache2サービスを再起動し、有効にします。

systemctl restart zabbix-server zabbix-agent apache2
systemctl enable zabbix-server zabbix-agent apache2

ここまで設定すると、ブラウザのアドレスバーにhttp://IPアドレス/zabbixと入力することでZabbixのフロントエンド(GUI)へアクセスできます。これ以降はブラウザからアクセスしてGUIから設定をします。ファイアウォールを指定している場合は環境に合わせて通信ができるようにしてください。

フロントエンドからの初期設定

  1. 言語を「日本語」にします
  2. 前提条件のチェックがすべてOKになっているのを確認します
  3. 先に設定したデータベースへの接続設定を入力します
  4. Zabbixサーバーのアドレスとポートを設定します
Zabbixフロントエンド初期設定1
  1. GUI設定はデフォルトのまま
  2. 最終確認をします
  3. ログイン画面が表示されます
Zabbixフロントエンド初期設定2

これで初期設定は終わりです。ログインページがでてくるので、ユーザー名「Adimin」とパスワード「zabbix」でログインします。

SNMPエージェントへ問い合わせ

Zabbixサーバーを稼働させることができたので、SNMP対象の機器にデータを問い合わせる設定をしてみたいと思います。

前提条件として監視対象の機器でSNMPエージェントが稼働している必要があります。

少し古いルーターですが、アライドテレシスのAR410V2でのSNMPの設定は次のようになります。後継のAR415Sでも方法は同じだと思います。

TRAPHOSTとMANAGERという項目で同じIP(ZabbixサーバーのIP)を設定しています。データ問合せを受け付けるIPがMANAGERの項目、後で説明するTRAP送信先のIPアドレスがTRAPの設定値となります。

# SNMPを有効にします。
>ENABLE SNMP
# コミュニティ名と呼ばれるパスワードを兼ねる文字列を決めます。
# 慣例では、読み込み専用のコミュニティ名はpublic 書き込みができる場合はprivateという名前になっています。
> CREATE SNMP COMMUNITY=public ACCESS=READ
# 管理ホストとトラップホストを設定します。管理ホストのREAD要求に答え、またトラップホストにTRAPを送信します。
> ADD SNMP COMMUNITY=public TRAPHOST=192.168.1.1 MANAGER=192.168.1.1
# トラップ送信を有効にします。
> ENABLE SNMP COMMUNITY=public TRAP
# port4に対するリンクアップダウンのトラップ送信を有効にします。
> ENABLE INTERFACE=port4 LINKTRAP

監視対象となる機器の設定ができたら、 Zabbix:「SNMPエージェント」に従ってサーバーの設定をしていきます。

Zabbixインストール時にsnmpwalkというアプリがインストールされているので、それを使って対象機器のOIDを調査します。

OIDとはSNMPで管理することのできる項目、またはその集合のインデックスで、ツリー状になっています。OS上のファイルとフォルダに似た構造ですが、集合を示す場合も単一の場合のどちらもオブジェクトと呼ばれます。そして、これらの情報を格納しておく領域をMIBと呼びます。

snmpwalkでは指定した機器のオブジェクトを列挙してくれます。使い方は次の通りです。

vオプションでSNMPのバージョン、cオプションでコミュニティ名、最後の.はルートオブジェクトを指します。

# snmpwalk -v 2c -c public 機器のIPアドレス .

上で指定しているオプションについてもう少し詳しく見ていきます。WikiPedia:「Simple Network Management Protocol」によれば、SNMPにはバージョンは1,2,3系があるそうです。コマンドラインに渡している「2c」はバージョン2cを指しています。snmpwalkでは「1,2c,3」のいずれかのバージョンを指定できますが、3でエラーがでたのでここではひとつバージョンをさげました。

cオプションで渡すのはコミュニティ名です。これはSNMPエージェントに設定する問合せ時用の名前で、慣例としてオブジェクトに対して読み出しのみを許可している場合「public」、書き込みも許可している場合は「private」となっています。またこのコミュニティ名をパスワード的に運用しているエージェントもあります。先の設定コマンドの中にもあったように、ここではコミュニティ名を「public」として設定しています。

最後に指定しているのは、オブジェクトのパスです。.はルートを示します。ここで指定したオブジェクトの下にあるオブジェクトが結果として戻ります。

標準のMIBオブジェクトへのパスは次のようになっています。

.1(iso).3(org).6(dot).1(internet).2(mgmt).1(mib-2)

この数値の羅列をOID(Object ID)と呼びます。

この標準MIBの下のオブジェクトは次のようになっています。ルーターにより該当するOIDが存在しないこともあります。

  • 1(system)
  • 2(interface)
  • 3(address translation)
  • 4(ip)
  • 5(icmp)
  • 6(tcp)
  • 7(udp)
  • 8(egp)
  • 9(oim)
  • 10(transmission)
  • 11(snmp)

AR410V2では返すデータ量により途中で出力が打ち切りになるようでした。「.1.3.6.1.2.1.2」等の対象オブジェクトを絞り込んで確認しました。

こららの情報はネットワークエンジニアを目指してを参考にさせていただきました。また、バージョン1のMIBの仕様についてはRFC1156、バージョン2の使用についてはRFC1213で定義されているということです。

ここから先は中身を見ながらOIDを探していきます。

項目名が文字列になっている場合もあるそうですがAR410V2ではそうなっていませんでした。ただメーカーが独自に設定している部分を除いて、OIDに対する項目は共通なので、慣れれば目的のものをすぐに見つけられるようになります。

たとえば「1.3.6.1.2.1.2.2.1.2」でインターフェースの詳細が出ます。


snmpwalk -v 2c -c public 192.168.1.1 .1.3.6.1.2.1.2.2.1.2
...
iso.3.6.1.2.1.2.2.1.2.1 = STRING: "port1"
iso.3.6.1.2.1.2.2.1.2.2 = STRING: "port2"
iso.3.6.1.2.1.2.2.1.2.3 = STRING: "port3"
iso.3.6.1.2.1.2.2.1.2.4 = STRING: "port4"
iso.3.6.1.2.1.2.2.1.2.5 = STRING: "eth0"
iso.3.6.1.2.1.2.2.1.2.6 = STRING: "vlan1"
iso.3.6.1.2.1.2.2.1.2.7 = STRING: "ppp0"
...

末尾の割り当てられ方はルーターによってかわってきますが、今回の例だと末尾1がport1、末尾5はeth0ポートだということがわかります。

続いて、「1.3.6.1.2.1.2.2.1.10」はポート毎の受信オクテット数です。先のインターフェース詳細と末尾と照らし合わせてどのポートの情報かを判断します。

また「1.3.6.1.2.1.2.2.1.16」はポート毎の送信オクテット数です。

...
iso.3.6.1.2.1.2.2.1.10.1 = Counter32: 4294967295
iso.3.6.1.2.1.2.2.1.10.2 = Counter32: 4294967295
iso.3.6.1.2.1.2.2.1.10.3 = Counter32: 3502198396
iso.3.6.1.2.1.2.2.1.10.4 = Counter32: 131446143
iso.3.6.1.2.1.2.2.1.10.5 = Counter32: 3267509125
iso.3.6.1.2.1.2.2.1.10.6 = Counter32: 1638621331
iso.3.6.1.2.1.2.2.1.10.7 = Counter32: 1049132010
...
iso.3.6.1.2.1.2.2.1.16.1 = Counter32: 4294967295
iso.3.6.1.2.1.2.2.1.16.2 = Counter32: 4294967295
iso.3.6.1.2.1.2.2.1.16.3 = Counter32: 4294967295
iso.3.6.1.2.1.2.2.1.16.4 = Counter32: 1278612347
iso.3.6.1.2.1.2.2.1.16.5 = Counter32: 1671050333
iso.3.6.1.2.1.2.2.1.16.6 = Counter32: 2216234541
iso.3.6.1.2.1.2.2.1.16.7 = Counter32: 2215012061
...

もし、snmpwalkで文字列の名称が出力されるようなら、文字列からオブジェクトIDへの変換は次のようにします。ここではMIBバージョン2Cを指定して、192.168.1.1にあるpublicコミュニティのMIB「IF-MIB::ifInOctets.3」のOIDを検索しています。

# snmpget -v 2c -c public -On 192.168.1.1 IF-MIB::ifInOctets.3
.1.3.6.1.2.1.2.2.1.10.3 = Counter32: 3472126941

Zabbixのホストの登録

監視対象のOIDを見つけられたら、ZabbixのGUIの画面に登録します。

Zabbixではホストという単位でデータを管理しています。やりかたはいろいろあると思いますが、ここではRouterというホストを作ってひとつのルーターの情報をそこに結びつけます。

左のタブで「設定」から「ホスト」を選択すると、右上に「ホストの作成」というボタンが表示されるので押します。

次の画面ではホスト名を半角文字で任意に入れ(SNMPの時は任意の文字列が可能です)、グループでは選択肢の中から「Templates/Network Devices」を選択します。次にインターフェースの追加を押し「SNMP」を選択します。これで追加を押します。

ZabbixのSNMPのホストの設定

以上でホストの登録は終わりです。次はホストに監視対象のオブジェクトを登録します。ホストの一覧から、今回作成した「Router」の行にある「アイテム」というリンクをクリックします。

今度は右上に「アイテムの作成」というボタンがあるので押します。アイテムに調査対象のSNMPのオブジェクトを登録します。

ここではオブジェクトID「1.3.6.1.2.1.2.2.1.10.7」をセットしたいと思います。筆者の環境ではPPP0(インターネット)における受信転送量となります。

登録画面で、名前に「任意の名前(ここではPPP0_Rとしました)」、タイプに「SNMPエージェント」、キーの部分に先ほど取得したOIDの値、ホストインターフェースは自動で入っていると思いますが、「ルーターのIP:ポート番号(161)」、SNMPOIDに再度OIDを入力します。データ型も数値(整数か浮動小数)になっていなかったら変更します。

監視間隔はデフォルトで1m(1分)となっています。ネットワークへの負荷も考えながら設定してください。

ZabbixのSNMPのアイテムの設定

ここまで入力したらページ上部のタブにある「保存前処理」を選択し、「追加」を押した後名前の部分で「差分」を選択します。

これは先のOIDの値には累積値で転送量が入っているためで、「差分」を選択することにより時間単位の転送量に変換します。つまり、取得値から前回の値を引いた値を転送量とします。

ZabbixのSNMP差分

登録したデータは左側のメニューの「監視データ」よりチェックができます。「監視データ」「最新データ」で表示される表の中から、対象のアイテム名の右側にある「グラフ」というリンクをクリックすると転送量の遷移がグラフで表示されます。

問い合わせの設定は以上となります。

TRAP受信

SNMPには前述のマネージャーが対象の機器に問合せに行く方法の他に、エージェントからマネージャーにデータを送るTRAPという仕組みがあります。

今度はそのTRAP受信の設定をZabbix:「3 SNMPトラップ」を参考に設定します。

ルーターにトラップ送信の設定をしておく必要がありますが、今回は先のSNMPの設定の際にインターフェースのアップダウンに関するトラップ送信の設定をしてあるので省略します。

まずZabbixは単独ではSNMPTRAPの受信ができません。そのためZabbixが稼働するサーバーでsnmptrapdというLinuxのデーモンでSNMPのTRAPを待ち受けます。

snmptrapdが受信したTRAPを今度はSNMPTTというアプリが受け取り、書式を整えてファイル化します。

最後にSNMPTTが出力したファイルをZabbixのSNMPトラッパーが読み込みます。

なのでまずsnmptrapdとsnmpttをインストールします。

$ su -
...
# apt update
...
# apt install snmptrapd tnmptt

Zabbixの設定、snmptrapdの設定、snmpttの設定を修整します。

まずZabbixの設定です。SNMPトラッパーが収集するログファイルの場所の設定と、SNMPトラッパーの有効化をします。

/etc/zabbix/zabbix_server.conf

...
### Option: StartSNMPTrapperFile
StartSNMPTrappeFile=/var/log/snmptt/snmptt.log
...
### Option: StartSNMPTrapper
# コメントアウトを外して0を1に
StartSNMPTrapper=1
...

snmptrapdの設定で、トラップハンドラ(受信したSNMPの処理を伝播するアプリ)をSNMPTTに設定します。最終行に次の行を書き加えます。

/etc/snmp/snmptrapd.conf

...
traphandle default snmptt

snmpttの設定ファイルは2重構造になっています。基本的な設定を入力するsnmptt.iniと、そこから呼び出されるトラップの定義ファイルであるsnmptt.confです。snmptt.confは筆者の環境では新規作成しました。

snmptt.iniファイルにはログファイルの出力場所と日付フォーマットの書式を設定します。

ログファイルの出力の場所は、先にZabbixに設定した場所と一致させる必要があります。snmptt自身のログであるファイルの設定であるlog_system_fileエントリーと混同しないように注意してください。

このファイルの末尾には[TrapFiles]という項目があり、次に設定するsnmptt.confの読み込みもこのファイルの中で記述されています。

日本語の解説内では存在しませんでしたが、英語版の解説snmptrapdには「net_snmp_perl_enable=1」を設定するように書かれていました。この利用にはnet-snmp-perlが必要だということですがおそらくDebian10でインストールする分には同梱されていると思います。この設定をしないと筆者の環境ではテストが成功しませんでした。

/etc/snmp/snmptt.ini

...
log_file=/var/log/snmptt/snmptt.log
...
date_time_format = %H:%M:%S %Y/%m/%d
...
net_snmp_perl_enable =1
...

snmptt.confではデータのトラップのフォーマットを指定します。ここではデフォルトのトラップフォーマットを作成します。

EVENTで対象のTRAPを指定し、FORMATで書式を設定します。この設定ファイルのサンプルは/usr/share/doc/snmptt/examples/snmptt.conf.genericあるので興味があれば確認してみてください。サンプル中ではOIDを指定していますが、ここでは「.*」とワイルドカードを使ってすべてのTRAPに対しての設定をしています。

/etc/snmp/snmptt.conf

EVENT general .* “General event” Normal
FORMAT ZBXTRAP $aA $ar

ZabbixGUIでTRAP用のアイテムを設定

最後にGUIの設定をします。

左側の「設定」から先ほどの「Router」ホストを選択し、インターフェースの「追加」で「SNMP:127.0.0.1」を加えます。このインターフェースはテスト時用のものです。

左の「設定」「ホスト」の項目を表示させ、対象となる機器の行にある「アイテム」を選択したのちに出てくる画面の左上から「アイテムの作成」を選択します。これは、先ほどアイテムを作成したのと同じ要領です。

名前を付け、「SNMPトラップ」を選択し、キーには「snmptrap["General"]」と記述します。これは、Generalという文字列で正規表現チェックをし一致したものを対象とするという設定です。ちなみに、一連の正規表現チェックで対象外となったSNMPトラップに関しては「snmptrap.fallback」というキーで取得できます。

ホストインターフェースは監視対象のIPアドレスになります。ここではテスト用に「127.0.0.1:161」とします。データ型は「ログ」としました。

これで全ての設定が完了しました。サービスを再起動させます。また今回新たに加えたsnmptrapdと、snmpttサービスを有効にしておきます。

# systemctl restart zabbix-server zabbix-agent apache2 snmptrapd snmptt
# systemctl enable snmptrapd snmptt

snmptrapを使ってテストをします。

# snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring000"

GUI画面の監視データの項目でTRAPログが表示されれば成功です。テストが終わったらホストインターフェースのIPアドレスを監視対象の機器のものに変えましょう。

Zabbix SNMP Trapログ

snmptt.logは [タイムスタンプ] [トラップパート1] [ZBXTRAP] [address] [トラップパート2]の書式になっています。

Zabbixは「ZBXTRAP」の文字列と、[address]と設定してあるインターフェースが一致した場合にそのログを該当するものとして取り込みます。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告