はじめに
前回の続きです.
とりあえずやりたいことはこんなんです.
今回は「GCP上のApacheからローカルのラズパイApacheにリバースプロキシする」です.
ここでやりたいことは,GCPからVPN接続しているローカルのラズパイにぶん投げさせます.
- [1]GCPとMyDNSを使って,ドメインを取得する
- [2]GCPにSoftether Serverを立てる(iPhone/ラズパイから接続)
- [3]GCP上のApacheからローカルのラズパイApacheにリバースプロキシする
- [4]ラズパイをルーター化する
- [5]Wake on LAN用のPythonスクリプトを作成する.
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
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
メールアドレスや先ほど作成した証明書のパスを設定します.
# 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
(hhtpsに注意)を開いて,以下のようになっていれば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
<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
をわかりやすいように変更します.
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
ProxyPreserveHost On
ProxyPass / http://{raspi's local IP}:80/
ProxyPassReverse / http://{raspi's local IP}:80/
再起動します.
sudo systemctl restart apache2
確認します.https://{domain}
で以下のベージになっていればOKです.
おわりに
とりあえず,長いのでここで終了です.