min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash BUFFALOの無線LANルータをリモートからコマンドで再起動する

BUFFALO製の無線LANルータ WXR-1750DHP 買った。1万円超のグレードだけあって、性能よい。

中継器も付けて快適。

と思ったら、たまに親機(WXR--1750DHP)の通信がフン詰まることがある。再起動すれば直るけど、その都度ルータのある場所に行くのは面倒。

ーーー

リモートで親機を再起動できるとよい。できればコマンドで。bashスクリプトにして、「コマンド一発でルータの再起動」できないか試してみる。探すと似たような事してる記事はあった。

Umbrella curlでBBR-4MGを再起動させてみる

ルータ再起動時のパケットをキャプチャしてPOST文を解析してる。解析文を、Linuxからコマンド(curl)でルータに送って再起動しているらしい。

解析例その1

f:id:min117:20161011010329j:plain

解析例その2

f:id:min117:20161011010432j:plain

ーーー

ということで、流れは以下。

Linux(検証環境)にwiresharkをインストールし、キャプチャを開始する。

Linux(検証環境)のChromeから親機ルータにログインし、再起動コマンドを叩く。

ルータ再起動が終わったら、キャプチャを終了し、②のPOST文を解析する。 

LinuxCLIbash)からcurlで③のPOST文をルータに投げて、再起動できるか試す。

ーーー

まずは① から。Linux(検証環境)にwiresharkをインストールし、キャプチャを開始する。

wiresharkのインストールは前記事参照。

min117.hatenablog.com

キャプチャを開始する。CLIでコマンドからやる。LinuxfedoraIPアドレスは192.168.3.11に設定)にログインしたら、まずはネットワークアダプタを ifconfig で調べる。

$ ifconfig 

f:id:min117:20161011003818p:plain

ネットワークアダプタ名は「em1」となっていることが分かった。

これをもとに、パケットキャプチャコマンドtsharkを叩く(wiresharkというコマンドは無い)。

$ sudo tshark -i em1 -w tshark_BUFFALO.pcapng

-i ネットワークアダプタ

-w 保存形式をwiresharkで読める専用形式(pcapng)にして保存する。今回はファイル名を tshark_BUFFALO.pcapng にしてみた。

f:id:min117:20161011004848p:plain

キャプチャ開始。画面左下にはキャプチャされたパケット数(190)が表示されている。

ーーー

次に② Linux(検証環境)のChromeから親機ルータにログインし、再起動コマンドを叩く

ルータ(192.168.3.1)にログイン。

f:id:min117:20161011010455p:plain

管理画面から「詳細設定」を開く。

f:id:min117:20161011010812p:plain

管理メニューからエアステーションを再起動する。

f:id:min117:20161011011108p:plain

ーーー

そして③ ルータ再起動が終わったら、キャプチャを終了し、②のPOST文を解析する。 

ルータ再起動したので、Linuxに戻ってキャプチャを終える。tsharkのコマンドを「Ctrl + c」で終わればいいだけ。キャプチャファイルができているか ls で見てみる。

$ ls -shal | grep tshark_BUFFALO.pcapng

f:id:min117:20161011011456p:plain

できている。これを解析するのは、LinuxからGUIwireshark)でやる。fedoraのメニューからwiresharkを起動。

f:id:min117:20161010220003p:plain

メニュー「Open」から、先程のキャプチャファイルを指定して開く。

f:id:min117:20161011011921p:plain

f:id:min117:20161011012124p:plain

開くと膨大な量が出てくるので、欲しい情報だけにフィルタする。今回はFilter欄に ip.dst==192.168.3.1 && ip.proto==TCP としてみた(ルータ192.168.3.1を宛先にして、かつ、TCPを投げているパケット のみにフィルタする)。

f:id:min117:20161011011850p:plain

画面を新しいほう(下)から順に見ていって、Infoの欄で「POST」を投げているところを探してみたら、それっぽいURIを発見。

URIhttp://192.168.3.1/cgi-bin/cgi?req=fnc&fnc=%24{get_json_param(LANG,1476111126367)}

ーーー

最後に④ LinuxCLIbash)からcurlで③のPOST文をルータに投げて、再起動できるか試す。そのまえに、そもそも上記URIで本当に再起動できるのか試したいので、Macのブラウザに貼って叩いてみる。

f:id:min117:20161011013022p:plain

ダメだった。JSONが返ってきてしまう。

f:id:min117:20161011013103p:plain

パケット解析で違うところを見ているのか?POSTの投げ方が悪いのか?もう少し精査必要。

ーーー

wiresharkのフィルタ条件を見直した。

(変更前)ip.dst==192.168.3.1 && ip.proto==TCP

(変更後)ip.dst==192.168.3.1 && http

これでフィルタしてみると、1つだけ「Line-based」が解析されてるのあり。ルータの再起動(REBOOT)は1回だけだったし、解析文字列中にもREBOOTがあるから、多分これだろう。

f:id:min117:20161011014223p:plain

これをPOSTで投げれば解決!かと思ったら、URI中に sWebSessionnum とか sWebSessionid とかいう文字が…セッション内でなきゃリブートできないのか…これはcurl無理かもしれん。また時間あるときに調べる。