日々のコンピュータ情報の集積と整理

Dr.ウーパのコンピュータ備忘録

2014年4月9日水曜日

プライベートIPのネットワーク内にある遠隔地のパソコンをWake On Lanで起動する方法 - LinkStationを使用したトリッキーな方法

使っていない時もパソコンを付けておくのは電力を消費してコストがかかります。

そのため、遠隔地にあるパソコンを必要なときにだけWake On Lanで休止状態やスリープ状態から復帰させて使用したいという要望を持っている人もいると思います。

ただし、その遠隔地のパソコンがインターネットにプロバイダから割り当てられたプライベートIPのルータを経由して接続されているケースでは、それを実現するのはなかなか難しいです。


そこで今回は、遠隔地のパソコンが接続されているネットワーク内に、LinkStationが常時起動されているケースで、遠隔地のパソコンをWake On Lanで起動する方法を考えました。


操作側(地点A)とWake On Lanで操作される側(地点B)のネットワーク構成
パソコン A はプライベートIPのルータを介してインターネットに接続されている
パソコン B と LinkStation はプライベートIPのルータを介してインターネットに接続されている


今回考えた実現方法は以下のとおりです。

実現方法概要:

LinkStationでWebサーバを動かし、buffaloのWebアクセスでインターネット越しでファイル名を変更できる箇所のファイル名を監視し、ファイル名がWake On Lanの条件を満たしていたら、マジックパケットを送出してパソコンを起動します。

実現方法概要
パソコン A から LinkStation の ファイル の名前を Web アクセスで 変更する 
LinkStation の Webサーバ はファイル 名を常に監視しており、ファイル名が Wake On Lan を実行する条件の名前に変わっていたらパソコン B に対して Wake On Lan 実施

その後、たとえば Google Chrome のリモートデスクトップでパソコン A から パソコン B を遠隔操作できる


buffaloのWebアクセスは、インターネットにプライベートIPで接続されているルータに接続されたLinkStationでも、buffaloのサーバが間を取り持つことで、そのLinkStation内のファイルへインターネット越しでアクセスできる機能です。(*1)(*2)

*1
外からアクセスできるWebアクセス機能って、何? | BUFFALO バッファロー
http://buffalo.jp/products/catalog/storage/nas/web-access.html

*2
設定の手順例 Webアクセス機能を使う
http://buffalo.jp/download/manual/html/lshgl/k_webaccess.html


このように、外部から直接 Web サーバにアクセスできるようにするのではなく、外部からの操作をファイルアクセスに限定したのは、Web サーバを外部に公開することのセキュリティ上のリスクを避けたかったからです。


実装詳細:

LinkStation の構成

LS-VL121 (リンクステーショントップ)
・web (Webサーバー公開ディレクトリ)
・・cgi-bin
・・・wakeonlanwatcher.cgi - Wake On Lan を実施するかどうかを監視する Perl スクリプト
・・・wakeonlan.pl - Wake On Lan を実行する Perl スクリプト
・・htdocs
・・log
・・data
・webdata (Webアクセスでアクセスできるようにするフォルダ)
・・wakeonlanwatcher
・・・watchflag - Wake On Lan の監視を続けるかどうかのフラグ
・・・wakeonlanflag - Wake On Lan を実施するかどうかのフラグ

その他 Web サーバの設定は前回までの記事を参考にしてください。

セキュリティのための留意事項:

web フォルダ
  • Webサーバー公開ディレクトリはアクセス認証を設定し、限られたユーザしか書き込みできないようにする。Webアクセスでアクセスできるようにしない。

webdata フォルダ
  • Webアクセスではアクセス認証を設定し、限られたユーザしか書き込みできないようにする。

用いた Perl スクリプト

wakeonlanwatcher.cgi

#!/usr/bin/perl

require 'wakeonlan.pl';

main();

sub main {

 printDebug("Content-Type: text/html; charset=Shift_JIS\n\n");
 printDebug("<html>");
 printDebug("<head><title>wakeonlanwatcher Console</title></head>");
 printDebug("<body>");
 printDebug("<pre>");

 writeLog("wakeonlanwatcher start");

 for ( ;; ) {

  # 監視を続けるかどうか判定
  $watchFlag = getWatchFlag();
  if ($watchFlag ne "ON") {
   writeLog("watchFlag=" . $watchFlag);
   last;
  }

  # wake on lan を実行するかどうか判定
  $wakeOnLanFlag = getWakeOnLanFlag();
  if ($wakeOnLanFlag eq "ON") {
   writeLog("wakeOnLanFlag=" . $wakeOnLanFlag);

   # wake on lan 実施
   writeLog(wakeonlan());
  }

  # 1 分毎
  sleep(60);
 }

 writeLog("wakeonlanwatcher end");

 printDebug("</pre>");
 printDebug("</body>");
 printDebug("</html>");
}

