ラズパイでWindows機をWake On Lanして外出先からVPNリモートデスクトップ接続

## 概要
VPNを開通してスタバから自宅のメインマシンにリモートデスクトップしたいな～と思い、環境構築を行ったので備忘録です。

![ポンチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/022f6c6f-7835-2c63-7415-a8695f8809c7.jpeg)

ホスト側のWindows機をスリープさせておきたいので、マジックパケット送信用にDBとラズパイを経由させています。
私の家のルータではポートマッピングとマジックパケット送信ができなかったので、ルータさえ対応していればホストとクライアントのみで簡素な構成にできそうですね。

## VPN設定
無料のVPNは色々選択肢があるかと思いますが、ググった感じで良さそうだったので今回は[ZeroTier](https://www.zerotier.com/)を使用しました。何でもいいと思います。

1.サインインしてネットワーク作成
2.クライアントとホストにZeroTierをインストール
3.各端末のタスクトレイからJoin New NetworkしてネットワークIDを入力
4.管理コンソールから端末認証

上記の流れで簡単にVPN環境が作成できました。

## Windows10Homeでリモートデスクトップ
標準では使えないみたいなので、[RDP Wrapper Library](https://github.com/stascorp/rdpwrap)を使わせて頂きます。
こちらの記事が詳しいです。

https://qiita.com/aoi70/items/47e521c6a310e3959b35

Splashtop PersonalでもVPN環境下なら同一ネットワークと認識して動くと聞いたのですが、当方試した限りでは上手くいかず。ポート解放も不安定そうな感じだったのでやめました。

## Wake On LANの設定
ホスト側Windows機のBIOSとデバイスマネージャーの設定が必要です。BIOSはメーカーや機種によって内容が違うので公式HP等で調べます。
デバイスマネージャーの設定はネットワークアダプターの詳細設定からWOL関係のものを探して設定していきます。

![image0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/bf782862-cba5-9b37-6079-9820036396cf.png)

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/b722cc96-c489-fb5b-2738-15376bfa6d2b.png">

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/f17d9f38-5aaf-0f8b-b977-f6cdf198283c.png">

ルータの設定についても、メーカー/機種によって違うので公式HPを読みましょう。

## ラズパイの設定

Raspberry Pi Zero WHが余っていたので常時起動用に使用します。通常のラズパイでもいいのですが、今回の用途ではシングルスレッドで電力消費の少ないZero Wシリーズがよさそうです。ちなみにWはWi-FiのWですね。Hは変態のHです。
Raspberry Pi Imagerを使用してOSを書き込みます。デスクトップは不要なので軽量なRaspberry Pi OS Lite(32-bit)を書き込んでいきます。OS書き込み時にWi-FiとSSHの設定ができるようです。以前はできなかったような気がします。
SSH接続ができず、色々こねくり回したのでRaspberry Pi Imagerで一発OKなのかは真偽不明です。単純にシングルスレッドで起動が遅かっただけかもしれません。

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/ba4f5985-2153-16d6-e779-7fc89697b4ec.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610063/19717286-4603-1453-654c-395209884d5d.png">

Gitとpipが入っていなかったのでインストールします。

```:bash
sudo apt update
sudo apt install git
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
```

## MongoDB
DBは無料の[MongoDB Atlas](https://www.mongodb.com/products/platform/cloud)のアカウントがあるので、そちらを使用します。何でもいいと思います。
MongoDBはクラスターだけ立ち上げたら、DBやコレクションを定義しなくてもリクエストを飛ばしたらDBから勝手に作ってくれるみたいです。~~勝手に作らないでほしい。~~

1.サインインしてプロジェクトを作成
2.プロジェクトにクラスターを作成

上記でOKです。クラスター作成時のユーザー名+パスワードを使うので必ずメモしておきます。

## 作ったプログラム

https://github.com/minato8080/mp-send-service

### ラズパイ側
クローンして、`pip install .`でライブラリを入れて下さい。
それからフォルダ直下に.envファイルを作成します。

```:.env
MONGO_URI=mongodb+srv://<username>:<password>@<collection>.tjzrd.mongodb.net
DB_NAME=<dbname>
COLLECTION_NAME=wol_info
TARGET_MACHINE=hogehoge
TARGET_MAC_ADDRESS= 00:11:22:33:44:55
INTERVAL_SECONDS=10
UPDATED_BY=hugahuga
LOG_PATH=wol.log
```
crontabで起動時に自動実行するよう設定します。
```:bash
crontab -e
```
以下一行追加すればOKです。sleepはおまじないです。
```
@reboot sleep 60 && /usr/bin/python3 /home/pi/mp-send-service/main.py
```

### クライアント側Windows機
クローンして、フォルダ直下に.envファイルを作成します。
[mongosh](https://www.mongodb.com/ja-jp/docs/mongodb-shell/)をインストールしてパスを通します。

### 使い方
1.各Windows機でZeroTierを起動しJoin状態にしておきます。
2.ラズパイは電源に繋いでおきます。
3.スタバに行ってコーヒーを飲みます。
4.update_wol_info.batを叩いてWake On LAN用のフラグをONにします。
5.リモートデスクトップでホスト側に接続します。

## まとめ
ルータ買い替えた方がよさそう。