CloudFrontのX-Forwarded-ForヘッダをIPv4アドレスとして取得する

はじめに

CloudFrontから送られてくるX-Forwarded-ForヘッダがIPv6のアドレスだったので、ログやアプリケーションで使用する場合にIPv6だと困ることがあったので、IPv4のアドレスとして取得するようにする。

環境

AWS 
 - CloudFront
 - EC2
 - ACM

CloudFrontのX-Forwarded-Forヘッダについて

CloudFrontを使用してウェブコンテンツを配信する場合、ユーザーのIPアドレス情報はX-Forwarded-Forヘッダに含まれて転送される。
※デフォルトでは、CloudFrontの設定でIPv6がオンになっている。

この場合、例えば以下のようなヘッダが送信される

X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348, 203.0.113.1

ここで最初のIPアドレスはクライアントのIPv6アドレスで、2番目は途中経由したプロキシサーバーなどのIPアドレスとなる。

CloudFrontでIPv6アドレスではなくIPv4アドレスを取得する

CloudFrontの設定

CloudFrontのディストリビューションがデュアルスタック(IPv4とIPv6の両方をサポート)で設定されている場合、IPv4のみをサポートするように変更できる。

1. CloudFrontコンソールにアクセスし、対象のディストリビューションを選択する

enable-ipv4-01

2. 「編集」をクリック

enable-ipv4-02

3. 「設定」タブで「IPv6」のチェックを外すし「変更を保存」を選択する

enable-ipv4-03

これにより、クライアントはIPv4経由でのみアクセスするようになり、X-Forwarded-ForヘッダにはIPv4アドレスのみが含まれるようになる。

動作確認

index.phpを用意する。

index.php
<?php
// Content-Type を明示
header('Content-Type: text/plain; charset=utf-8');

// すべてのヘッダーを取得して出力
foreach (getallheaders() as $name => $value) {
    echo "{$name}: {$value}\n";
}

アクセスをして、X-Forwarded-ForIPv4アドレスとなっていればOK!

参考

おわりに

CloudFrontを利用する際にX-Forwarded-ForヘッダからクライアントのIPv4アドレスを取得する方法について調査した。
IPv6の普及が進んでいるはずなのだが、まだまだアプリケーションのほうが対応ができていないし、世間的にはIPv4のほうが多いので今回はこの設定を行ってみた。
とはいえ、AWSとしてはIPv6を普及させたいのだろうなと思う。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。