Cloudflareの利用時にアクセス元のIPアドレスをNginxのログに保存する方法

目次

概要

CloudflareのCDNを介したサーバーへのアクセスについて、ログにアクセス元のIPアドレスを保存するようにする方法を紹介します。

CloudflareでのIPアドレス

Cloudflareは、無料で使うことができるCDNとして有名です。私自身も、無料で使うことができるため、利用しています。

しかしながら、Cloudflareは仕組み上、通常の利用では、ApacheやNginxなどWebサーバーへのアクセス時のログにCloudflareのCDNのIPアドレスが書かれてしまいます。

これはアクセスログの解析や、何かあった際のログを確認したときにどこからのアクセスか分からないなど、不便でもあります。

そこで、ここではNginxを導入したWebサーバー上で、アクセスログにCloudflareのCDNのIPアドレスではなく、アクセス元のブラウザのIPアドレスを書き込むようにする方法を紹介します。また、今回の方法でリバースプロキシなどを利用している場合に、バックエンドのソフトウェアにIPアドレスを伝えることもできます。

設定

作業は、Cloudflareのサポート情報に書かれている内容をもとに進めていきます。

Just a moment…

作業の内容として、CDNを介したアクセス時には、HTTPのヘッダーに訪問者のIPアドレスがあるため、Nginxのngx_http_realip_moduleを利用して、正しいIPアドレスを認識させるというものになります。

Nginxに、ngx_http_realip_moduleが含まれているかは、次のコマンドで確認できます。

nginx -V

コマンドの結果に、--with-http_realip_moduleが含まれていれば大丈夫です。通常、UbuntuやCentOSなどが公式に提供するパッケージを利用してインストールしている場合は、含まれているはずです。もしも、含まれていない場合は、このモジュールを含めてNginxをビルドする必要があります。

次に、Nginxの設定ファイルを修正して、訪問者のIPアドレスを認識させます。Nginxの設定ファイルがまとめられている/etc/nginx/conf.d/以下に、cloudflare-ip.confなどの名前で次の設定を追加します。

real_ip_header CF-Connecting-IP;
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 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
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;

CDNが訪問者のIPアドレスを記入しているのは、CF-Connecting-IPヘッダです。real_ip_headerを利用して、CF-Connecting-IPヘッダの情報で書き換えることを教えています。

real_ip_headerだけの設定ではまだ足りません。さらにそのヘッダーに含まれるIPアドレスの範囲を設定する必要があります。しかし、CDNのIPアドレスは、変わることがあります。最新の状況は以下のWebページから確認可能ですので、設定時には、最新ものを反映させてください。ちなみに、私が設定を記述したのは、2022年12月です。

IP Ranges

わざわざIPアドレスの範囲を設定しなければならないのは、セキュリティのためのようです。面倒ですが、ちゃんと設定しましょう。

これで、設定は終わりです。最後に、Nginxを再起動して設定を反映させます。

systemctl restart nginx

さいごに

設定後、アクセスログを確認してみると、ちゃんとアクセス元のIPアドレスが記録されていました。

CDNのIPアドレスは変わることがあるため、定期的に変更がないか確認する必要がありますが、一度設定をしておけば、後は大きな変更をしなくてすみます。

何かあった際には、ログを確認することになるため、ログがちゃんと機能しているのかの確認はとても重要です。今回の設定をちゃんとしておき、有事に備えましょう。