何がしたいか
タイトルの通りです。ポート開放ができない環境の方やオリジンのIPを晒したくない人、事情によってCloudflareが使えないがIPを隠したい場合などにオススメです。
全体図
インターネット ↔ VPS ↔ [Wireguard] ↔ 自宅サーバー
事前準備
予め自宅サーバーの80番ポートでサイトが動いていることが前提です。
必要パッケージのインストール
以下のパッケージを双方のサーバーに入れてください。
・nginx
・wireguard
Wireguardの設定生成
Wireguardの設定を生成するサイトがあるのでそれを使ってWireguardの設定を準備します。
https://www.wireguardconfig.com/
"Endpoint"をVPSのIPアドレスに、"Number of Clients"を1に設定します。複数の自宅サーバーを繋げたい場合はその数に設定してください。
"Use Pre-Shared Keys (Enhanced Security)"という欄がありますがオンにするとセキュリティが向上するのでオンにすると良いかもしれません。
設定が終わったら生成ボタンで設定を生成します。
この設定ファイルには通信の暗号化に使う秘密鍵が含まれます。取り扱いには十分注意しましょう。くれぐれも暗号化されてないFTPなんかで飛ばさないでください。
Wireguardの設定
Wireguard準備
VPS側
お好みのエディターで/etc/wireguard/wg0.conf
を開きます。先程生成した設定に "Server" と "Client1" があると思います。(というか無かったらどこかで間違えてます)
VPS側ではこの "Server" の方をコピペしてください。これで完了ですと言いたいところですがこれだと不足があるので以下のように追記してください。
[Interface]
... (略)
Table = off [←これを追加する]
[Peer]
... (略)
PersistentKeepAlive = 30 [←これも追加する]
Table = off
を設定しないとデフォルトルートの設定が面倒なことになり下手するとネットに繋がらなくなります。
PersistentKeepAlive
はその名の通り切断されないようにするための設定です。
自宅サーバー側
先ほどと同じくお好みのエディターで/etc/wireguard/wg0.conf
を開きます。今度は先程生成した設定の "Client1" の方を貼り付けてください。
VPS側と同じく以下のように追記してください。
[Interface]
... (略)
Table = off [←これを追加する]
[Peer]
... (略)
PersistentKeepAlive = 30 [←これも追加する]
ファイアウォール設定
VPS側で設定生成時に指定したWireguardのポート(デフォルトは51820)を開けてください。忘れると原因探すのに苦労します。
有効化
基本的にsystemdを使って管理することを推奨
sudo systemctl enable --now wg-quick@wg0
テスト
VPS側からping 10.0.0.2
、自宅サーバー側からping 10.0.0.1
を実行して返ってきたら成功です。
nginxの設定
VPSへのリクエストを自宅サーバーにパススルーします。ファイアウォールの設定は各自適切に行ってください。ただし不要なポートを開けるのは禁物です。
お好みのエディターで/etc/nginx/nginx.conf
を開きます。
http
設定の上に以下のstream
設定を追記します。
stream {
server {
listen 443;
proxy_pass 10.0.0.2:443;
}
server {
listen 80;
proxy_pass 10.0.0.2:80;
}
}
もし443と80以外で使いたいポートがあるなら適当に追加してください。
追記:
書くのを忘れてました....
以下の行を必ずコメントアウトしましょう。
include /etc/nginx/sites-enabled/*;
最終的にこんな感じになればokです。
events {
...(略)
}
stream {
...(略)
}
http {
...(略)
}
最後にsudo nginx -s reload
で設定を反映しましょう。
ブラウザからVPSのIPにアクセスして自宅サーバーのサイトに繋がったら成功です。お疲れ様でした。
HTTPS化する場合は自宅サーバー側でcertbotを使って設定してください。ここでは詳しい手順は解説しませんがセキュリティとプライバシーの観点からHTTPS化することを強く推奨します。