LTE/3Gルータを自動的に再起動させる(その1)

とうとうオリンピックも終わりましたね。周りの影響でフィギュアスケートに少し詳しくなったmi2yo4です。
さて、今日はこのネタで行ってみようかと思います!

LTE/3G対応ルータを自動的に再起動させたい!

対象ルータ:IO-DATA製DCR-G54/Uをリモートから自動的に再起動させます。

これまたニッチな話で、ネット上にもそれほど情報がないので重要性があまり無いように思えますが、結構使えるテクニックなのでは?と書いている本人は思っています^^

ではまず、背景から説明してみますね。なんでまた、ルータを自動的に再起動させたいのでしょうか?

格安SIMで運用している際の注意すること

現在、DCR-G54/UにUSB製のLTE/3Gモデムを取り付け、格安SIMをとりつけて運用しています。
これですと、ハウス内の温度や湿度、二酸化炭素濃度などのセンサーから集めてきた計測値を

月額1000円を下回る通信費

でインターネット上のクラウドサーバに送信することが出来ます。
例えば、netatmo。これは無線LANでルータにつながるのですが、ルータを設定さえすればハウス内に設置したnetatmoの計測値が
ネット上からでも見ることが出来るようになるんですね!

ただ、無線通信が絡んでいますのでやはり信頼性に欠ける所があります。
特に今回の場合ですと、ルータ~各センサのハウス内ネットワークは通じていそう、でもインターネット上に計測値が送信されてこない、という現象がたまたま発生しました。
もちろん、設置した当初は問題なく動作しています。でも時間が経つと通信が途絶えてしまうんですね。頻繁に起こるわけでは無いので、対策を行うことが難しくなりますね。

調べてみると、どうやらLTE回線は繋がっているのですが、プロバイダが指定したDHCPアドレスのリース時間を超えてしまった際に、DHCPアドレスの最割り付けが行われておらず、インターネット側のIPアドレスが消失しているのが原因では?という所まで判りました。
これを解決するには色々な方法があるのですが、一番てっとり早い解決方法は、と言うと冒頭で述べた「ルータを自動的に再起動」なわけです。

これで本題のやりたい事と結びついてきました。前提を説明すると長いですね~。

ルータの再起動方法

まずはルータの再起動方法について調べてみました。
最近のルータであれば内部でWebサーバが立ち上がっており、その中から「ルータ再起動」というメニューがあります。このDCR-G54/Uも同様にルータ内蔵のWebサーバ経由でルータ本体の再起動が可能なようです。

restart

上記の再起動ボタンをプログラムからクリックするようにすれば今回のミッションはクリアです。
早速やってみましょう!

curlでルータに送信するPOSTデータを作っちゃえ

現場に展開するフィールドコンピュータはWindowsなどでは動作していないし、ましてやモニタ画面も付いていません。なので、Webブラウザを操作して再起動ボタンを押す、という手法は使えません。

弊社社長(zako58)曰く、
「curlで作ればいいんじゃ?」

とのことでしたので、その言葉を信じてcurlコマンドでルータ再起動が可能か調査してみました。
その結果、以下の様にスクリプトを記述すれば行けそうです。

curl -d '何らかのPOSTデータ' 'http://192.168.0.1/tlreset.htm'

後は「何らかのPOSTデータ」の部分を埋めれば完成です。
tlreset.htmを解析する限り、何らかのPOSTデータは「&functionIndex=1&reset_flag=1」が含まれていると思うのですが、そのままだと何かが足りないのか、ルータは再起動する気配がありません。

source

上記はルータ再起動用のWebページのソース一部です。こうなったら内部まで解析してみます。

…しかし、inputタグもjavascriptでラップされており、簡単には解析できそうもないです。
どうやらこのままでは上手く行きませんね…困りました。

Wiresharkでパケット通信をキャプチャ

という事で基本(?)に立ち返り、パケット通信解析を行いました。
Webブラウザ上で再起動ボタンを押す→ルータが受信して再起動するという間にネットワークを流れているデータをキャプチャしてみればどのようなデータがあるのか一目瞭然です。
図にするとこんな感じですかね。

howtousewireshark

PCにUSB無線LAN子機を接続しましてルータと接続します。
おもむろにWiresharkを起動後、メニューの[Capture]→[Interfaces]を選択します。

capture_interface

無線LANを選択してStartボタンをクリックしたらキャプチャ開始です。ここでWebブラウザ上からルータの再起動ボタンをクリックします。
ワーニング等のウィンドウを一通りやり過ごしたら、キャプチャを終了します。[Capture]→[Stop]を選択します。

これで、再起動ボタンを押した際にどのようなデータがPOSTされているのかが記録されました。

Wiresharkでパケット通信を解析

採取したパケットがどのようなデータになっているでしょうか?
それを知るには[Follow TCP Stream]というメニューを選択すれば判ります。解析したいパケットで右クリックして選択するか、メニューのAnalyzeからも選択可能です。

selectfollowtcpstream

followtcpstream

これでPOSTデータの中身は「page=tlreset&reset_flag=1&functionIndex=1」であることが判りました。

と、ここまでで結構なボリュームになってしまったので、続きはその2で書いてみたいと思います。
ではまた!

今回参照してみた所

基本的なアイデアはここと一緒だと思います。(実現手段は違いますが)
Baffaloルータの自動再起動スクリプト

curlコマンドについてはここを中心に学んでみました。他にもいい情報源があると思います。
cURL – Manual (日本語訳)

今回、これが無ければもっと時間がかかっていたでしょう。ネットワーク上のパケット信号を見るのであれば必ず使い方を覚えておいて損は無いツールです。
Wireshark

WiresharkでPOSTデータをどう見るの?って所は以下を参考にしました。
Sniff http post data with wireshark