目的
Cloudflare で 1つの FQDN に対して Web / Non-Web ポートを両方対応する方法について確認します。
以下のようなイメージになりますが、稀にこういう構成は存在します。
オリジンは場合によっては、別サーバーに分かれているかもしれません。
Cloudflare CDN で対応する標準 Web 通信ポート
というのも、ドキュメントにある通り、Cloudflare CDN で対応する標準 Web 通信ポートは以下のものに限られています。
1つの FQDN に対して Web / Non-Web ポートを両方対応するには
では、どうするかというと、任意の TCP / UDP ポートで受け付けることができる Cloudflare Spectrum という製品を使います。
例えば、 Spectrum を使えば、上記の標準ポート以外で Web 通信を終端し、WAF を適用するといったことが可能です。
参考: CDN が有効な状態で Spectrum レコード作成時のエラー
ちなみに CDN の方ですでに A / AAAA / CNAME レコードが存在する場合は、以下のエラーによって Spectrum レコードが作成できません。
CDN の方で A / AAAA / CNAME レコードがないことを確認して、Spectrum から FQDN レコードを作成するようにしてください。
Spectrum レコードを使った構成
具体的には Spectrum を使って、以下のような構成を実現できます。
Spectrum 設定
アプリケーションタイプで HTTP / HTTPS
を選択することで、CDN のパイプラインを経由させ、キャッシュや WAF に関するルール適用をおこなうことができます。
アプリケーションタイプは、データがエッジからオリジンへ転送されるプロトコルを決定します。オリジンに直接プロキシしたい場合はTCP/UDPを選択してください。CDN、Workers、Bot管理などの製品を設定する場合は、HTTP/HTTPSを選択する必要があります。この場合、トラフィックはオリジンに直接接続するのではなく、Cloudflareのパイプラインを経由します。
また、異なるポート定義であれば、以下のように同一 FQDN に対して複数の設定をすることが可能です。
DNS としては、Type : Spectrum
として 1 つのレコードが確認できます。
確認
Spectrum レコードで公開されている FQDN 経由で SSH 接続できることを確認しましょう。
ssh FQDN.example.com -i ~/.ssh/private_key
Web 通信に関しては、例えば、以下のようなリクエストを送って 403
が返ってくれば、CDN パイプライン経由の WAF でブロックされることが確認できます。
% curl https://FQDN.example.com/.env -o /dev/null -w '%{http_code}\n' -s
403
まとめ
Spectrum を使えば、標準ポート以外で Web 通信を終端し、WAF を適用したり、1つの FQDN に対して Web / Non-Web ポートを両方対応することが可能です。
特殊なポートや標準の CDN だけでは満たせない要件がある場合には、ぜひ検討してみてください。