Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Cloudflare Tunnel の HTTPS オリジンを切り分ける

最終更新 Markdown で表示Agent セットアップ

Cloudflare TunnelHealthy なのに 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)にも使われます。

ルートと SSL/TLS 設定を選ぶ

次の判断ツリーで、ローカルプロトコルと証明書設定を選びます。

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 originServerNamecaPool を設定します。Disable TLS certificate verification はオフのままにします。 ゾーンモードは別に選びます。先に証明書の信頼を直します。

公開 HTTPS ホスト名では、Full (strict) はこの構成と両立します。ただし、cloudflared はローカルの Let's Encrypt 証明書を独立して検証します。ゾーンモードは、ルートの Service URLoriginServerName の代わりにはなりません。

Full も、Tunnel のサービスプロトコルを変えたり、オリジン証明書エラーを直したりしません。どちらの問題でも Flexible に切り替えないでください。代わりに、ルートの Service URL またはオリジンパラメーターを更新します。

リモート管理ルートを更新する

リモート管理トンネルでは、ダッシュボードでルートとオリジンパラメーターを更新します。

  1. Cloudflare ダッシュボードNetworking > Tunnels を開き、トンネルを選択します。

    Tunnels を開く ↗
  2. Routes で、app.example.comEdit route を選択します。

  3. Service URL に、オリジンが HTTPS を提供しているときは https://localhost:443 を入力します。サービスが HTTP で、HTTPS へリダイレクトしない場合に限り http://127.0.0.1:80 を使います。

  4. Additional application settings を展開します。TLS で、証明書の対象がそのホスト名のときは Origin Server Nameapp.example.com に設定します。

    Disable TLS certificate verification はオフのままにします。一般に信頼される Let's Encrypt 証明書では CA Pool は空のままにします。オリジンがプライベート CA を使うときだけ設定します。

  5. Save changes を選択します。

既存の Let's Encrypt 証明書を外す必要はありません。オリジン名とサービスプロトコルが一致していれば、cloudflared はその証明書を検証できます。

SSL/TLS モードは分けて扱う

ゾーンの SSL/TLS モードは、Tunnel ルートとは別です。ローカルプロトコルの選択や、cloudflared とオリジン間の証明書不一致の解消は行いません。

ゾーンモードを確認または変更します。

  1. Cloudflare ダッシュボードSSL/TLS > Overview を開きます。

    Overview を開く ↗
  2. SSL/TLS OverviewConfigure を選択します。

  3. Encryption mode で、選択中のオプションを確認します。Automatic SSL/TLS (recommended) が選ばれている場合は、この Tunnel ルートの切り分け中はそのままにします。Automatic モードはルートの Service URL を変えません。

  4. 特定のモードを使う場合は Full (Strict) を選び、Save を選択します。このゾーン設定は、cloudflared による証明書検証の代わりにはなりません。

  5. ローカルオリジンの証明書不一致を解消するために Flexible を選ばないでください。代わりに、Tunnel ルートの Service URL またはオリジンパラメーターを更新します。

利用可能なモードの詳細は SSL/TLS 暗号化モード を参照してください。オリジンが HTTP を HTTPS へリダイレクトする場合、HTTP の Service URL はリダイレクトループの原因になります。ほかのリダイレクト原因は ERR_TOO_MANY_REDIRECTS を参照してください。

ローカル管理トンネルを設定する

ローカル管理トンネルでは、同じ設定を config.yml に書きます。

config.ymlyml
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 と同じホストから実行します。

  1. 公開ホスト名と DNS を確認する。 Cloudflare ダッシュボードで、example.comDNS > Records を開きます。app.example.com<TUNNEL_ID>.cfargotunnel.com を指す CNAME であることを確認します。

    Records を開く ↗

    ターミナルから、対象のホスト名を調べます。

    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 レコードがあるか、明示的なロードバランサーや別ルートが応答していないかを確認します。

  2. リダイレクトヘッダーとステータスを確認する。 クライアントから公開ホスト名をリクエストし、リダイレクトは限られた回数だけたどります。

    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 ヘッダーと、301302307308 ステータスコードを探します。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 でオリジンへ送り、リダイレクトを無限に繰り返すことがあります。

  3. オリジン証明書と 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 Nameapp.example.com に設定します。

  4. Tunnel ログをストリーミングする。 トンネル詳細ページに Live logs タブがある場合は開き、Live を選択します。リモートログストリーミング も使えます。認証済みマシンから次のコマンドを実行することもできます。

    cloudflared tail <TUNNEL_UUID>

    connection refused、不正な HTTP レスポンス、x509 エラー、TLS ハンドシェイクエラーを探します。これらのメッセージは、トンネルステータスが Healthy のままでも、cloudflared とローカルオリジン間の失敗を示します。

プロトコルの詳細は 対応している Tunnel プロトコル を参照してください。オリジン設定の全体は Tunnel オリジンパラメーター を参照してください。

役に立ちましたか?