果報

二度寝して待つ

自宅内からのみ自宅サーバに公開URLかつプライベートIPでhttps接続する(Cloudflare Tunnel、Caddy、AdGuard Home)

タイトルに情報を詰め込みすぎました。おそらく一読しただけでは伝わらないと思うので、図を用意しました。

これを改めて文章で整理すると以下のような感じです。

  • 自宅サーバ上のサービス(Nextcloudなど)をCloudflare Tunnelでインターネットから接続できるようにする
  • 自宅内のプライベートネットワークの場合は自宅サーバのプライベートIPアドレスに書き換えて直接接続する
  • インターネット経由、プライベートネットワーク経由のいずれも同じURLかつhttpsで接続する

つまり、自宅サーバに自宅内から接続する場合は、インターネット(Cloudflare Tunnel)を経由せずに、インターネット経由と同じURLで、自宅サーバのプライベートIPアドレスに接続するということです。まだややこしいですけど…。

Cloudflare以外の構成として、リバースプロキシサーバにCaddy、DNSサーバにAdGuard Homeを使用します。また、SSL証明書にはLet’s Encryptのワイルドカード証明書を使用し、CaddyとCloudflareのAPIによってDNS-01チャレンジを自動化します。

なお、接続対象のサービスはNextcloudとしていますが、基本的にCaddyの設定を変えるだけでどのサービスでも応用できるはずです。

はじめに(背景など)

もともとは、以下の記事で書いたCloudflare Tunnelの構成で、自宅サーバに接続していました。

text.yusukesakai.com

以下の構成図だと①の方法です。

この方法でも基本問題ないのですが、自宅内の機器から自宅サーバに接続する際も常にインターネット(Cloudflare Tunnel)を経由するため、当然通信は遅くなるし、勿体ないなあと感じてました。

回避策として、Tailscaleを使用する(上図の③)ことで、自宅内の機器同士であれば最短経路で接続できますが、その場合Tailscaleの有効化が必須という点がデメリットでした。

そこで、今回紹介する方法で、①とURLを変更せず、かつ自宅内であれば自動でプライベートIPアドレスに接続するようにしようと思った次第です。

Caddyの設定

まず、Caddyのセットアップを行います。

Let’s Encryptのワイルドカード証明書を取得するため、以下の記事をもとに、CloudflareのAPIトークンの発行と、カスタム版Caddyの設定を行います。

text.yusukesakai.com

なお、Let’s EncryptではなくZeroSSLを使用する場合は、以下の記事を参照してください。

text.yusukesakai.com

Cloudflare Tunnelの設定

Cloudflare Tunnel(cloudflared)のインストール方法は以下の記事の「cloudflaredのインストール」に記載しています。

text.yusukesakai.com

ただ、上記では、Cloudflare TunnelからCaddyを介さずNextcloudに接続する構成でしたので、Cloudflare Tunnelでは自宅サーバの80ポート(http)に転送していました。今回、Caddyがその間に追加されたため、443ポート(https)への転送に変更する必要があります。

変更はCloudflareのZero Trustダッシュボードから行いますが、上の記事のように、cloudflaredのインストールをZero Trustダッシュボード上ではなくコマンドで行った場合、初回アクセス時に以下の表示となるかもしれません。その場合、案内に従ってZero Trustへのマイグレーションを行います。

Zero Trustのダッシュボードから管理できるようになったら、Networks>Tunnelsで対象のTunnelの編集を選択し、「Public hostnames」タブから対象のホスト名(ドメイン)を編集します。

そこで、「Public hostname」にドメイン名、「Service」にhttps://localhost:443を入力します。さらに、追加設定としてAdditional application settings>TLSから「Origin Server Name」にもドメイン名を入力し、保存します。

Cloudflare Tunnelの設定が問題なければ、この時点で、インターネット経由で対象のサービスに接続できるようになっているはずです。

AdGuard Homeの設定

最後に、自宅内のプライベートネットワークから接続した場合のみ、インターネットを経由せず、自宅サーバのプライベートIPアドレスに接続する方法を紹介します。

プライベートネットワークのみ利用するDNSサーバなどで、対象のURL(ドメイン)の向き先をプライベートIPアドレスに書き換えます。今回は以下の記事で構築したAdGuard Homeを使用しますが、同様の機能のものであれば何でもよいです(最悪hostsでも)。

text.yusukesakai.com

なお、Tailscaleは今回使用しません。AdGuard Homeをインストールし、自宅のWi-FiルータなどのDNS設定がAdGuard Homeに向いていれば準備OKです。

AdGuard Homeにログイン後、上部のメニューからフィルタ>DNS書き換えを選択し、「DNS書き換え情報を追加する」ボタンをクリックします。

「ドメイン名」と「プライベートIPアドレス」を入力し、「保存する」をクリックします。

以上ですべての設定が完了です。お疲れさまでした。

おわりに

キャッシュが残っていると切り替わるまで多少のタイムラグがあるかもしれませんが、時間をおいて対象のドメインにpingを打ってみると、宛先がプライベートIPアドレスになっていると思います。

もちろん、自宅外からアクセスする場合はインターネット経由となります。ただ、同じURLなので、自宅内外で接続先を使い分ける必要はありません。

特にNextcloudのように、ファイルのアップロード/ダウンロードを頻繁に行うサービスにとっては、自宅内における通信速度の向上や帯域節約という点でとても有用かと思います。