みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

YAMAHA RTX810の状態をPython+SNMPで取得する

まえがき

私の家🏠では昔からYAMAHA RTX810というVPNルーターを使っています。

network.yamaha.com

RTX810はもう10年近く前の製品で、現在は生産完了し、後継のRTX830というルーターが販売中です。

なぜ自宅でこんな高価💸な(4万円くらいする)ルーターを使っているかって❓ いろいろ実験したり遊びたいからです笑😎

以前から特に意味はないもののZabbixでトラフィック量を監視していたのですが、 Pythonから状態を取得できたらいろいろ使えそうかなと思い、余っていたRaspberry Piで試しにやってみることにしました。 PySNMPというライブラリを使うと、簡単にSNMPで情報が取れそうです。

snmplabs.com

他のYAMAHAルーターも同様の機能があるので、同じように使えるはずです。

Simple Network Management Protocol (SNMP)とは?

サーバーやルーターなどネットワーク機器の状態を取得、設定するためのプロトコルです。 MIBというデータ構造が定義されており、CPU使用率やトラフィック量などを機器によらず統一的な方法で取得できます。 MIBはフォルダのようにツリー構造になっており、各情報にはOIDという数字のIDがついています。

YAMAHA RTX810の設定

RTX810のsnmp機能を有効にして、Raspberry Piからアクセスできるようにします。

> snmp host 192.168.0.101 public   # SNMPでの情報取得を許可するアドレスを指定

snmpwalkのインストール

まずはどんな情報が取れるのか、MIBツリーの情報を一括して取得できるsnmpwalkというコマンドがあるのでインストールして実行してみましょう。snmpパッケージの中に含まれています。また、snmp-mibs-downloadパッケージをインストールすると、SNMPの数字の羅列のOIDを見やすいテキストに変換してくれます1

$ sudo apt-get install snmp snmp-mibs-downloader
$ sudo download-mibs

私が試したところ、snmp-mibs-downloaderをインストールすると自動でdownload-mibsも実行されました。その場合は2行目は必要ありません(わからなければ実行しても問題ありません)。

ダウンロードしたMIB情報を有効にします。/etc/snmp/snmp.confを次のように編集します。

- mibs :
+ mibs +ALL

先ほどのsnmp-mibs-downloaderでは一般的なMIB情報しかインストールされません。YAMAHA独自のMIBもたくさんあるので、これもインストールしましょう。YAMAHA RTXシリーズのMIBファイルは公式からダウンロードできます👉

www.rtpro.yamaha.co.jp

個別にもダウンロードできますが、私は全部入りのyamaha-private-mib.tar.gzをダウンロードしました。 展開したファイルを/usr/share/snmp/mibsにコピーします。

$ mkdir yamaha; cd yamaha
$ wget http://www.rtpro.yamaha.co.jp/RT/docs/mib/yamaha-private-mib.tar.gz
$ tar xvf yamaha-private-mib.tar.gz    # 今いるフォルダに展開される
$ sudo cp yamaha-*.mib.txt /usr/share/snmp/mibs

これで準備ができました。次のようにして、実際にRTX810からMIBを取ってみましょう。

$ snmpwalk -v1 -c public 192.168.0.1 .
SNMPv2-MIB::sysDescr.0 = STRING: RTX810 Rev.11.01.33 (Fri Apr 20 08:44:58 2018)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.1182.1.41
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (298361505) 34 days, 12:46:55.05
(略)
YAMAHA-SMI::yamahaRT.6.46.0 = Hex-STRING: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
YAMAHA-SMI::yamahaRT.6.47.0 = STRING: "NULL"
End of MIB

ものすごい量の情報が出力されましたね😳私の場合は3872行もありました。

パケット数などの統計情報から、コンフィグの中身まで様々な情報が取得できています。 さて、これをPythonで取ってみましょう。

PySNMPのインストール

venv環境を作ってPySNMPをインストールします。 まずはvenv環境を用意します。

$ sudo apt install python3-venv
$ mkdir ~/snmp-test
$ cd ~/snmp-test
$ python3 -m venv venv

PySNMPはpipで簡単にインストールできます。

$ ./venv/bin/pip install pysnmp

SNMP通信のテスト

PySNMP公式のクイックスタートスクリプトをほぼそのまま使います。

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('public', mpModel=0),
           UdpTransportTarget(('192.168.0.1', 161)),    # ここをYAMAHA RTX810のアドレスに変更
           ContextData(),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))   # ここで取得するMIBを指定
)

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

これを''snmp-test.py''という名前で保存し、実行します。

./venv/bin/python snmp-test.py
SNMPv2-MIB::sysDescr.0 = RTX810 Rev.11.01.33 (Fri Apr 20 08:44:58 2018)

このように、RTX810の情報が取れました!ファームウェアバージョンが取得できたようですね。

YAMAHA RTXシリーズ独自情報を取得する

先ほどはSNMPv2-MIB::sysDescrという一般的なMIBを取得したのですが、YAMAHA RTX独自MIBも取得したいですよね。しかし、PySNMPは独自MIBを知りません😫

snmpwalkとは別に、PySNMPにも独自MIBをインストールする必要があります。 実は、先ほどpipでPySNMPをインストールした時に、mibdump.pyというツールも一緒にインストールされています。

$ ./venv/bin/mibdump.py ~/yamaha/yamaha-*.mib.txt

これで、PySNMP用にデータを変換しつつ、~/.pysnmp/mibs/にインストールしてくれます。 これで、PySNMPから独自MIBにアクセスできるようになりました2

先ほどsnmpwalkで取得した大量のデータの中から、自分が欲しいデータを指定してみましょう。 例えば、あるインターフェースの受信パケット数を取得するようにしてみます。 先ほどのsnmp-test.pyを少し変更しましょう。

-    ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
+    ObjectType(ObjectIdentity("YAMAHA-RT-INTERFACES", "yrIfPpInOctets", 23))

実行してみます。

$ ./venv/bin/python snmp-test.py
YAMAHA-RT-INTERFACES::yrIfPpInOctets.23 = 2835996198

これで好きな情報が取れますね🥰


  1. ライセンスの関係でRaspbianパッケージにはMIBファイルは含まれておらず、ダウンローダーのみパッケージ化されています。ダウンローダーを使って、簡単に自分でインストールできるようになっています。

  2. これをインストールしなくても、数字の羅列のOIDを直接指定すればアクセスできます。