WOL非対応のルーターでWOLを構築する方法

*この記事は韓国語から翻訳したものです。不十分な部分があれば、いつでもフィードバックをいただければありがたいです！ ([オリジナル記事](https://blog.chungjungsoo.dev/tech-posts/setup-wol-with-router/), 同じく私が作成しました。)*


WOLをサポートしていないルーターでWOLを設定する方法を紹介します。

## WOLの定義/原理

WOL とは 「Wake on Lan」 の略です。オフになっているコンピュータに**有線**でパケットを送ってコンピュータを起動することができる技術です。

このパケットはマジックパケットと呼ばれ、オフになっているコンピュータは、WOLオプションがオンになっている場合、マジックパケットが到着するのを待ち、パケットが到着すると起動を開始する原理です。

![magic-packet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/571dfa7d-242a-f027-6bc5-4bad028a9ee7.png)
Img from: http://www.codeproject.com/Articles/11469/Wake-On-LAN-WOL


マジックパケットは図のように、最初の6バイトは `FF:FF:FF:FF:FF:FF` で、残りの90バイトは起動したいコンピュータのLANカードのMacアドレスで構成されます。ポートは7番ポートまたは9番ポートを使用し、プロトコルはUDPを使用します。



## 適用する

何なのか、どのような原理で動作するのかが分かりました。では、早速適用してみよう。

普通は大多数のルーターがWOL機能をサポートするが、サポートしないルーターもある。(代表的にKTのルーター)

1.まず、DHCPアドレスを予約する。

   -> この作業をする理由は、次の段階でポート転送をするのですが、後日、コンピュータのIPアドレスが変更されて動作ができないのを防ぐためです。

![dhcp-reservation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/6d6c7555-ec2c-9528-4f5f-a48d46b0ce1a.png)


   

2.予約したDHCPアドレスにポート転送をします。

   -> ポートは自分のパソコンでテストした時に動作するポートに設定します。(7番または9番)。プロトコルはUDPだけチェックすればいいです。

   実際の接続ポートを違うようにしたい場合は、外部ポートは自分の好きなポート、内部ポートは7または9番に設定します。

![port-forwarding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/9f1b35a4-3088-50a2-3d6d-1bf1da829c8a.png)


   

3.ネットワーク外部IPアドレスを確認した後、「外部IPアドレス：設定したポート」にマジックパケットを送信します。

   -> マジックパケットを送ってくれるCLIパッケージもありますが、ここでは[Wake On Lan](https://play.google.com/store/apps/details?id=co.uk.mrwebb.wakeonlan) というアンドロイドアプリを使う予定です。

   外部のIPアドレスをドメインに接続して使ってもいいです。

![wol-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/0586b9d5-2b0e-a408-4931-61003dfe87c9.png)
   

4.終了！データや他のネットワークに接続した状態でパケットを送ると、正常にコンピュータが起動することを確認することができます。もし、このステップを経たにもかかわらず、動作しない場合は、コンピュータにWOL機能がオンになっていることを確認する必要があります。


## 修正事項

この投稿を作成しながら、何度もテストを行い、問題がないと判断して投稿をしましたが...。

いざ時間が経ってWOLパケットを送ったら、コンピュータの電源が入らない。原因を調べてみると簡単でした。ARP Cacheが期限切れで問題が発生したのです。ARPはIPアドレスをベースにしてMACアドレスに置き換えてくれる。ルーターからコンピュータのIPアドレスにポート転送をしたが、コンピュータは現在オフの状態であり、ARP Cacheが切れた状態では、ルーターからどのデバイスにパケットを送るべきか分からない。パケットの中にはコンピュータのMACアドレスが存在するので、コンピュータがオンになる可能性があるのではないかと考えましたが、UDPパケットでルーターが見る情報にはMACアドレスがないので、ルーターはパケットを私が欲しいところに転送することができません。

そうすると、結局その方法を修正するためにはマジックパケットを**ルータのブロードキャストアドレス**に送ってコンピュータをオンにする必要があります。しかし、ブロードキャストアドレスは外部からアクセスできるのでしょうか？ 不可能です。したがって、内部に別のサーバーを置いて、そのサーバーに接続してパケットを送る必要があります。筆者はGoogleフォトのバックアップサーバーに回しているアンドロイドマシンをサーバーとして使用し、例を提供する予定です。

1. Play Storeではなく、F-DroidからTermuxアプリをインストールします。

   -> ここでPlay Storeでない理由はAndroid 10をサポートするかどうかですが、詳細は[ここ](https://github.com/termux/termux-app#google-play-store-deprecated)を参考してください。

2. Termuxアプリで次のコマンドを実行します。

    ```
   pkg upgrade # パッケージリスト、パッケージアップデート
   pkg install openssh # SSHインストール
   passwd # ログインパスワード設定
   ```

3. ユーザーID確認及びIPアドレス確認

    ```
    whoami # ユーザーID
    ifconfig # IPアドレス
    ```


4. SSH実行

    ```
   sshd
    ```
   
5. WOLパケット送信パッケージのインストール

    ```
   pkg install wol
    ```

6. WOLパケットを送る

    ```
    wol <マックアドレス> # ex) A0:B1:C2:D4:E5:F6
    ```

これで本当に終わりです。ARP Cacheに関係なくうまく動作します。欠点といえば、外部から直接パケットを飛ばすのではなく、このようにサーバーを一つ経由してパケットを送るという欠点があります。

じゃあ、ここで終わり？コンピュータを殺すたびにサーバーに接続した後、wolコマンドを実行するのか？ この後は読者の自由です。サーバーまでたどり着いたので、もっとリモートで簡単に接続できる方法を各自考えて適用してみましょう。 😃