BUFFALO製の無線LANルータ WXR-1750DHP 買った。1万円超のグレードだけあって、性能よい。
中継器も付けて快適。
と思ったら、たまに親機(WXR--1750DHP)の通信がフン詰まることがある。再起動すれば直るけど、その都度ルータのある場所に行くのは面倒。
リモートで親機を再起動できるとよい。できればコマンドで。bashスクリプトにして、「コマンド一発でルータの再起動」できないか試してみる。探すと似たような事してる記事はあった。
Umbrella curlでBBR-4MGを再起動させてみる
ルータ再起動時のパケットをキャプチャしてPOST文を解析してる。解析文を、Linuxからコマンド(curl)でルータに送って再起動しているらしい。
解析例その1
解析例その2
ということで、流れは以下。
① Linux(検証環境)にwiresharkをインストールし、キャプチャを開始する。
② Linux(検証環境)のChromeから親機ルータにログインし、再起動コマンドを叩く。
③ ルータ再起動が終わったら、キャプチャを終了し、②のPOST文を解析する。
④ LinuxのCLI(bash)からcurlで③のPOST文をルータに投げて、再起動できるか試す。
ーーー
まずは① から。Linux(検証環境)にwiresharkをインストールし、キャプチャを開始する。
wiresharkのインストールは前記事参照。
キャプチャを開始する。CLIでコマンドからやる。Linux(fedora、IPアドレスは192.168.3.11に設定)にログインしたら、まずはネットワークアダプタを ifconfig で調べる。
$ ifconfig
ネットワークアダプタ名は「em1」となっていることが分かった。
これをもとに、パケットキャプチャコマンドtsharkを叩く(wiresharkというコマンドは無い)。
$ sudo tshark -i em1 -w tshark_BUFFALO.pcapng
-i ネットワークアダプタ名
-w 保存形式をwiresharkで読める専用形式(pcapng)にして保存する。今回はファイル名を tshark_BUFFALO.pcapng にしてみた。
キャプチャ開始。画面左下にはキャプチャされたパケット数(190)が表示されている。
ーーー
次に② Linux(検証環境)のChromeから親機ルータにログインし、再起動コマンドを叩く。
ルータ(192.168.3.1)にログイン。
管理画面から「詳細設定」を開く。
管理メニューからエアステーションを再起動する。
ーーー
そして③ ルータ再起動が終わったら、キャプチャを終了し、②のPOST文を解析する。
ルータ再起動したので、Linuxに戻ってキャプチャを終える。tsharkのコマンドを「Ctrl + c」で終わればいいだけ。キャプチャファイルができているか ls で見てみる。
$ ls -shal | grep tshark_BUFFALO.pcapng
できている。これを解析するのは、LinuxからGUI(wireshark)でやる。fedoraのメニューからwiresharkを起動。
メニュー「Open」から、先程のキャプチャファイルを指定して開く。
開くと膨大な量が出てくるので、欲しい情報だけにフィルタする。今回はFilter欄に ip.dst==192.168.3.1 && ip.proto==TCP としてみた(ルータ192.168.3.1を宛先にして、かつ、TCPを投げているパケット のみにフィルタする)。
画面を新しいほう(下)から順に見ていって、Infoの欄で「POST」を投げているところを探してみたら、それっぽいURIを発見。
URI:http://192.168.3.1/cgi-bin/cgi?req=fnc&fnc=%24{get_json_param(LANG,1476111126367)}
ーーー
最後に④ LinuxのCLI(bash)からcurlで③のPOST文をルータに投げて、再起動できるか試す。そのまえに、そもそも上記URIで本当に再起動できるのか試したいので、Macのブラウザに貼って叩いてみる。
ダメだった。JSONが返ってきてしまう。
パケット解析で違うところを見ているのか?POSTの投げ方が悪いのか?もう少し精査必要。
ーーー
wiresharkのフィルタ条件を見直した。
(変更前)ip.dst==192.168.3.1 && ip.proto==TCP
(変更後)ip.dst==192.168.3.1 && http
これでフィルタしてみると、1つだけ「Line-based」が解析されてるのあり。ルータの再起動(REBOOT)は1回だけだったし、解析文字列中にもREBOOTがあるから、多分これだろう。
これをPOSTで投げれば解決!かと思ったら、URI中に sWebSessionnum とか sWebSessionid とかいう文字が…セッション内でなきゃリブートできないのか…これはcurl無理かもしれん。また時間あるときに調べる。