LoginSignup
2

More than 1 year has passed since last update.

VPSとWireguardとnginxで自宅サーバーをポート開放せずに公開する

Last updated at Posted at 2022-05-22

何がしたいか

タイトルの通りです。ポート開放ができない環境の方やオリジンの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化することを強く推奨します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2