2015年6月23日火曜日

ELB + nginxでアクセス元IPアドレスを取得できるようにする

followtheseinstructions balancing https://www.flickr.com/photos/followtheseinstructions/6871361948/in/photolist-btcwvJ-kLNmB-pEqkEV-9LdVCR-e6ptdo-4KHT6F-ipytp-qtnMTQ-7Jv54j-rDRPnV-aJrjqD-TpXTt-4YGqj2-8VqoLR-66jA7n-713w4e-9RnAYq-mBmNr-fXPtKt-9DTPjg-jAgTSf-5Z3R3b-4J6sJx-7HXvnz-9herYu-a1rJqP-MuHLf-9M2hY-kZWKN-dhk9hV-8ooruK-oBvk1y-8PTEaE-6kcWZN-9mBnuR-fpd7mC-5G9EW-9qK22M-a1vKe3-FAfU4-jCn6m5-dgCPD8-9sqRoJ-8VsFMt-nw2A7-78mWWw-8FGGDL-7J2sqS-6s863B-8Vtr59
Module ngx_http_realip_module
http://nginx.org/en/docs/http/ngx_http_realip_module.html

ELBを使ったときに、EC2ではアクセス元のIPアドレスがELBのIPアドレスとなります。
このとき、ELBはヘッダー情報 X-Forwarded-For にクライアントのIPアドレス格納して情報をEC2に渡すので、これをnginxモジュールを利用して、リアルIPとして扱うように設定をすることができます。

以下、設定方法です。

現在のアクセス元のIPアドレスを確認。
確認のために phpinfo() のファイルを開いてみます。
これは、ELBのIPアドレスになっています。
# curl -s http://test-247271050.ap-northeast-1.elb.amazonaws.com/ | grep REMOTE_ADDR
_SERVER["REMOTE_ADDR"] 172.31.6.30
nginx設定ファイルの http ディレクティブもしくは、server ディレクティブに追記します。 ser_real_ip_from にELBのIPアドレスを設定します。VPCのサブネット・ネットワークアドレスを指定します。
Availability Zone:ap-northeast-1a CIDR:172.31.16.0/20
Availability Zone:ap-northeast-1c CIDR:172.31.0.0/20
VPCで上記のように設定している場合は、172.31.0.0/16(172.31.0.1~172.31.255.254)とすればよいでしょう。
set_real_ip_from 172.31.0.0/16;
real_ip_header  X-Forwarded-For;
nginxをリスタート
# /etc/init.d/nginx restart
REMOTE_ADDRを確認。
# curl -s http://test-247271050.ap-northeast-1.elb.amazonaws.com/ | grep REMOTE_ADDR
_SERVER["REMOTE_ADDR"] 52.69.60.48
クライアントのIPアドレスになりました。