# デバッグ用プリント関数
# Release 時は print をコメント化
sub printDebug {
 # print $_[0];
}

# wake on lanフラグ取得
sub getWakeOnLanFlag {

 # ファイルがあれば、フラグがONと判断する
 if ( -f "../../webdata/wakeonlanwatcher/wakeonlanflag") {
  return "ON";
 }
 
 return "OFF";
}

# 監視フラグ取得
sub getWatchFlag {

 # ファイルがあれば、フラグがONと判断する
 if ( -f "../../webdata/wakeonlanwatcher/watchflag") {
  return "ON";
 }
 
 return "OFF";
}

# ログの書き出し
# 引数:書き込むテキスト
sub writeLog {

 $text = getDateTimeText() . "," . $_[0] . "\n";
 printDebug($text);

 open(FH,">> ../../webdata/wakeonlanwatcher/wakeonlanwatcher.log");
 
 print FH $text;
 close(FH);
}

# 現在日時を取得
sub getDateTimeText {
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
 $year += 1900;
 $mon += 1;
 return "$year/$mon/$mday $hour:$min:$sec";
}


wakeonlan.pl

#!/usr/bin/perl 

sub wakeonlan {
 # ここに wake on lan のマジックパケットを送出する処理を記述
 # 処理結果を文字列として呼び出し元に返す
 # 実際の Perl スクリプトはこのブログ上では省略していますので、
 # 下に記載した参考にさせていただいた Web ページをご覧ください
}

1;


Perl スクリプトの説明

wakeonlanwatcher.cgi

ブラウザで「http://ls-vl121:81/cgi-bin/wakeonlanwatcher.cgi」にアクセスすることで監視処理を開始します。

二重起動防止処理は入れていないので、何度もそのページにアクセスすると、その分だけ監視処理が何重にも走ることになるので、一回だけアクセスするようにします。


詳しい処理内容は省略しますが、重要な箇所は

 LS-VL121/webdata/wakeonlanwatcher/wakeonlanflag

というファイルが存在した場合、wakeonlan.pl に記載された wakeonlan 関数を呼び出して、目的のパソコンを Wake On Lan にて起動させています。 従って、Wake On Lanで起動させたくない場合には wakeonlanflag-OFF といったファイル名に上記のファイルの名前を変更しておきます。

wakeonlan.pl

Wake On Lanを利用して起動したいパソコンにマジックパケットを送出する関数 wakeonlan を定義しています。

以下のページに書かれている Wake On Lan の Perl スクリプトを参考にさせていただき、wakeonlan 関数として呼び出せるようにしました。

Wake Up On LAN from perl
http://apis.jpn.ph/fswiki/wiki.cgi?page=Source%2FPerl%2FWakeUp 


結果

buffaloのWebアクセスにて Wake On Lanを実施するかどうかの実施フラグである「wakeonlanflag-OFF」をWake On Lanを実施するための「wakeonlanflag」に名前を変更する。
buffalo の WebアクセスにてWake On Lanを実施するかどうかの実施フラグのファイル名を「wakeonlanflag-OFF」から「wakeonlanflag」へ変更し、Wake On Lanを実施させる



Google Chrome のリモートデスクトップにて、Wake On Lan で起動させた遠隔地のパソコンに接続すると、休止状態から復帰しており見事接続に成功!
Google Chrome のリモートデスクトップにて休止から復帰した遠隔地のパソコンに接続


この実現方法により、遠隔地から目的のパソコンを Wake On Lanによって起動させられることを確認しました。

ただし、この方法はかなりトリッキーなものです。
通常、Perl スクリプト内で処理をループさせて、処理の終了指示があるまで処理を続行するようなCGIは作成しません。(レンタルサーバなどでは、そういった記述のCGIは禁止されていることも多いです。)
今回は、自前で保持している LinkStation の Webサーバだったので、こういうトリッキーな方法を利用しました。

参考にするかどうかは各自の自己判断で参考にしてください。


まとめ

  • LinkStationを使用したトリッキーな方法で、プライベートIPのネットワーク内にある遠隔地のパソコンをWake On Lanで起動することに成功した。 
  • ただし、このようなトリッキーな方法を使うことには相応の注意が必要。


※本内容はネットワークの知識がある人向けに記載しています。
※ネットワークの構成によっては、セキュリティの脅威を発生させる可能性があるため、本内容を参考にする上では、セキュリティに十分配慮してください。
※CGIは構成によって重大なセキュリティ上の脅威を発生させます。十分な知識を持ったうえで、CGIを作成・設置してください。


※LinkStation には、Webサーバ機能を持つシリーズと持たないシリーズがあります。Webサーバ機能を利用したい場合には、購入するシリーズがWebサーバ機能をサポートしているかどうか事前にご確認ください。








関連記事

関連記事を読み込み中...

同じラベルの記事を読み込み中...