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


はじめに

前回の続きです.
とりあえずやりたいことはこんなんです.

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

GCP側

Apacheインストール

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

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

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

TCP443,40Portの開放

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

確認

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

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

設定

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

sudo vi /etc/apache2/conf-available/security.conf
/etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

SSL化

証明書発行

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

$ 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.

と成功したら,本番です.

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

エラーなく成功したら,

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

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

証明書を有効化

証明書を有効化して,WebページをSSL化します.

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

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

/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ポートを閉じる

前回でやっているかもしれませんが,一応.

サービスやシステムを有効化する

先ほど編集したSSLの設定や,Apacheのサーバーを再度設定しなおします.

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化はできています.

certbotの更新

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

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

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

sudo crontab -e # or crontab -u root -e
# renew ssl certification
0 0 1 * * certbot renew

80ポートを閉じる or リダイレクト

SSL化が完了し,80ポートは不要なので,どちらかを選びます.
ポートを閉じるのは割愛し,
リダイレクトの方法を書きます.

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

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

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

編集後,リロードします.

sudo a2enmod rewrite
sudo systemctl restart apache2

ラズパイ側

インストール設定等は基本同じなので,割愛します.ただし,SSL化は不必要なので,certbotは要りません!

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

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

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

リバースプロキシでぶん投げる

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

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

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

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

再起動します.

sudo systemctl restart apache2

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

おわりに

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