🎉
Cloudflare を利用しながらユーザの IP を取得する方法
こんにちは!
むちょこです。 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]
Discussion