GCP上のApacheからローカルのラズパイApacheにリバースプロキシする（NAT超えWake on LAN[3]）

# はじめに
[前回](https://qiita.com/jjjkkkjjj/items/824998a6106eff941347)の続きです．
とりあえずやりたいことはこんなんです．

![network_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5834caa5-20e1-6878-79a1-01469d50525e.png)

今回は「GCP上のApacheからローカルのラズパイApacheにリバースプロキシする」です．
ここでやりたいことは，GCPからVPN接続しているローカルのラズパイにぶん投げさせます．

- [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)

# GCP側
## Apacheインストール

必要なものをインストールします．Line BotはHTTPSに対応していないとダメなので，Certbotもインストールします．

```bash
sudo apt update
sudo apt-get install apache2
sudo apt install certbot # For HTTPS
```

インストールはこれだけです．
※これで，`/var/www/html`が作成され，Webページを入れていけば表示されます（デフォルトページの`index.html`も入ってます．）．

## TCP443,40Portの開放
前々回同様の方法でTCP443,40ポートを開放します．

![port1](https://camo.qiitausercontent.com/243e541c5efeb5392ca11951a464e74b6708b82e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3235333933352f38316231313435662d366165302d383334312d613161332d6432353538663362643031302e706e67)

![port2](https://camo.qiitausercontent.com/c1704fdbe91ca26fe29978f3184e76da2f6a46b7/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3235333933352f34653938636161302d646261362d363262332d616330302d3965313963386535663435652e706e67)

## 確認
前々回取得したドメインかグローバルIPアドレスを入力してApacheが動いているか確認します．（このとき，forbittenなんかが出てきたら，たぶんポート開放が正しくできていないです．）
http://yourdomain_or_ip

正しくインストール／ポート開放できていると以下の画面になります．

<img width="1133" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/d8d81d85-68bf-4403-1b20-7d75d141b909.png">

## 設定

次にサーバー情報を最小限にするために，以下の設定を行います．

```bash
sudo vi /etc/apache2/conf-available/security.conf
```

```bash:/etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off
```

## SSL化
###証明書発行
`certbot`を使って，SSLの証明書を発行します．`--dry-run`引数はちょっと試してみるなコマンドです．いきなり`--dry-run`なしでやってもいいですが，念のためにやっておいた方がいいです．

```bash
$ sudo certbot certonly --webroot -w /var/www/html -d {domain} --email {mail address} --agree-tos -n --dry-run

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for {domain}
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - The dry run was successful.
```

と成功したら，本番です．

```bash
sudo certbot certonly --webroot -w /var/www/html -d {domain} --email {mail address} --agree-tos -n
```

エラーなく成功したら，

```bash
sudo ls /etc/letsencrypt/live/{domain}/
# >> README  cert.pem  chain.pem  fullchain.pem  privkey.pem # -> OK
```

で証明書ができているか確認します．

###証明書を有効化
証明書を有効化して，WebページをSSL化します．

```bash
cd /etc/apache2/sites-available/
sudo cp default-ssl.conf default-ssl.conf.bak # 念のため，バックアップ
sudo vi default-ssl.conf
```

メールアドレスや先ほど作成した証明書のパスを設定します．

```bash:/etc/apache2/sites-available/default-ssl.conf
# 3行目くらい
ServerAdimin {mail address(above address)}
# 25行目くらい
SSLEngine on
# 32, 33行目くらい
SSLCertificateFile /etc/letsencrypt/live/{domai}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/{domai}/privkey.pem
# 42行目くらい
SSLCertificateChainFile /etc/letsencrypt/live/{domai}/chain.pem
```

### Softether serverの443ポートを閉じる
前回でやっているかもしれませんが，一応．

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/e84cc97b-a053-013f-d1f1-9d37d0d5ae2c.png)

### サービスやシステムを有効化する
先ほど編集したSSLの設定や，Apacheのサーバーを再度設定しなおします．

```bash
sudo service apache2 start 
sudo systemctl reload apache2
sudo a2ensite default-ssl
sudo a2enmod ssl 
sudo apachectl -t # >> Syntax OK
sudo systemctl restart apache2
sudo reboot
```

これで，https://yourdomain_or_ip
（hhtp**s**に注意）を開いて，以下のようになっていればSSL化はできています．

<img width="290" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/f68aa101-0a2a-772e-cdb3-f9e272403bf8.png">

### certbotの更新
このままでは，時間が経つと（期間は忘れました．調べてください）証明書が無効になってしまうので，定期的に更新させます．
まずは，更新がうまくいくかを`--dry-run`で確認します．

```bash
$ sudo certbot renew --dry-run
- - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/{domain}/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```

とか出ればOK．
毎月ごとに更新するように，`crontab`で設定します．

```bash
sudo crontab -e # or crontab -u root -e
```

```bash
# renew ssl certification
0 0 1 * * certbot renew
```

## <strike>80ポートを閉じる</strike>　or リダイレクト
SSL化が完了し，<strike>80ポートは不要なので，どちらかを選びます．
ポートを閉じるのは割愛し，</strike>リダイレクトの方法を書きます．

※更新の際に80ポートは開放しとかないといけませんでした！

`/etc/apache2/sites-available/hogehoge.conf`ファイルがあるので，（たぶん`000-default.conf`ファイル）以下を書き込みます．正規表現でhttpsを強制的につけるように設定させています．

```bash
sudo vi /etc/apache2/sites-available/hogehoge.conf 
```

```bash:/etc/apache2/sites-available/hogehoge.conf
<VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
        ...
```

編集後，リロードします．

```bash
sudo a2enmod rewrite
sudo systemctl restart apache2
```

#ラズパイ側
インストール設定等は基本同じなので，割愛します．ただし，SSL化は不必要なので，`certbot`は要りません！

インストールが終わり，Apacheを起動し，確認まで行います．
※確認の際はポート開放等していないので，ラズパイのローカルIPで確認してください．(例：http://192.168.5.111など)

テストのため，`/var/www/html/index.html`をわかりやすいように変更します．

```html:/var/www/html/index.html
This is vpn server for wake on lan!
```

#リバースプロキシでぶん投げる
GCP→ラズパイにぶん投げます．
GCPにSSHで接続します．まず，リバースプロキシのために，もろもろ設定します．

```bash
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2
```

そうして，先ほど編集したファイルに以下を記入します．

```bash
sudo vi /etc/apache2/sites-available/default-ssl.conf
```

```bash:/etc/apache2/sites-available/default-ssl.conf 
ProxyPreserveHost On
ProxyPass / http://{raspi's local IP}:80/
ProxyPassReverse / http://{raspi's local IP}:80/
```

再起動します．

```bash
sudo systemctl restart apache2
```

確認します．https://{domain}
で以下のベージになっていればOKです．

<img width="676" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/a563d08e-a678-4f8b-ed48-2a662de224ed.png">

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