Cloudflare TunnelでDockerコンテナを安全にインターネット公開する方法(ポート開放不要)

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

なぜポートフォワーディングをやめてCloudflare Tunnelに移行したのか?

Home LabやVPSを運用していて、ハッカーの攻撃を恐れてポート80や443を開放するのをためらっていませんか?Cloudflare Tunnelは、自宅の「ドア」を閉じたまま、アプリケーションをインターネットに公開できるソリューションです。以前はサービスを公開するたびにルーターのポートフォワーディングを設定する必要があり、非常に面倒でした。さらに、プロバイダーのIPアドレスが頻繁に変わるため、DDNSが不安定になることもありました。

システム全体をCloudflare Tunnelに移行して半年以上が経過し、特に価値があると感じた3つのメリットを紹介します。

  • CGNATの突破: 4G回線やマンションの共有回線など、ルーターの設定権限がない環境でもウェブサイトを公開できます。
  • 完全な匿名性: ハッカーはサーバーの実際のIPアドレスをスキャンできません。すべてのトラフィックは、サーバーに到達する前にCloudflareのファイアウォールでフィルタリングされます。
  • 手軽なSSL化: Certbotのインストールや、3ヶ月ごとのLet’s Encrypt証明書の更新を心配する必要はありません。

クイックスタート:5分でDockerアプリを公開する

始めるには、Cloudflareのアカウントと、ネームサーバーをCloudflareに設定したドメインが必要です。

ステップ1:ダッシュボードでTunnelを作成する

Zero Trust Dashboard -> Networks -> Tunnels にアクセスします。Create a Tunnel を選択し、home-server のような分かりやすい名前を付けて保存します。

ステップ2:Dockerでコネクタを実行する

Cloudflareからトークンが発行されます。サーバー上で以下のコマンドを実行してください(YOUR_TOKEN_HERE を実際のトークンに置き換えてください)。

docker run -d --name cloudflared cloudflare/cloudflared:latest tunnel --no-autoupdate run --token YOUR_TOKEN_HERE

実行すると、このコンテナはCloudflareへのアウトバウンド接続を確立します。ルーターやVPSのファイアウォールでポートを開放する必要は一切ありません。

ステップ3:Public Hostnameの設定

ウェブ画面に戻り、Public Hostname タブで **Add a public hostname** をクリックし、以下の情報を入力します。

  • Subdomain: app
  • Domain: 自分のドメインを選択
  • Service Type: HTTP
  • URL: localhost:8080(アプリケーションのポート番号)

https://app.yourdomain.com にアクセスしてみましょう suspension、緑色の鍵マークが表示され、アプリがオンラインになっているはずです!

Docker Composeによるプロフェッショナルなデプロイ

実際には、管理のために常に docker-compose.yml を使用しています。この方法では、コンテナ同士がDockerの内部ネットワークを介して接続されます。ホスト側にポートを公開(ports: セクションの記述)する必要すらありません。

version: "3.9"
services:
  my-app:
    image: nginx:alpine
    container_name: web_app
    networks:
      - internal_network

  tunnel:
    image: cloudflare/cloudflared:latest
    restart: always
    command: tunnel run --token ${CF_TUNNEL_TOKEN}
    networks:
      - internal_network

networks:
  internal_network:
    driver: bridge

Tips: ダッシュボードの設定で localhost:80 と入力する代わりに、http://web_app:80 と入力してください。Cloudflare Tunnelは、同じネットワーク内の web_app コンテナを直接見つけ出します。

Cloudflare Accessによる2段構えのセキュリティ

PortainerやAdminerなどの管理ツールを使用する場合、私はよく Cloudflare Access を併用します。ログイン画面をそのまま公開するのではなく、自分のメールアドレスのみアクセスを許可するポリシーを設定できます。その際、Cloudflareは本人確認のためにメールでOTP(ワンタイムパスワード)を送信します。これにより、アプリのパスワードに対するブルートフォース攻撃を100%防ぐことができます。

トラブルを避けるための重要な注意点

非常に便利なCloudflare Tunnelですが、万能ではありません。長期運用の中で気づいた注意点を共有します。

1. アップロード容量の制限

Cloudflareの無料プランでは、デフォルトでアップロードファイルサイズが約100MBに制限されています。Nextcloudで4K動画をバックアップする場合などは、413エラーが発生します。大容量ファイルを頻繁に転送する必要がある場合は、慎重に検討してください。

2. レイテンシ(遅延)

トラフィックがCloudflareのインフラを経由するため、Pingが20ms〜50msほど増加します。一般的なウェブアプリなら問題ありませんが、低遅延が求められるゲームサーバーなどを運用する場合は問題になる可能性があります。

3. トークンの管理

CF_TUNNEL_TOKEN は非常に重要です。これを知っている人は誰でもあなたのシステムに「侵入」できてしまいます。トークンは .env ファイルに保存し、絶対にGitHubなどで公開しないようにしてください。

結論として、Cloudflare Tunnelは従来のポート開放(NAT)に代わる大きな進歩です。高速で安全、かつデプロイも非常に簡単です。Home Labを構築しているなら、ぜひ今日からTunnelに切り替えてみてください。

Share: