cloudflareTunnelsで閉じたネットワーク上で稼働するアプリに外から接続する
やりたいこと・概要
自宅ネットワーク上で稼働しているhttpアプリケーションに外部から接続できるようにする。
今回は自宅サーバにて稼働しているメディア管理アプリimmichに外部から接続する。
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のコンテナを追加
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: - cloudflare2. CloudflareTunnelsのGUIより設定してトークンを取得
CloudflareTunnelsを開く

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

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

3. 環境変数に設定・起動確認
取得したトークンを.envに設定する。
CLOUDFLARE_TUNNEL_TOKEN=xxxxxxxx設定したcloudflareコンテナを起動
docker compose --profile cloudflare up -dcloudflare画面にて接続完了の表示が出る。

4. DNSの設定
トンネルの概要を開いて「ルート」タブを選択

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

- サブドメインを作成、ドメインを選択
- サービスURLを設定
http://<コンテナのサービス名>:<ポート番号>
設定したドメインで接続できるかを確認
https://<サブドメイン>.<ドメイン>
5. Accessコントロールの設定
このままだと誰でも開けてしまう状態のため、自分のみのアクセスとなるように制限をする。
cloudflare > Zero Trust > Accessコントロール > アプリケーションを開く。
「+新規アプリケーションの作成」 > 「パブリックDNS」タブを選択

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

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

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