RHEL7/CentOS7 の Apache2.4 で X-Forwarded-For を REMOTE_ADDR にする

WEBサーバを運用しているとアレコレとログをとることになるだろう。WEBサーバとクライアントの間にロードバランサやプロキシがいたりして、ログに記録されるクライアントIPアドレスがロードバランサやプロキシのIPアドレスになってとっても不便ということがある。

ログだけでなく、クライアントのIPアドレスによってコンテンツアクセスの制御をしたいときも、クライアントのIPアドレスが一律ロードバランサやプロキシのIPアドレスになってしまっては不便である。

そんなときは X-Forwarded-For に入っているアドレスを REMOTE_ADDR に転記してくれるモジュール mod_remoteip を使えば良い。

RHEL7/CentOS7 の Apache2.4 であれば、mod_remoteip が組み込まれているので何も考えずに httpd.conf に 以下のようなことを書いておけば良い。

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.168.0.1 #ロードバランサやプロキシのIPアドレス

RemoteIPInternalProxy に記載したIPアドレスから来たリクエストのみ X-Forwarded-For のアドレスを REMOTE_ADDR に転記するようになる。このとき元のリクエストに含まれていた X-Forwarded-For は消去される。

WEBアプリケーション側から見れば、X-Forwarded-For のないリクエストに見える。よってクライアントIPアドレスで制御し放題である。

Apache のログに記録したい場合は、%h (リモートホスト名) ではなく %a (アクセス元IPアドレス) で記録するよう設定を変更しておく。