ローカルホストで動作しているアプリケーションを簡易的に本番モードで試したり、ユーザテストのためにngrokを使っていましたが、Cloudflareもトンネル機能が無償である程度使えるようなので触ってみました。
Cloudflare
Cloudflareは、2019年7月に設立されたアメリカ合衆国の企業で、コンテンツデリバリネットワーク(CDN)、インターネットセキュリティサービス、DDoS防御、分散型ドメイン名サーバー(DNS)システムなどを提供しています。
2025年6月時点で、Content Delivery Network(CDN)市場83.4%のシェアだそうです。
Cloudflare Tunnel
Cloudflare Tunnelは、サーバーへのインバウンド(内向き)通信設定なしに、対象サーバーからアウトバウンド(外向き)通信のみで、外部からの安全なサーバーアクセスを実現するサービスです。CloudflareのZero Trust製品の一部として提供されています。
主な利点と特徴:
- ルータのポート開放不要: 自宅サーバーなどの公開時に必要となるポート開放が不要になります。これにより、セキュリティリスクを低減し、ルータ操作ができない環境でもサーバー公開が可能です。
-
安全な接続:
cloudflared
という軽量なデーモン(コネクタ)をオリジンサーバーにインストールし、これを使ってCloudflareのグローバルネットワークへ安全なアウトバウンド接続(トンネル)を確立します。外部からの直接的なアクセス経路がないため、オリジンサーバーのIPアドレスを隠蔽し、攻撃対象を減らします。 - IPアドレス変更に強い: ルータにWebサーバーのIPアドレスを記憶させる必要がないため、IPアドレス変更の影響を受けにくいです。
- Terraformでの設定・管理: TerraformなどのIaC(Infrastructure as Code)ツールで設定を自動化・管理できます。
- SSH接続やWebサイト公開: 自宅のマシンへのSSH接続や、自宅サーバーでホストしているWebサイトをポート開放せずに公開するなどの用途に利用されます。
- Zero Trustとの連携: Cloudflare Zero Trustと連携することで、特定のユーザーのみがアクセスできる公開Webサービスを簡単に構築できます。
- 管理が容易: Cloudflare Zero Trustのダッシュボード(Networks > Tunnels)からトンネルの作成や管理を行うことができます。
Cloudflare Tunnel利用手順
アカウントの作成
Cloudflareのアカウントが必要になりますがこの作業は省略します。
Zero Trustの利用登録
こちらも登録が必要です。無料プランでも十分な機能がありますので、最初は無料プランで登録します。手順は割愛します。
Tunnel の作成
Zero Trustのページでサイドナビゲーションメニュー内「Networks > Tunnels」にあります。
"Add a tunnel"ボタンで作成を開始します。
タイプ選択
Tunnelのタイプが「Cloudflared」と「WARPConnector(beta)」があるようです。
WARP Connectorはbeta版なので、手順も少なそうな"Cloudflared"を選択しました。
軽量なコネクタ(cloudflared)をサーバーにインストールし、Cloudflareのグローバルネットワークへ安全なトンネルを確立します。
Tunnel の命名
トンネル名を付ける必要があります。アプリケーション名やステージングや本番等のようにそういった文字列を入れるとよいようです。
Connectorのインストール
ページ内ではconnectorと読んでいますが、各種OSに対応するインストール方法が用意されています。今回はDockerを使ってみることにしました。
以下のコマンドでインストールと実行が可能なようです。
tokenオプションの値はページ内に記載しているものを使います
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token ey...9
以上を実行するとConnectorsセクションに接続中のコネクタが表示されました。
接続設定
トンネル先の接続設定を行います。
基本的には Subdomain や Domain、Path には用意したものを記入します。
Service の設定は口述しますが、基本的に localhost:<ポート番号> でよいですが,Dockerルータを利用するならサービス名を記入することもできます。
Docker Composeへの構成
前セクションのようにDockerコンテナとの接続が確認できれば、Docker Composeを利用して別コンテナへのプロキシを設定できます。
今回はNginxコンテナを用意してCloudflaredコンテナから接続できるようにしてみます。
docker-compose.yml
接続設定 で示したように http://nginx:80 へのトンネルを作成した場合、以下のような docker-compose.yml になります。サービスの一つに cloudflare-tunnel
(サービス名は任意)を用意し、depends_on
で nginx
サービスとリンクしておけば Docker ルータ経由したアクセスが可能です。
services:
nginx:
image: nginx:latest
volumes:
- ./nginx/ngin.conf:/etc/nginx/nginx.conf
ports:
- ${NGINX_HTTP_PORT:-80}:80
- ${NGINX_HTTPS_PORT:-443}:443
depends_on:
- backend
- app
cloudflare-tunnel:
image: cloudflare/cloudflared:latest
depends_on:
- nginx
command: >
tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN:? Set CLOUDFLARE_TUNNEL_TOKEN into .env}
そもそもですが、localhost とのポートマッピングをしておけば http://localhost:80 でも接続は可能ですね。
まとめ
Cloudflare の Zero Trust サービスにある Tunnel 機能を利用してみました。手軽さは Ngrok の方に軍配が上がるかなとは思いますが、制限が強めなのでその観点で困っている場合は Cloudflare を一度利用してみるといいかもしれません。