extract_forwarded_moduleを使ってREMOTE_ADDRにアクセス元IPを設定する


やりたいこと

.htaccess内でmodRewriteを使用してIPアドレスによってメンテナンスページへの振り分けをしたい。
許可IPの場合は閲覧可、それ以外はメンテナンスページを表示にするという対応を行う。

環境

CloudFront(以後、CDN)
ELB
Amazon Linux(以後、EC2)

構成としてはCDNを経由し、ELBを通り、EC2へのアクセスされます。

問題点

.htaccessにて「X_FORWARDED_FOR」を使って、アクセス元のIPアドレスを判断しようとしたところ、「X-Forwarded-For」に複数のIPが記載されいることでmodRewriteを使用したIPアドレスなどによるページ振り分けができなかった。

上記環境の問題によりどうやらCDNのIPアドレスが出力されているようです。
本来はELBのIPアドレスも記載されるはずですが、今回apacheモジュールの「mod_rpaf」を入れているため、ELBのIPはありませんでした。

考えたこと(対策)

  1. SetEnvに許可IPアドレスを変数にセットし、アクセス制限を行う
  2. extract_forwarded_moduleを導入する。REMOTE_ADDRを取得し、modRewriteにて振り分けを行う。

■phpinfoにてIPアドレスを確認

1はIPアドレスにてアクセス制限出来ますが、ページの振り分けができないため却下。
2を採用する。

やったこと

1. 「extract_forwarded_module」インストール

yumにてインストールを行う。

$ sudo yum install mod_extract_forwarded

2. 「mod_extract_forwarded.conf」編集

MEFacceptを「all」に変更

# コメントは省略しています
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEForder refuse,accept
MEFrefuse all
MEFaccept all
MEFaddenv on
MEFdebug off

3. 「httpd.conf」編集

mod_extract_forwarded.soを読み込むよう編集を行う。

LoadModuleを検索し、mod_extract_forwarded.soを追加する。
すでに追加されており、コメントアウトされている場合はコメントアウトを外す
また環境によってファイル名や、PATHが異なるかもしれませんので、moduleディレクトリ配下にて「extract_forwarded」を検索し適したものに変更する必要あり。

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so

apache再起動

設定を反映させる

$ /etc/init.d/httpd restart

確認

phpinfoにてREMOTE_ADDRを確認する。

感想

無事にアクセス元のIPアドレスが取得でき、安心。
CDNやSetEnvを使った制御ができるかもしれませんでしたが、調査する時間がなく断念。

もう少しCDNやELB(アプリケーションロードバランサー)などを使用した環境も研究して色々と知見をためていこうと思います。

ありがとうございました!!