先日、クラウドのロードバランサー配下にあるApacheの環境においてアクセス元IPを制御する必要が出てきました。
仕様
ここでお話しするサーバ環境の仕様は
OSがCentOS7
ApacheがApache2.4
となります。
許可したいIPが192.0.2.1
ロードバランサーのIPが203.0.113.1
ロードバランサーの仕様としては、Apacheにたどり着く送信元IPをロードバランサーのIPに置き換えられるものです。
しかし、ロードバランサーまで着信するIPは、X-Forwarded-Forのヘッダーに格納されているものです。
※AWSのELBなどのロードバランサーはこの仕様が用いられています。
要件
要件としては、
http://example.com/testapiに対して特定のIPアドレス以外からのアクセスは遮断したいというものです。
設定内容
まず、ロードバランサーが組み込まれていない環境であれば
1 2 3 4 |
<Location /testapi> Require ip 192.0.2.1 </Location> |
を設定することで192.0.2.1
以外からのアクセスは403 Forbidden
となり正常なアクセスはできなくなります。
では、ロードバランサーが組み込まれている環境に上記を設定するとどうなるでしょうか。
Apacheが評価できる送信元IPはロードバランサーのIPとなり192.0.2.1
からアクセスしているにも関わらずロードバランサーを経由したアクセスでは403 Forbidden
となり正常なアクセスはできなくなります。
※Apacheは、203.0.113.1
からアクセスが来たと評価してしまいます。
解消方法
解消方法はないのでしょうか。
Apache 2.4から組み込まれているremoteip_module
というモジュールを使うことで解消できます。
1 2 3 4 |
<Location /testapi> Require ip 192.0.2.1 </Location> |
の設定はそのままで
1 2 |
RemoteIPHeader X-Forwarded-For |
の1行を追加することで、X-Forwarded-Forに格納されているIPを評価してくれるようになります。
備考
remoteip_module
のモジュールが組み込まれているApacheなのか確認する方法
1 2 |
apachectl -M | grep "remoteip" |
を実行しremoteip_module (shared)
が含まれていればOKです。