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


はじめに

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

目的

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

問題点

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

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

解決策

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

  • ネットワークの完成イメージ図

つまり,

  • 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を利用し,サーバーを構築します.公式サイトからこれから始めるGCP(GCE) 安全に無料枠を使い倒せを参考に作成します.

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

Organizationはなしにしました.

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

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


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

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

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


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

GCloudのインストール

SSHで作成したVMインスタンスに接続できるようにするために,gcloudをインストールします.

mkdir ~/gcloud
cd ~/gcloud

ここのクイックスタート>自身のOSに合わせてtar.gzファイルをダウンロードし,先ほど作成したディレクトリに入れます.
そしてそのファイルを以下のように解凍し,インストールします.

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

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

gcloud init

gcloudからSSH接続できるか確認

インストールが完了したら,先ほど作成したGCPのプロジェクトと紐付けします.

gcloud config set project {my-project or id}

次に,VMインスタンスにSSH接続します.

gcloud compute ssh {instance name or id} #--ssh-flag="-p {port number}"

※ポートはこの後変えるので,今後はコメントを消して,自身が設定したポートを指定する必要があります.
接続できればOKです.

SSH用のファイアウォールの設定

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

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}をルールとして設定します.


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

gcloud compute ssh {instance name or id} --ssh-flag="-p {port number}"

時間の設定

デフォルトでは,日本時間に設定されていないので,変更しておきます.
SSH接続して,

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

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

DDNS

設定

お金を払えば,固定IPが得られますが,ドメインの取得がてらmydnsを使って,DDNSします.
myDNSからJoin us>Sign UPでアカウントを作成したら,

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

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

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

IPの通知

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

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

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

chmod +x ~/vpn/update_ip.sh

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

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

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

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

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

crontab -e
# update ip
* */1 * * * /home/{name}/vpn/update_ip.sh

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

おわりに

とりあえず,長いのでここで終了です.

参考

これから始めるGCP(GCE) 安全に無料枠を使い倒せ