まえがき
私の家🏠では昔からYAMAHA RTX810というVPNルーターを使っています。
RTX810はもう10年近く前の製品で、現在は生産完了し、後継のRTX830というルーターが販売中です。
なぜ自宅でこんな高価💸な(4万円くらいする)ルーターを使っているかって❓ いろいろ実験したり遊びたいからです笑😎
以前から特に意味はないもののZabbixでトラフィック量を監視していたのですが、 Pythonから状態を取得できたらいろいろ使えそうかなと思い、余っていたRaspberry Piで試しにやってみることにしました。 PySNMPというライブラリを使うと、簡単にSNMPで情報が取れそうです。
他の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ファイルは公式からダウンロードできます👉
個別にもダウンロードできますが、私は全部入りの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
これで好きな情報が取れますね🥰