Cloudflare Tunnel は、Cloudflare のネットワークから cloudflared の背後で動くサービスへトラフィックをルーティングします。アプリケーションを公開する と、公開ホスト名をローカルサービスに対応付けます。たとえば app.example.com を http://localhost:8080 に対応付けます。Cloudflare はリクエストをオリジンへ転送する前に、CDN キャッシュ、WAF、DDoS 防御を適用します。
公開アプリケーションは、トンネル設定で定義するホスト名とサービスの対応です。各対応は、指定した公開ホスト名のトラフィックを、どのローカルサービスが受け取るかを cloudflared に伝えます。
1 つのトンネルで複数のアプリケーションを公開できます。アプリケーションごとに次を指定します。
- 公開ホスト名 — ユーザーがアクセスするドメインまたはサブドメインです(例:
app.example.com)。 - サービス — アプリケーションが動いているローカルアドレスまたはソケットです(例:
http://localhost:8080)。
ダッシュボードからルートを追加すると、Cloudflare はそのホスト名をトンネルのサブドメイン(<UUID>.cfargotunnel.com)へ向ける DNS レコードを自動作成します。
次の表は、パブリックホスト名へルーティングできるサービスタイプの一覧です。HTTP 以外のサービスでは、エンドユーザーが接続するために クライアントへ cloudflared をインストールする 必要があります。
| サービスタイプ | 説明 | service の値の例 |
|---|---|---|
| HTTP | 受信した HTTPS リクエストを、HTTP 経由でローカルの Web サービスへプロキシします。 | http://localhost:8000 |
| HTTPS | 受信した HTTPS リクエストを、ローカルの Web サービスへ直接プロキシします。自己署名証明書に対しては、TLS 検証を無効 にできます。 | https://localhost:8000 |
| UNIX | HTTP と同じですが、Unix ソケットを使います。 | unix:/home/production/echo.sock |
| UNIX + TLS | HTTPS と同じですが、Unix ソケットを使います。 | unix+tls:/home/production/echo.sock |
| TCP | WebSocket 接続上で TCP をストリームします。エンドユーザーは cloudflared access tcp を実行して 接続 します。長寿命の接続には、代わりに Client-to-Tunnel を使います。 |
tcp://localhost:2222 |
| SSH | WebSocket 接続上で SSH をストリームします。エンドユーザーは cloudflared access ssh を実行して 接続 します。長寿命の接続には、代わりに Client-to-Tunnel を使います。 |
ssh://localhost:22 |
| RDP | WebSocket 接続上で RDP をストリームします。詳細は クライアント側 cloudflared で RDP に接続する を参照してください。 | rdp://localhost:3389 |
| SMB | WebSocket 接続上で SMB をストリームします。詳細は クライアント側 cloudflared で SMB に接続する を参照してください。 | smb://localhost:445 |
| HTTP_STATUS | すべてのリクエストに、固定の HTTP ステータスコードで応答します。 | http_status:404 |
| BASTION | cloudflared をジャンプホストとして動作させ、任意のローカルアドレスへのアクセスを提供します。 |
bastion |
| HELLO_WORLD | Cloudflare Tunnel の接続を検証するためのテストサーバーです(ローカル管理トンネル のみ)。 | hello_world |
service の値が IPv6 リテラルの場合は、RFC 3986 ↗ の定義どおり、アドレスを角括弧で囲みます。アドレス内の : がポート区切りと混同されないように、角括弧が必要です。
| サービスタイプ | service の値の例 |
|---|---|
| HTTP | http://[2001:db8::1]:8000 |
| HTTPS | https://[2001:db8::1]:443 |
| TCP | tcp://[2001:db8::1]:2222 |
| SSH | ssh://[2001:db8::1]:22 |
| RDP | rdp://[2001:db8::1]:3389 |
ホスト名と IPv4 アドレスに角括弧は不要です。http://localhost:8000 と http://192.0.2.1:8000 はそのまま使えます。
トンネルを作成すると、Cloudflare は <UUID>.cfargotunnel.com のサブドメインを生成します。このサブドメインを指す CNAME レコードを作成すると、ホスト名へのトラフィックがトンネルへルーティングされます。
cfargotunnel.com サブドメインがプロキシするのは、同じ Cloudflare アカウント内の DNS レコード向けトラフィックだけです。トンネルの UUID が知られても、別アカウントで DNS レコードを作成して、そのトンネル経由でトラフィックをプロキシすることはできません。
Cloudflare Tunnel の DNS レコードを作成するには:
-
Cloudflare ダッシュボード ↗ にログインし、ドメインの DNS Records を開きます。
Records を開く ↗ -
Add record を選択します。
-
次の値を入力します。
- Type: CNAME
- Name: アプリケーションのサブドメイン
- Target:
<UUID>.cfargotunnel.com
-
Save を選択します。

ローカル管理トンネルでは、次のコマンドを実行して、トンネルのサブドメインを指す CNAME レコードを作成します。
cloudflared tunnel route dns <UUID or NAME> www.app.comこの操作で CNAME レコードは作成されますが、トンネルが稼働していないとトラフィックはプロキシされません。
DNS レコードとトンネルは独立しています。稼働していないトンネルを指す DNS レコードも作成できます。トンネルが停止しても DNS レコードは削除されません。訪問者には 1016 エラーが表示されます。
同じトンネルサブドメインを指す DNS レコードを複数作成することもできます。複数のホスト名から複数のサービスへトラフィックをルーティングする場合は、ホスト名ごとに CNAME エントリを作成します。すべてのエントリは同じターゲットを共有します。
公開ロードバランサー を使い、公開アプリケーションを動かすサーバーへトラフィックを分散します。ヘルスチェックに基づくフェイルオーバーと、リージョンをまたぐインテリジェントなトラフィックステアリングが得られます。
graph LR
accTitle: Load balancing traffic to applications behind Cloudflare Tunnel
A[Internet] --> C{Cloudflare <br> Load Balancer}
C -- Tunnel 1 --> cf1
C -- Tunnel 2 --> cf2
subgraph F[Data center 2]
cf2[cloudflared]
S3[App server]
S4[App server]
cf2-->S3
cf2-->S4
end
subgraph E[Data center 1]
cf1[cloudflared]
S1[App server]
S2[App server]
cf1-->S1
cf1-->S2
end
同じトンネル UUID で複数の cloudflared レプリカ を動かすと、基本的な冗長性が得られます。1 つのホストが故障しても、他のレプリカがトラフィックを提供し続けます。ただし、ロードバランサーは同じトンネル UUID のレプリカをすべて 1 つのエンドポイントとして扱います。
きめ細かいトラフィックステアリングと セッションアフィニティ が必要な場合は、ホストごとに異なるトンネル UUID で接続します。ロードバランサーがそれぞれを独立して扱えます。
Cloudflare Tunnel の公開アプリケーション用にロードバランサーを作成するには:
-
Cloudflare ダッシュボードで Load Balancing ページを開きます。
Load Balancing を開く ↗ -
Create load balancer を選び、Public load balancer を選びます。
-
Select website で、公開アプリケーションルートのドメインを選びます。
-
Hostname ページで、ロードバランサーのホスト名を入力します(例:
lb.example.com)。 -
Pools ページで Create a pool を選び、わかりやすい名前を入力します。
-
次の値でトンネルエンドポイントを追加します。
- Endpoint Name: アプリケーションを実行しているサーバーの名前
- Endpoint Address:
<UUID>.cfargotunnel.com(Tunnel ID は the [Cloudflare dashboard](https://dash.cloudflare.com/) under **Networking** > **Tunnels** で確認します) - Header value: 公開アプリケーションルートのホスト名(例:
app.example.com) - Weight:
1(エンドポイントが 1 つの場合)
-
Fallback pool を選びます。ルーティングの選択肢は トラフィックステアリングポリシー を参照してください。
-
(推奨)Monitors ページで、エンドポイントにモニターを関連付けます。HTTP または HTTPS アプリケーションの場合は、次の HTTPS モニターを作成します。
- Type: HTTPS
- Path:
/ - Port:
443 - Expected Code(s):
200 - Header Name:
Host - Value:
app.example.com
-
ロードバランサーを保存してデプロイします。
テストするには、ロードバランサーのホスト名(lb.example.com)でアプリケーションにアクセスします。
TCP トンネルのオリジンを監視する
トンネルエンドポイントでは TCP モニターは使えません。代わりに、cloudflared ホスト上にヘルスチェック用エンドポイントを作り、HTTPS モニターを使います。たとえば、cloudflared で固定の HTTP ステータス応答を返すことができます。
- ヘルスチェック用に 公開アプリケーションルートを追加 します。
- Hostname:
health-check.example.com - Service Type: HTTP_STATUS
- HTTP Status Code:
200
- Hostname:
- 次の設定で モニターを作成 します。
- Type: HTTPS
- Path:
/ - Port:
443 - Expected Code(s):
200 - Header Name:
Host - Value:
health-check.example.com
このモニターは cloudflared に到達できることを確認します。上流サービスがリクエストを受け付けているかどうかは確認しません。
ローカル接続の優先
異なる拠点のエンドポイント間でトラフィックの偏りがある場合は、ロードバランサーの設定を調整する必要があります。
Cloudflare は Anycast ルーティング ↗ で、エンドユーザーのリクエストを最も近いデータセンターへ送ります。cloudflared は同じデータセンター内の接続でリクエストを処理することを優先するため、エンドポイント間のトラフィック分散に影響します。
同じトンネル UUID で cloudflared のレプリカ を動かしている場合は、トラフィックステアリング をより細かく制御するために、別々のトンネルへ切り替えることを検討してください。
公開アプリケーションは、ホスト名に設定された Cloudflare の設定を継承します。キャッシュルール、WAF ルール、その他の Rules 設定が含まれます。各ホスト名の設定は Cloudflare ダッシュボード ↗ で変更できます。
ロードバランサーを使う場合、設定はロードバランサーのホスト名に適用されます。