すでに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の上記性質を把握して、アクセス制限について紹介します。

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