はじめに断っておきます。タイトル詐欺です。

タイトルに書いたことは間違いではありませんが、かなり限定された方法です。
とはいえ、機材を持っていれば最も確実な方法でしょう。

こまけー話は要らねーという方は
実際に私がやった手順(該当行まで飛びます)に進んでください。

というわけで、本題に進みます。

WoLとは

WoL(Walke on LAN)というのは、ネットワーク越しにパソコンの電源を入れる技術ですが、
LAN(Local Area Network)の文字通り、自宅などの建物内からしか使えません。

世の中には、WAN(Wide Area Network)、
つまり、インターネットから自宅のPCの電源を入れたいというニーズがあります。

PCの電源さえ入れば、リモートデスクトップツールで、外出先から自宅のPCを操作できるので便利です。

ですが、WANからWoLを実行するには最大の壁として、
ブロードバンドルーターを超えてWoLの通信をLAN側に送れない問題があります。

それを解決する手法の一つをここでは提案します。

なお、この記事の対象読者は「LANからのWoLは成功するけど、WANからのWoLができない」と悩んでいる方に向けて書いています。
LANからのWoLができてない人はまずはそこをクリアしてから次に進みましょう。
また、WoLで必要な用語は知っている前提で次からは話を進めます。

そもそも、WANからLANへのWoLが難しい理由

そもそも、WANからWoLができない理由は、ルーターがWoLのマジックパケットをLAN側に伝えられないことが原因です。

であれば、ルーターのポートフォワード機能で、WANからの通信をLAN側に透過すれば話はすみそうな物です。

そこで、ポートフォワードで、起動したいPCのIPに対してWANからきたUDPパケットを透過するとどうなるでしょう?

起動したいPCの電源が切れてすぐであれば、再起動は容易です。

しかし、電源が切れてからしばらくしてからだと、ルーターのARPテーブルから当該IPのレコードが消えるため、ルーターはどこにパケットを飛ばせば良いかが判別できなくなってしまいます。

故に、WoLのマジックパケットは、全PC、つまり、ブロードキャストアドレスへの送信が必要なわけです。

一方で、一般的なルーターのポートフォワード機能は、ブロードキャストへのポートフォワードはできません。

これが、ルーターを超えてWoLが難しい理由の一つです。

じゃあ、どうするか?

いくつか方法があります。

WoLの中継器を使う

WANからユニキャストで中継器にマジックパケットを飛ばして、LAN上の中継器からブロードキャストすれば良いです。

実際に市販もされていますが、クソ高いので、マイコンで自作されている方も居ます:
https://qiita.com/oresamaDX/items/f6be576c1e98af6d5020

WebサーバーをLANに立てて、ポートフォワードでWANに公開

これも、ある種王道です。

WebサーバーをLANに立ててポートフォワードでWANに公開。

WebサイトにアクセスしたらCGI等で、LANにマジックパケットを飛ばすわけです。

ただ、ルーターに穴を開けてWebサーバーを公開する以上、Webサーバーのセキュリティーが心配です。

また、そもそも論になりますが、最近流行のIPv4 over IPv6だとポートを開けられない場合があります。ナンテコッタ。

今回の方法(実際に私がやった手順)

今回の方法は、Webサーバーを立てる方法を発展させた方法です。

まず、材料はどこのご家庭にでもある以下の物です。

  • LAN上で、PHPの動くWebサーバー(腕に覚えがあればPHP以外でも良いけど)
  • PlayStation4 (多分 PlayStation 3でもいける。)
  • PlayStation4をリモートプレイできるPS Vitaやスマホなどの機器

どこのご家庭にでもあると書きましたが最初のやつは調達が難しいかもしれません。

しかし、意外と探せばある物で、私の場合は、NASにWebサーバー機能があったので、それを使いました。

そして、

https://ja.coder.work/so/php/628528

こちらのサイトの、PHPを拝借して、

<?php
function wol($broadcast, $mac)
// 先ほどのページのソース
}
// ブロードキャストアドレスと対象PCのMACアドレスでメソッドを呼ぶ
wol('192.168.1.255', 'xx-xx-xx-xx-xx-xx);

というページを設置しました。

ちなみに、ほかのサイトのソースだと割と動きません。

というのも、PHPでブロードキャストアドレスにUDP通信をするためには設定が必要で、他のサイトのコードだと、そのためのコードなどが無いためにPermissionDeniedでエラーとなります。こちらのサイトはちゃんと「socket_set_option」を呼び出していて安心です。

で、あとは、普通ならばポートフォワードで、
このページをWANに公開するところですが、
私の場合一つ問題にぶち当たりました。

そう、先に触れた、セキュリティーの問題です。

私の持っているNASはかなり古く、
Webサーバー機能で利用できるPHPは5.2系だったのです。

PHP5.2といえば、最終的なサポートが2011/01/06に終わっています。

実に10年近く前の製品をWANに公開する勇気は、私にはありませんでした。

そこで登場するのはPlayStationです。
PlayStation3 や 4は、リモートプレイという機能があり、
WAN側から操作できる機能があります。

機能的にはPlayStation3や4が、定期的にSonyのサーバーにアクセスし、
リモートプレイをしようとしている端末があれば、自動的にPlayStationが起動して、
クライアントと繋がるような仕組みで、ルーターに穴を開ける必要がありません。

もうおわかりですね。先ほどのWebページはLANで公開しつつ、
そのページへのアクセスはPlayStationのリモートプレイで行えば良いのです。

これで、安全にWAN側からWoLを行う環境を手に入れることができました。

そのほか

そのほかの方法としては、ローカルにLinuxのサーバーなどを立てて、そこでインターネット上の何かをCronでポーリングして確認し、何かをキーとしてマジックパケットをLANに流せば良いという方法も考えられます。

たとえば、Twitterの特定のアカウントをCronで確認し「光よよみがえれ!」とつぶやかれたらマジックパケットを流すとか。

ほかにも、Atermなどのルーターですと、WoL機能がある機種がありますね。
ただこの場合、v6プラスなどのIPv4 Over IPv6のサービスでは使えない問題があります。
そこで、ルーターはルーターとして設置して、別途、AtermなどのWoLのマジックパケットをしゃべる機能を持ったルーターを、
あえて、ブリッジとして使い、そのAtermのWoL機能をポートフォワードで公開する力業をされている方も居ます:
https://ameblo.jp/yasu-edoi/entry-12374616910.html

要は、押してだめなら引いてみようの精神があれば、何かしら対応策があるわけです。