🎉

Cloudflare を利用しながらユーザの IP を取得する方法

2022/02/19に公開

こんにちは!
むちょこです。 Web エンジニアをしています。

Cloudflare などのプロキシサーバを利用しながらユーザの IP アドレスを正しく取得する方法を記事にしてみたいと思います:)

環境

OS は CentOS 8.5 、Web サーバは Apache 2.4 を利用しています。

$ cat /etc/redhat-release
CentOS Linux release 8.5.2111
$ httpd -v
Server version: Apache/2.4.37 (centos)

そのままだと Cloudflare の IP が取得される

まずは試しに、何も対応しないまま $_SERVER['REMOTE_ADDR'] で IP アドレスを取得してみます( プログラミング言語は PHP を使用しています)。

var_dump($_SERVER['REMOTE_ADDR']);
// 出力結果
// string(13) "172.70.122.76"

Cloudflare の IP が取得されました[1]

利用するモジュール

オリジナルの IP アドレスを取得するためのモジュールが Cloudflare と Apache からそれぞれ出ています。
Cloudflare の mod_cloudflare は既に更新とサポートが終了しているため、今回は Apache の mod_remoteip の機能を使っていきます。
Apache 2.4 にはこのモジュールが予め同梱されておりインストールは不要です。

$ httpd -M | grep remoteip
 remoteip_module (shared)

Apache の設定を編集する

Apache の config ファイルに RemoteIPHeader CF-Connecting-IP を追加します。
CentOS の場合は /etc/httpd/conf/httpd.conf/etc/httpd/conf.d 内の .conf ファイルが設定ファイルとして読み込まれます。

例:

 <VirtualHost *:80>
  ServerName example.com
  DocumentRoot /var/www/html/example.com/sample/public
  RemoteIPHeader CF-Connecting-IP
  ErrorLog logs/example.com-error_log
  CustomLog logs/example.com-access_log common
</VirtualHost>

編集が終わったら Apache を再起動して設定を反映させます。

$ service httpd restart

オリジナルの IP が取得できるか確認

var_dump($_SERVER['REMOTE_ADDR']);

出力結果が本来の自分の IP になっていれば OK です![2]

脚注
  1. Cloudflare の IP レンジ情報はこちらのページで公開されています。 ↩︎

  2. 自分の IP アドレスは確認くんなどのサービスで簡単に確認できます。 ↩︎

Discussion