うちにあるプリンターは SNMP に対応しているので、これで監視してみる。ネットワーク機器の多くは SNMP で状態が分かるみたいなので、学習にはうってつけ。
やること。
※アイテムタイプのマニュアル
ZABBIX / Item types 4.0LTS(英語)
ZABBIX / アイテムタイプ 2.2(日本語)
SNMP
SNMPって?
SNMP
SNMP(Simple Network Management Protocol)は、ネットワーク上の機器を監視したり操作したりするプロトコル。
ネットワークエンジニアとして / TCP/IP - SNMP
プロトコルバージョンは1~3まであって、今回は2を使って監視。
3はセキュリティが強化されているらしいが、今回は触れていない。
MIB
SNMPの情報は好きなように羅列されているわけじゃなくて、MIB(Management Information Base)というツリー構造で管理されている「オブジェクト」に値を入れるようになっている。
ITBOOK / MIB(Management Information Base)
ツリー構造は RFC で決まっていて、番号が付いている。system という塊から情報を取るなら、
iso(1)→org(3)→dod(6)→internet(1)→mgmt(2)→mib-2(1)→system(1)
ってな感じで system を特定して値を取得する。
この他、メーカーが製品に独自の情報を載せたいと思ったら、RFC に従いつつ独自の拡張ができるみたい。
iso(1)→org(3)→dod(6)→internet(1)→private(4)→enterprises(1)→拡張MIB
OID
MIBのところに書いているオブジェクトに割り付けるID。system であれば、
.1.3.6.1.2.1.1
という番号で参照する。
SNMP関連ツールのインストール
snmpwalk で確認するのは前回と同じ。
$ sudo apt install snmp
$ sudo systemctl stop snmpd
$ sudo systemctl disable snmpd
※snmp コマンドを使うためだけにパッケージをインストールするが、snmpd もインストールされてサービス開始してしまったので止めてある。
前回は反応するかどうかだけを確認するためにツールをインストールしたが、今回は取得した値がどんなものなのかも確認したいため、もう一段の設定をする。
具体的には、system や interfaces 等のキーワードでアクセスができるように MIB をインストールする。インストールの最中に MIB のダウンロードが行われる。
$ sudo apt install snmp-mibs-downloader
MIB ファイルが用意できたら、設定ファイルを修正する。
/etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :
プリンターを監視対象に追加
コマンドを打つと応答が返ってくるので、SNMP で監視ができそう。
$ snmpwalk -v 2c -c public printer system
SNMPv2-MIB::sysDescr.0 = STRING: Brother NC-360h, Firmware Ver.N ,MID 8CA-V62-001
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.2435.2.3.9.1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (746136984) 86 days, 8:36:09.84
SNMPv2-MIB::sysContact.0 = STRING:
…
$ snmpwalk -v 2c -c public printer interfaces
IF-MIB::ifNumber.0 = INTEGER: 4
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: NC-360h
…
$ snmpwalk -v 2c -c public printer ip
IP-MIB::ipForwarding.0 = INTEGER: notForwarding(2)
IP-MIB::ipDefaultTTL.0 = INTEGER: 64
IP-MIB::ipInReceives.0 = Counter32: 8458539
IP-MIB::ipInHdrErrors.0 = Counter32: 0
IP-MIB::ipInAddrErrors.0 = Counter32: 22274
CPU使用率みたいなものが取り出せたら良いのだが、プリンター側にそのような値はなさそうに見える。そこで、動いていることが確認できそうな
IP-MIB::ipInReceive(エラーを含む全てのパケット数)
で監視してみようかと思う。
$ snmpwalk -v 2c -c public printer IP-MIB::ipInReceives
IP-MIB::ipInReceives.0 = Counter32: 8458698
$ snmpwalk -v 2c -c public printer IP-MIB::ipInReceives
IP-MIB::ipInReceives.0 = Counter32: 8458718
順調にパケットが増えている。
この項目を番号で表すと…
$ snmptranslate -IR -On IP-MIB::ipInReceives.0
.1.3.6.1.2.1.4.3.0
となった。
監視するアイテムとグラフの登録
前回、テンプレート My Home Devices Templates を ping による監視につかったので、My Home Devices Templates for SNMP を作成する。(本当はもっと効率の良い管理の仕方があるのかもしれないが、今の時点で分かっている機能を使う感じ…)
ホストを作成する。その際、エージェントのインターフェースを削除し、SNMPインターフェースを追加する。
作成したテンプレートとリンクする。
テンプレートにアイテムを追加する。キー文字列は意味のある何らかの値であれば良いらしく、SNMP-Packet-Receive という適当な名前を付けてみた。
OID のところに数字を入れようと思ったが、よくよく見るとサンプルに MIB が書かれていたので MIB をセットしてみた。
また、受信パケット数はずっと数値が積み上がっていくので、差分を設定してみた。
さらにグラフを追加する。最大値は自動計算とした。
スクリーンに表示したところ、こんなグラフが出力された。
装置が用意している値であれば、Zabbix で取り出してなんとかできそう。
Cisco の製品であればテンプレートが用意されているから、それを使うのがいいんだろうと思われる。
やったこと
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
前回、試しにプリンターに snmpwalk コマンドで問い合わせをしてみたら、やけに数字が多かった。
$ snmpwalk -v 2c -c public printer
iso.3.6.1.2.1.1.1.0 = STRING: "Brother NC-360h, Firmware Ver.N ,MID 8CA-V62-001"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.2435.2.3.9.1
…
なんだか分かりづらいなぁ。
色々なところで書かれている system で問い合わせてみようか。
$ snmpwalk -v 2c -c public printer system
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
どこかのページに書かれていたコマンドを試してみても、値が取り出せない。
機器がこの値を持っていないのではなく、問い合わせそのものができていない。
$ snmpwalk -v 2c -c public localhost HOST-RESOURCES-MIB::hrProcessorLoad
MIB search path: /home/hogeuser/.snmp/mibs:/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp
Cannot find module (HOST-RESOURCES-MIB): At line 1 in (none)
HOST-RESOURCES-MIB::hrProcessorLoad: Unknown Object Identifier
$ snmptranslate -IR -On LM-SENSORS-MIB::lmTempSensorsValue.6
MIB search path: /home/hogeuser/.snmp/mibs:/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp
Cannot find module (SNMPv2-TC): At line 15 in /usr/share/snmp/mibs/LM-SENSORS-MIB.txt
Cannot find module (SNMPv2-SMI): At line 34 in /usr/share/snmp/mibs/UCD-SNMP-MIB.txt
Cannot find module (SNMPv2-TC): At line 37 in /usr/share/snmp/mibs/UCD-SNMP-MIB.txt
Did not find 'enterprises' in module #-1 (/usr/share/snmp/mibs/UCD-SNMP-MIB.txt)
Did not find 'DisplayString' in module #-1 (/usr/share/snmp/mibs/UCD-SNMP-MIB.txt)
Did not find 'TruthValue' in module #-1 (/usr/share/snmp/mibs/UCD-SNMP-MIB.txt)
Unlinked OID in UCD-SNMP-MIB: ucdavis ::= { enterprises 2021 }
Undefined identifier: enterprises near line 39 of /usr/share/snmp/mibs/UCD-SNMP-MIB.txt
Did not find 'DisplayString' in module #-1 (/usr/share/snmp/mibs/LM-SENSORS-MIB.txt)
Did not find 'ucdExperimental' in module UCD-SNMP-MIB (/usr/share/snmp/mibs/LM-SENSORS-MIB.txt)
Unlinked OID in LM-SENSORS-MIB: lmSensors ::= { ucdExperimental 16 }
Undefined identifier: ucdExperimental near line 32 of /usr/share/snmp/mibs/LM-SENSORS-MIB.txt
Unknown object identifier: LM-SENSORS-MIB::lmTempSensorsValue.6
これはいよいよおかしい…と思って調べてみたらこんな情報が!
先のリンクでも触れられているが snmp-mibs-downloader というのをインストールしてみた。
IT Blog / Installing MIB in Ubuntu and Solving the Error “SNMP Cannot Find Module …”
$ sudo apt install snmp-mibs-downloader
…
Downloading documents and extracting MIB files.
This will take some minutes.
In case this process fails, it can always be repeated later by executing
/usr/bin/download-mibs again.
RFC1155-SMI: 119 lines.
RFC1213-MIB: 2613 lines.
NOTE: SMUX: ignored.
…
IANA-IPPM-METRICS-REGISTRY-MIB: 818 lines.
IANA-MAU-MIB: 984 lines.
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
少し結果が変わった。
$ snmpwalk -v 2c -c public localhost HOST-RESOURCES-MIB::hrProcessorLoad
HOST-RESOURCES-MIB::hrProcessorLoad = No more variables left in this MIB View (It is past the end of the MIB tree)
$ snmptranslate -IR -On LM-SENSORS-MIB::lmTempSensorsValue.6
.1.3.6.1.4.1.2021.13.16.2.1.3.6
しかし、もう少し調べてみると、ライセンスの問題で system や interfaces で検索ができない状態らしい。
GM3D覚え書き / MRTG用のsnmp設定
$ snmpwalk -v 2c -c public printer system
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
※結果は変わらなかった。
この情報を得て、幾つか調べていくと…
オールトの雲 / [鯖缶] SNMP(3) NET-SNMP のインストール
https://mistymagich.wordpress.com/2016/07/19/ubuntu-14-04-ubuntu-16-04上のsnmpwalksnmptranslateでエラーが出力される
そして、ここにたどり着いた。
Linux Consulting & Training / How to fix net-snmp / snmpwalk errors in Debian 7
以下のファイルを置き換えるとしている。
※Debian では snmp がない?っぽく、Ubuntu 18.04に合わせて記載。
/usr/share/snmp/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
/usr/share/snmp/mibs/ietf/SNMPv2-PDU
/usr/share/snmp/mibs/ietf/IPATM-IPMC-MIB
それぞれをダウンロードして差分を見てみる。
iana.org は IPv6 対応しているが、wgetがうまく処理できないっぽいので -4 指定している。
$ wget -4 http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -O ./IANA-IPPM-METRICS-REGISTRY-MIB
$ wget http://pastebin.com/raw.php?i=p3QyuXzZ -O ./SNMPv2-PDU
$ wget http://pastebin.com/raw.php?i=gG7j8nyk -O ./IPATM-IPMC-MIB
結果として、以下の通りとなった。
IANA-IPPM-METRICS-REGISTRY-MIB → 空白や改行以外の差分なし
/usr/share/snmp/mibs/ietf/SNMPv2-PDU
111行目
-- VarBindList
SEQUENCE (SIZE (0..max-bindings)) OF VarBind
131行目
-- VarBindList ::= SEQUENCE (SIZE (0..max-bindings)) OF VarBind
/usr/share/snmp/mibs/ietf/IPATM-IPMC-MIB
5~6行目
-- mib-2, MODULE-IDENTITY, NOTIFICATION-TYPE, Counter32,
-- Integer32, Unsigned32, OBJECT-TYPE, IpAddress
snmpModules, MODULE-IDENTITY, NOTIFICATION-TYPE, Counter32,
Integer32, Unsigned32, OBJECT-TYPE, IpAddress, mib-2
これでもなお、snmpwalk は system みたいな名前でのアクセスができない。
以下のパラメータでどこのファイルを探しているのかということは見える。
$ snmpwalk -Dparse-mibs -v 2c -c public localhost system
…
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
情報はそろったはず…そんなはずはない。
この記述を見つけた…
freeZion / Ubuntu and SNMP MIBs
コードログ / 14.04-SNMPが壊れているのはなぜですか?(リンク切れ)
/etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :
コメント部分を翻訳してもらったら…
ライセンス上の理由により、snmpパッケージにはMIBファイルが含まれていないため、MIBのロードはデフォルトで無効になっています。 MIBを追加した場合、次の行をコメント化することにより、MIBのロードを再度有効にできます。
となっている。最初に見たブログの sed はコメントアウトのものだったのか?何にせよ時間を無駄に使ってしまった。
コメント化した後にコマンドを打ってみたら、しっかりと値が取り出せた。
$ snmpwalk -v 2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux temp 4.15.0-64-generic #73-Ubuntu SMP Thu Sep 12 13:16:13 UTC 2019 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
…
プリンター用のMIBを探す
プリンターのメーカー名、snmp、mib といった検索キーで探してみたところ、以下のページが見つかった。
OiDViEW / Free BROTHER-MIB MIB Download - Search, Download, and Upload MIBs
だけど、うまくダウンロードできないし、OID でアクセスしてみても値は取り出せなかった。型番が合ってないから仕方がない。とはいえ、項目を探してみるのには使えそうだったので cpu とか processor とか use とかで探してみたけれども、CPU使用率っぽい値がないことが分かっただけだった。
そこで、パケット受信数を監視項目にしてみた。
もしも使っている機器の MIB が見つかったら、これをダウンロードして ~/.mibs にでも入れておけば使えそう。
さいごに
どうにか SNMP で装置を監視する方法が分かった。
SNMP関連のツールのインストールでだいぶ悩んだけど、結局のところ Debian は
- MIB の配布のライセンスを守れないこと
- 簡単に改ざんができてしまうこと
を理由として、downloader を使って本家から MIB をダウンロードする方式を採用したものと思われる。これはこれで1つの解決策であり、ちゃんと新しいものに対応できる。もっと当たり前のように紹介されていてもいいんじゃないかなぁと思ってしまった。
それはさておき…
ようやく大まかに監視ができるようになった。マップを使って一目でネットワーク全体が見られるようにしたり、障害を検知したら通知(?)ができるようになれば安心!もう一息、頑張っていこう。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他