cloudflareTunnelsで閉じたネットワーク上で稼働するアプリに外から接続する

1,072文字

やりたいこと・概要

自宅ネットワーク上で稼働しているhttpアプリケーションに外部から接続できるようにする。
今回は自宅サーバにて稼働しているメディア管理アプリimmichに外部から接続する。

Tunnelを使う利点とか

  • Cloudflare公式/Tunnel

  • インバウンドポートの解放が不要で外部からアクセスができる

  • 接続元端末はブラウザのみ使えればOK

  • cloudflare依存が高まるけれど、その恩恵が大きい。

    • cloudflareの標準のDDos防御・WAFがつく
    • Accessコントロールが無料で設定可能
    • DNSのSSL認証とかが楽
    • cloudflareが落ちたら使えなくなる
  • tailscale入れるほうが設定楽だし総合的に良いかもしれない

流れ(多分こんな感じ)

flowchart LR
browser["外出先のブラウザ"] -->|HTTPS| tunnel@{ icon: "logos:cloudflare-icon", form: "square", label: "Cloudflare Tunnel", pos: "b", h: 60 }
subgraph home["自宅ネットワーク(インバウンドポート開放不要)"]
cloudflared["cloudflared<br/>Dockerコンテナ"] -->|HTTP| immich["immich-server"]
end
tunnel -->|確立済みのトンネル| cloudflared

前提

  • cloudflareのアカウントがあること
  • 自前のドメインを持っていること

実装手順

1. docker-compose.ymlにcloudflaredのコンテナを追加

docker-compose.yml
cloudflared:
container_name: immich_cloudflared
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
depends_on:
immich-server:
condition: service_healthy
restart: unless-stopped
profiles:
- cloudflare

2. CloudflareTunnelsのGUIより設定してトークンを取得

CloudflareTunnelsを開く

「トンネルを作成」から名前をつけて作成

トークンを取得するため、アプリケーションにDockerを選択して、起動コマンドの中にあるトークンを取得

3. 環境変数に設定・起動確認

取得したトークンを.envに設定する。

.env
CLOUDFLARE_TUNNEL_TOKEN=xxxxxxxx

設定したcloudflareコンテナを起動

Terminal window
docker compose --profile cloudflare up -d

cloudflare画面にて接続完了の表示が出る。

4. DNSの設定

トンネルの概要を開いて「ルート」タブを選択

「ルートを追加」→ 「公開アプリケーション」を選択して各種設定を追加

  • サブドメインを作成、ドメインを選択
  • サービスURLを設定

    http://<コンテナのサービス名>:<ポート番号>

設定したドメインで接続できるかを確認

https://<サブドメイン>.<ドメイン>

5. Accessコントロールの設定

このままだと誰でも開けてしまう状態のため、自分のみのアクセスとなるように制限をする。

cloudflare > Zero Trust > Accessコントロール > アプリケーションを開く。

「+新規アプリケーションの作成」 > 「パブリックDNS」タブを選択

先ほどのサブドメイン+ドメインを入力し、Accessポリシーを作成して選択

再度先ほどと同じURLを開き、Accessコントロールの認証画面となることを確認する。

感想

これが無料で使えるってすごい。

参考にした記事