Cloudflare Tunnel が Healthy なのに app.example.com が失敗する場合は、ルートの Service URL、オリジン証明書、SSL/TLS 暗号化モード を確認します。
Healthy ステータスは、cloudflared が Cloudflare に接続していることだけを示します。ルートのサービスやローカルオリジンは検証しません。
このガイドは、Let's Encrypt 証明書で HTTPS をすでに提供しているオリジンを対象にします。既存の証明書はそのまま使えます。
HTTP を HTTPS へリダイレクトする Apache オリジンでは、次の設定を使います。
- Service URL:
cloudflaredが Apache ホスト上で動いているときはhttps://localhost:443 - Origin Server Name: 証明書の対象ホスト名(例:
app.example.com) - Disable TLS certificate verification: オフ
- Encryption mode: Automatic SSL/TLS (recommended) のままにするか、Full (Strict) を選びます
公開ホスト名は、訪問者がリクエストする URL です。Service URL は、cloudflared が到達できるアドレス、プロトコル、ポートです。公開ホスト名と Service URL は別物です。ホスト名が Tunnel の CNAME を指しているときは、公開ホスト名を Service URL に使わないでください。
例: http://localhost:80 はローカル接続に HTTP を使い、https://localhost:443 は HTTPS を使います。例は、オリジンが使うアドレスとポートに置き換えます。
Cloudflare と cloudflared の間の接続は、ゾーンの SSL/TLS モードとは独立して暗号化されます。cloudflared はオリジンパラメーターで、ローカルオリジンの証明書を検証します。
ゾーンの SSL/TLS モードは Service URL を変えません。ローカルプロトコルはルートで設定し、証明書検証は originServerName とその他の オリジンパラメーター で設定します。
originServerName が空のとき、cloudflared は証明書の対象が Service URL のホストであることを期待します。Service URL が localhost の場合は、originServerName に証明書の対象ホスト名を設定します。この値は、TLS 接続の Server Name Indication(SNI)にも使われます。
次の判断ツリーで、ローカルプロトコルと証明書設定を選びます。
flowchart TD
accTitle: Service URL と SSL/TLS モードの判断ツリー
accDescr: オリジンのプロトコルから Service URL を選び、HTTPS オリジンの証明書検証を設定します。
A{オリジンは HTTPS を受け付ける?}
A -->|いいえ| B{HTTP は HTTPS へリダイレクトする?}
B -->|いいえ| C[HTTP の Service URL を使う]
B -->|はい| D{リダイレクトを維持する?}
D -->|いいえ| C
D -->|はい| E[HTTPS リスナーを設定する]
A -->|はい| F[HTTPS の Service URL を使う]
E --> F
F --> G{証明書の対象はサービスホストか?}
G -->|はい| H[TLS 検証をオンのままにする]
G -->|いいえ| I[Origin Server Name を設定し検証はオンのまま]
オリジンに HTTPS リスナーがない場合は、HTTP の Service URL を維持する前に、リダイレクトを外すか調整します。HTTPS の Service URL を HTTP リスナーへ向けないでください。
次の表で、よくあるオリジン設定とゾーン設定を比較します。
| オリジンの動作 | Service URL | オリジンパラメーター | ゾーン SSL/TLS の指針 |
|---|---|---|---|
| HTTP のみ(リダイレクトなし) | http://127.0.0.1:80 |
TLS パラメーターなし | Automatic、Flexible、Full、Full (strict) は、ローカルの HTTP 接続を変えません。 |
| HTTP が HTTPS へリダイレクトする | https://localhost:443、またはリダイレクトを外して HTTP を使う |
ルートを HTTPS として設定する | リダイレクトループの解消に Flexible を使わないでください。 |
app.example.com 向けの有効な Let's Encrypt 証明書がある HTTPS |
https://localhost:443 |
originServerName: app.example.com を設定します。Disable TLS certificate verification はオフのままにし、caPool は指定しません。 |
ゾーンモードは別に選びます。ローカル証明書の検証は行いません。 |
| プライベート認証局(CA)の HTTPS | https://localhost:443 |
originServerName と caPool を設定します。Disable TLS certificate verification はオフのままにします。 |
ゾーンモードは別に選びます。先に証明書の信頼を直します。 |
公開 HTTPS ホスト名では、Full (strict) はこの構成と両立します。ただし、cloudflared はローカルの Let's Encrypt 証明書を独立して検証します。ゾーンモードは、ルートの Service URL や originServerName の代わりにはなりません。
Full も、Tunnel のサービスプロトコルを変えたり、オリジン証明書エラーを直したりしません。どちらの問題でも Flexible に切り替えないでください。代わりに、ルートの Service URL またはオリジンパラメーターを更新します。
リモート管理トンネルでは、ダッシュボードでルートとオリジンパラメーターを更新します。
-
Cloudflare ダッシュボード ↗ で Networking > Tunnels を開き、トンネルを選択します。
Tunnels を開く ↗ -
Routes で、
app.example.comの Edit route を選択します。 -
Service URL に、オリジンが HTTPS を提供しているときは
https://localhost:443を入力します。サービスが HTTP で、HTTPS へリダイレクトしない場合に限りhttp://127.0.0.1:80を使います。 -
Additional application settings を展開します。TLS で、証明書の対象がそのホスト名のときは Origin Server Name を
app.example.comに設定します。Disable TLS certificate verification はオフのままにします。一般に信頼される Let's Encrypt 証明書では CA Pool は空のままにします。オリジンがプライベート CA を使うときだけ設定します。
-
Save changes を選択します。
既存の Let's Encrypt 証明書を外す必要はありません。オリジン名とサービスプロトコルが一致していれば、cloudflared はその証明書を検証できます。
ゾーンの SSL/TLS モードは、Tunnel ルートとは別です。ローカルプロトコルの選択や、cloudflared とオリジン間の証明書不一致の解消は行いません。
ゾーンモードを確認または変更します。
-
Cloudflare ダッシュボード ↗ で SSL/TLS > Overview を開きます。
Overview を開く ↗ -
SSL/TLS Overview で Configure を選択します。
-
Encryption mode で、選択中のオプションを確認します。Automatic SSL/TLS (recommended) が選ばれている場合は、この Tunnel ルートの切り分け中はそのままにします。Automatic モードはルートの Service URL を変えません。
-
特定のモードを使う場合は Full (Strict) を選び、Save を選択します。このゾーン設定は、
cloudflaredによる証明書検証の代わりにはなりません。 -
ローカルオリジンの証明書不一致を解消するために Flexible を選ばないでください。代わりに、Tunnel ルートの Service URL またはオリジンパラメーターを更新します。
利用可能なモードの詳細は SSL/TLS 暗号化モード を参照してください。オリジンが HTTP を HTTPS へリダイレクトする場合、HTTP の Service URL はリダイレクトループの原因になります。ほかのリダイレクト原因は ERR_TOO_MANY_REDIRECTS を参照してください。
ローカル管理トンネルでは、同じ設定を config.yml に書きます。
tunnel: <TUNNEL_UUID>
credentials-file: /path/to/<TUNNEL_UUID>.json
ingress:
- hostname: app.example.com
service: https://localhost:443
originRequest:
originServerName: app.example.com
- service: http_status:404この例では TLS 検証を有効のままにします。標準の Let's Encrypt 証明書は一般に信頼されるため、caPool は指定しません。プライベート CA の場合は、originRequest の下に caPool: /path/to/ca.pem を追加します。
Windows で、cloudflared がシステムのルート証明書プールを読み込めないと報告する場合は、認証局を含むローカル PEM バンドルへ caPool を設定します。
noTLSVerify: true は、証明書の信頼またはオリジン名を直すまでの一時的な最終手段に限って使います。根本原因を解消したらオフにします。
キャッチオールの http_status:404 ルールは、ファイル末尾に必須です。config.yml を編集したあと、ingress ルールを検証します。
cloudflared tunnel ingress validate次の確認を、公開インターネットからと、cloudflared と同じホストから実行します。
-
公開ホスト名と DNS を確認する。 Cloudflare ダッシュボードで、
Records を開く ↗example.comの DNS > Records を開きます。app.example.comが<TUNNEL_ID>.cfargotunnel.comを指すCNAMEであることを確認します。ターミナルから、対象のホスト名を調べます。
dig CNAME app.example.com +short dig A app.example.com +short dig AAAA app.example.com +shortプロキシされたレコードは、
CNAMEのターゲットではなく Cloudflare のアドレスを返すことがあります。その場合はダッシュボードでターゲットを確認します。Cloudflare は、Tunnel から
AまたはAAAAレコードへ黙ってフォールバックしません。トンネルが停止しても DNS レコードは残り、訪問者は1016エラー を受け取ります。詳細は Tunnel の DNS レコード を参照してください。トラフィックがオリジンへ直接向かっているように見える場合は、対象ホスト名に想定の CNAME ではなくAまたはAAAAレコードがあるか、明示的なロードバランサーや別ルートが応答していないかを確認します。 -
リダイレクトヘッダーとステータスを確認する。 クライアントから公開ホスト名をリクエストし、リダイレクトは限られた回数だけたどります。
curl -sS -D - -o /dev/null https://app.example.com/ curl -sS -D - -o /dev/null -L --max-redirs 5 https://app.example.com/繰り返される
Locationヘッダーと、301、302、307、308ステータスコードを探します。cloudflaredホストから、HTTP リスナーを直接テストします。curl -sS -D - -o /dev/null -H "Host: app.example.com" http://127.0.0.1:80/オリジンが HTTPS の
Locationヘッダーを返す場合は、HTTPS のService URLを使うか、オリジンのリダイレクト方針を変更します。HTTP のService URLは、すべてのリクエストを HTTP でオリジンへ送り、リダイレクトを無限に繰り返すことがあります。 -
オリジン証明書と Server Name Indication(SNI)を確認する。
cloudflaredが動いているホストで実行します。openssl s_client -connect 127.0.0.1:443 -servername app.example.com -verify_hostname app.example.com -verify_return_error </dev/null証明書に
app.example.comが含まれ、出力にVerify return code: 0 (ok)があることを確認します。Service URL がlocalhostで、証明書の対象がapp.example.comの場合は、Origin Server Name をapp.example.comに設定します。 -
Tunnel ログをストリーミングする。 トンネル詳細ページに Live logs タブがある場合は開き、Live を選択します。リモートログストリーミング も使えます。認証済みマシンから次のコマンドを実行することもできます。
cloudflared tail <TUNNEL_UUID>connection refused、不正な HTTP レスポンス、x509エラー、TLS ハンドシェイクエラーを探します。これらのメッセージは、トンネルステータスがHealthyのままでも、cloudflaredとローカルオリジン間の失敗を示します。
プロトコルの詳細は 対応している Tunnel プロトコル を参照してください。オリジン設定の全体は Tunnel オリジンパラメーター を参照してください。