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のみで対応できると思っていました。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら