すでにX-Forwarded-ForヘッダのついたHTTPリクエストがELBを経由するとどうなるかを、下記のX-Forwarded-Forヘッダを出力するPHPスクリプトを用いて実験してみました。
$headers = getallheaders(); print("X-Forwarded-For: " . $headers["X-Forwarded-For"] . "n");
はじめに、X-Forwarded-Forヘッダがない状態でアクセスすると、下記のように、アクセスしたクライアントのIPアドレスが、ELB上でX-Forwarded-Forヘッダとして追加されます。
# telnet suzlab-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80 Trying xxx.xxx.xxx.xxx... Connected to suzlab-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com. Escape character is '^]'. GET /elb.php HTTP/1.0 HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Date: Wed, 01 Jun 2011 05:49:48 GMT Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.3.6 Content-Length: 32 Connection: Close X-Forwarded-For: yyy.yyy.yyy.yyy Connection closed by foreign host.
そして、下記のように、すでにX-Forwarded-Forヘッダが付いている状態でアクセスすると、既存のX-Forwarded-ForヘッダにアクセスしたクライアントのIPアドレスがカンマ区切りで追加されることがわかります。
# telnet suzlab-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80 Trying xxx.xxx.xxx.xxx... Connected to suzlab-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com. Escape character is '^]'. GET /elb.php HTTP/1.0 X-Forwarded-For: zzz.zzz.zzz.zzz HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Date: Wed, 01 Jun 2011 05:49:48 GMT Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.3.6 Content-Length: 32 Connection: Close X-Forwarded-For: zzz.zzz.zzz.zzz, yyy.yyy.yyy.yyy Connection closed by foreign host.
上記の結果となりましたので、次はX-Forwarded-Forの上記性質を把握して、アクセス制限について紹介します。