Cloudflare は DNS レコードでプロキシを使用すれば、CDN としてのキャッシュ有無に関わらず、無料で TLS 証明書が使用できて、自動更新もされます。プロキシを使用しない場合は、単なる DNS の名前解決のみとなり、TLS 証明書は Web サーバー側のものが使用されます。プロキシを使用すると、リバースプロキシとして動作することになるため、Web サーバー側の TLS 証明書はオレオレ証明書で問題なく、更に Web サーバーの IP アドレスが隠れ、表向きは Cloudflare の IP アドレスが使用されます。
ここまで良いことばかりですが、一つだけ Web サーバー側から見て、接続元の IP アドレスが Cloudflare の IP アドレスになります。これを Web サーバーが本当の接続元の IP アドレスを判別できるよう、今回は nginx でリアル IP アドレスを取得する設定をやってみました。これでプロキシを使用する前と同様に、アクセスログや allow/deny などでリアル IP アドレスで処理できます。
Cloudflare のプロキシ設定の例

nginx の設定例
server {
ブロックの前あたりに Cloudflare の IP アドレス範囲だった場合 CF-Connecting-IP
ヘッダーからリアル IP アドレスを取得します。
# Cloudflare https://www.cloudflare.com/ja-jp/ips/
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
server {
listen 80;
listen 443 ssl;
参考
https://www.cloudflare.com/ja-jp/ips
https://developers.cloudflare.com/fundamentals/reference/http-request-headers/#cf-connecting-ip
タグ: Cloudflare, Nginx