GCPとMyDNSを使って，ドメインを取得する（NAT超えWake on LAN[1]）

# はじめに
長年の夢だったマンションのNATを超えたWake on LAN（正しい言い回しなのか？）が遂に実現できました．
かなり長いので分けて書きます．備忘録的に書きますが，どれかが役に立てれば幸いです．
今回は，「GCPとMyDNSを使って，ドメインを取得する」について書きます．

![ezgif-6-a3bc222e322b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/d3d36bff-e735-470e-c122-1a129c06022f.gif)


- [1][GCPとMyDNSを使って，ドメインを取得する](https://qiita.com/jjjkkkjjj/items/d0370573fcb04deeb91f)
- [2][GCPにSoftether Serverを立てる（iPhone／ラズパイから接続）](https://qiita.com/jjjkkkjjj/items/824998a6106eff941347)
- [3][GCP上のApacheからローカルのラズパイApacheにリバースプロキシする](https://qiita.com/jjjkkkjjj/items/b8363536c488cf51d577)
- [4][ラズパイをルーター化する](https://qiita.com/jjjkkkjjj/items/6f416f27eabbaf04979e)
- [5][Wake on LAN用のPythonスクリプトを作成する．](https://qiita.com/jjjkkkjjj/items/afa4fe637e2c6dae3ecf)


# 目的
目的は単純でこんな感じで外からWake on LAN（WOL）で自宅のデスクトップPCを起動させたいだけです．

![object.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/e45665eb-2fa6-7bb9-b29e-8d5f9f7eface.png)


# 問題点
- ポート解放ができない
まず，マンションのセキュリティからかポート解放ができません．恐らく，図のようにルーターがマンション内にあり，管理人でないかぎりポート開放の設定はできないようになっているのでしょう．

- 自前のルーターがブロードキャスト対応していない
マンションのLANケーブルの差込口は1つのため，元々から持っていたルーターをアクセスポイントモードで使用していました．しかし，そのルーターがブロードキャスト対応していませんでした．Magic Packetを送るときは，ルーターからブロードキャスト宛てに送らないとデスクトップには届かないらしいです．


# 解決策
と，上記の問題点に直面したのですが，幸いにも手元にラズパイを持っていたので，これを使って以下のように接続すると解決できました．

- ネットワークの完成イメージ図
![network_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5834caa5-20e1-6878-79a1-01469d50525e.png)

つまり，

- Magic Packetをブロードキャスト宛てに送るために，ラズパイをルーターにする
- ラズパイからPythonでMagic Packetを送る
- 外にいるスマホからアクセスできるようにクラウドサービスのGoogle cloud platform(GCP)を使う
- GCPからラズパイにリダイレクトできるようにGCPとラズパイをVPN接続する
- 使いやすさのためにLINEからGCPにアクセスする

# 主に使ったもの
- サービス
    - Google Cloud Platform
    - Softether
    - MyDNS
    - mod_wsgi
    - apache
    - LINE bot
- もの
    - ラズパイ 

# GCPとMyDNSを使って，ドメインを取得する

備忘録的に順を追って書いていきます．上記を達成するために，まずは「GCPとMyDNSを使って，ドメインを取得」します．

## GCP

### VMインスタンスの作成
まずはGCPを利用し，サーバーを構築します．[公式サイト](https://cloud.google.com/)から[これから始めるGCP（GCE）　安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)を参考に作成します．

まずプロジェクトを作成します．

![gcp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/e91ffe86-ec84-cf94-7d65-10d8f08f55c5.png)

Organizationはなしにしました．

<img width="554" alt="gcp2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/78d9bced-6f56-5e1d-503f-abfeb3b2d1d9.png">

プロジェクトを作成したら，VMインスタンスを作成します．

<img width="574" alt="gcp3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/d0d42c91-8693-5751-eed8-1dbf0feb4964.png">

先ほど作成したらプロジェクトを選択します．

![gcp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/70b64402-2d49-076f-eb89-b04d782dab74.png)
<img width="421" alt="gcp5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/fe07bb46-7a14-d9d5-5ea9-4739cf6384d3.png">

無料なのは，Regionはアメリカ，マシンタイプはしょぼいやつにします．（無料枠）
図中であとでと書いているところはファイアウォールの設定です．あとで設定できるのでそのままでいいと思います．

<img width="895" alt="gcp7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/81de4ec3-2a81-0a67-36d2-4f6593c31811.png">

Boot Diskは慣れているUbuntuを選びました．容量は30GBまで無料なので，デフォルト値の10GBから変更しておきます．

<img width="505" alt="gcp6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/378fc4ac-ec41-ef40-2064-dc51f1c5967b.png">

**※重要** IPフォワーディングを有効にします．これは後から変更できません！

<img width="496" alt="gcp8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/396fbef4-1190-177b-bbee-c0d07dc7213a.png">
<img width="520" alt="gcp9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/f83889ca-b97b-f9ca-9a56-abcdd4bf0cca.png">

あとは「作成」を押して，VMインスタンスの作成は完了です．


### GCloudのインストール
SSHで作成したVMインスタンスに接続できるようにするために，`gcloud`をインストールします．

```bash
mkdir ~/gcloud
cd ~/gcloud
```
[ここ](https://cloud.google.com/sdk/docs)のクイックスタート＞自身のOSに合わせて`tar.gz`ファイルをダウンロードし，先ほど作成したディレクトリに入れます．
そしてそのファイルを以下のように解凍し，インストールします．

```bash
tar xvzf gcloud.tar.gz
./google-cloud-sdk/install.sh
```

ターミナルを再起動し，以下コマンドを打てば`gloud`のインストールは完了です．

```bash
gcloud init
```

### gcloudからSSH接続できるか確認
インストールが完了したら，先ほど作成したGCPのプロジェクトと紐付けします．

```bash
gcloud config set project {my-project or id}
```

次に，VMインスタンスにSSH接続します．

```bash
gcloud compute ssh {instance name or id} #--ssh-flag="-p {port number}"
```
※ポートはこの後変えるので，今後はコメントを消して，自身が設定したポートを指定する必要があります．
接続できればOKです．

### SSH用のファイアウォールの設定
後回しにしていたファイアウォールを設定します．
デフォルトのポート番号は使わない方が良いらしいです．
まず，VMインスタンスにSSH接続し，SSHの設定を変更します．

```bash
gcloud compute ssh {instance name or id}
sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sed -i -e "s/#Port 22/Port {port number}/g" /etc/ssh/sshd_config
sudo service ssh restart
```

その後，Webの方から
Compute Engine＞VM Instances> View Network details　で先ほど設定した`{port number}`をルールとして設定します．

![ssh3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/81b1145f-6ae0-8341-a1a3-d2558f3bd010.png)
![ssh4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/4e98caa0-dba6-62b3-ac00-9e19c8e5f45e.png)

保存して，再度以下で接続できればOKです．

```bash
gcloud compute ssh {instance name or id} --ssh-flag="-p {port number}"
```
### 時間の設定
デフォルトでは，日本時間に設定されていないので，変更しておきます．
SSH接続して，

```bash
sudo apt-get install dbus
sudo timedatectl set-timezone Asia/Tokyo
```

以上でGCPの基本設定は終わりです．その他，セキュリティのために2ファクタ認証もやっておいた方が良いですが，ここでは割愛します．


## DDNS
### 設定
お金を払えば，固定IPが得られますが，ドメインの取得がてらmydnsを使って，DDNSします．
[myDNS](https://www.mydns.jp/)からJoin us＞Sign UPでアカウントを作成したら，

DOMAIN INFO > OKから，ドメインを設定します．
CHECK > OKで完了です．

<img width="712" alt="mydns1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/3ceae82e-b00b-ae89-23b7-76e49d0db87b.png">

次にIP ADDR DIRECTから，DDNSの設定をします．GCPのサイトに戻り，

<img width="1127" alt="dnsupdate1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/f66b9505-917d-9fdd-9d37-6896025f23a2.png">


上図のように赤四角で隠している部分に現在のGCPのExternal IPがあるので，それをメモし，入力します．（矢印は無視してください）
CHECK > OKで完了です．

<img width="659" alt="mydns2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5ba1833a-6d5a-142e-a7f0-af753682d242.png">

### IPの通知
IPを再起動時と1時間起きに通知するようにします．
まず，GCPにSSH接続し，アップデート用のシェルスクリプトを作成します．

```bash
mkdir ~/vpn
cd ~/vpn
vi update_ip.sh
```
```bash:update_ip.sh
#! /bin/bash
wget --http-user=mydnsxxxxx --http-password=~~~~~~~ http://www.mydns.jp/login.html -O /dev/null
```

パーミッションを変更します．

```bash
chmod +x ~/vpn/update_ip.sh
```


次に，再度GCPのサイトから， 

<img width="1127" alt="dnsupdate1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/f66b9505-917d-9fdd-9d37-6896025f23a2.png">

EDIT > custom metadata で，以下の赤四角部分に以下を入力します．

```bash
#! /bin/bash
bash /home/{name}/vpn/update_ip.sh
```

<img width="787" alt="dnsupdate2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5ab27803-df19-a98a-cbdf-9ab419d0ec6a.png">

これで，再起動時の通知設定は完了です．

最後に念のため，1時間置きに通知するように設定します．

```bash
crontab -e
```

```bash
# update ip
* */1 * * * /home/{name}/vpn/update_ip.sh
```

以上でDDNSの設定は完了です．

## おわりに
とりあえず，長いのでここで終了です．

## 参考
[これから始めるGCP（GCE）　安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)