obi1.dev

VercelにデプロイしたアプリケーションをCloudflareでプロキシする

vercel cloudflare cdn waf

Vercel にデプロイしたアプリケーションに対して、Cloudflare の WAF や CDN、Cloudflare Access といった機能を活用したい場合、Cloudflare をリバースプロキシとして前段に配置する構成が考えられます。

しかし、そのまま設定を進めると Vercel のドメイン認証でエラーが発生することがあります。この記事では、その原因と解決方法をまとめます。

Vercel 公式の立場:リバースプロキシは非推奨

はじめに、Vercel の公式ドキュメントでは Vercel の前段にリバースプロキシを配置することは推奨されていません

理由として、以下の影響が挙げられています。

  • Vercel の CDN がトラフィックの詳細を把握できなくなり、ファイアウォールによる不審なアクセスの検知精度が下がる
  • エンドユーザーの実際の IP アドレスを正確に識別できなくなる
  • リバースプロキシがDDoS等の攻撃を受けた場合、そのトラフィックが Vercel プロジェクトに転送されてしまう
  • プロキシが侵害された場合、Vercel のファイアウォールがキャッシュを自動的にパージできなくなる

ただし、Cloudflare は Vercel の「Verified Proxy」として公式にサポートされているプロバイダーの一つです。Cloudflare を経由する場合、CF-Connecting-IP ヘッダーによってエンドユーザーの IP アドレスが Vercel に伝達されるため、上記の一部の影響は軽減されます。

この記事では、上記のリスクを理解した上で、それでも以下の理由から Cloudflare を前段に置く構成をとりたい場合の手順を説明します。

  • Cloudflare WAF による独自のルールでのアクセス制御
  • Cloudflare CDN を使ったコンテンツ配信
  • Cloudflare Access による認証・アクセス制御(特定のユーザーやグループのみアクセス許可するなど)

Cloudflare のプロキシ設定

Cloudflare DNS でドメインを管理している場合、DNS レコードの「プロキシ」設定(オレンジクラウド)を有効にすることで、Cloudflare をリバースプロキシとして機能させることができます。

これにより、以下のような Cloudflare の機能をそのまま利用できます。

  • WAF(Web Application Firewall)による不正アクセスのブロック
  • CDN によるコンテンツキャッシュと高速配信
  • Cloudflare Access による認証・アクセス制御

Vercel のドメイン認証で起きること

Vercel でカスタムドメインを設定する際、Vercel 側でドメインの所有確認と TLS 証明書の発行が行われます。この証明書の発行には ACME プロトコルが使われており、HTTP チャレンジとして以下のパスへの疎通確認が発生します。

http://<your-domain>/.well-known/acme-challenge/*

このとき、Cloudflare のプロキシが有効になっていると、HSTS などの設定によってリクエストが自動的に HTTPS にリダイレクトされます。その結果、HTTP チャレンジが成立せず、証明書の発行に失敗してドメイン認証がエラーになります。

プロキシを無効(グレークラウド)にすれば認証は通りますが、それでは Cloudflare の WAF や CDN が機能しなくなってしまいます。

解決策:Cloudflare の構成ルールで特定パスのみ SSL を無効化する

Cloudflare の「構成ルール(Configuration Rules)」を使って、ACME チャレンジのパスに対してのみ HTTPS へのリダイレクトと SSL を無効化します。

Cloudflare ダッシュボードから セキュリティ > 構成ルール を開き、新しいルールを作成します。

マッチ条件

(starts_with(http.request.uri.path, "/.well-known/acme-challenge"))

設定内容

項目
SSLオフ
HTTPS の自動リライトオフ

このルールを保存した後、Vercel のドメイン設定からドメイン認証を再試行すると、正常に証明書が発行されてドメインが有効になります。

まとめ

Cloudflare のプロキシを有効にした状態のまま Vercel のドメイン認証を通すには、ACME チャレンジのパス(/.well-known/acme-challenge/*)に対してのみ SSL と HTTPS リダイレクトを無効化する構成ルールを追加するのが有効です。

この設定によって、Cloudflare の WAF や CDN、Cloudflare Access を維持しながら Vercel のドメイン認証を正常に完了させることができます。

参考