Webサーバをロードバランサー(ELB)経由にする時に、Webサーバに設定されるリモートアドレスが、ユーザー(ブラウザ)のものからロードバランサーのものになってしまうことは有名な話だと思います。
その場合、ELBは(その他の多くのロードバランサーも)X-Forwarded-Forヘッダに、ユーザー(ブラウザ)のIPアドレスが設定されるので、以前紹介したApacheでREMOTE_ADDRをELB経由でも…(CentOS)の記事の方法等で対応することが可能です。
そして、あまり無いとは思いますがロードバランサー経由のWebサーバをインターネットからの直接アクセスに戻す場合もあるかと思います。
(このようなケースがあるとすれば、コスト削減や障害対応等の場合かと思います。)
もし、アプリケーション等でX-Forwarded-Forヘッダを参照している場合、インターネットからの直接アクセスではX-Forwarded-Forヘッダは付与されていないので、アプリケーション側で問題が発生してしまうかと思います。
また、アプリケーションを修正するのは、現実的では無い場合が多いのでWebサーバ(Apache)側で対応したいところです。
このような場合、単にリモートアドレスと同じIPアドレスが設定された、X-Forwarded-Forヘッダが設定されていればアプリケーション的にも問題がなくなるはずです。
尚、Apacheの場合は下記のように設定(httpd.conf)を行う事で、上記を実現することが可能です。
SetEnvIf X-Forwarded-For ".+" forwarded RewriteEngine On RewriteRule ^(.*) - [E=CLIENT_ADDR:%{REMOTE_ADDR},L] RequestHeader set X-Forwarded-For "%{CLIENT_ADDR}e" env=!forwarded
※ロードバランサー(ELB)経由の場合は、そのままのX-Forwarded-Forを利用します。
実際に下記のPHPスクリプトで、ロードバランサー(ELB)経由とインターネットからの直接アクセスでの該当変数を確認してみました。
ロードバランサー(ELB)経由の場合は、X-Forwarded-Forが下記のようにロードバランサーが設定したもののままとなります。
インターネットからの直接アクセスの場合は、X-Forwarded-Forに下記のようなリモートアドレスの値が設定されていました。
当初は、SetEnvIfのみで対応できると思っていました。