はじめに
CloudFrontから送られてくるX-Forwarded-ForヘッダがIPv6のアドレスだったので、ログやアプリケーションで使用する場合にIPv6だと困ることがあったので、IPv4のアドレスとして取得するようにする。
環境
AWS
- CloudFront
- EC2
- ACMCloudFrontの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コンソールにアクセスし、対象のディストリビューションを選択する

2. 「編集」をクリック

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

これにより、クライアントはIPv4経由でのみアクセスするようになり、X-Forwarded-ForヘッダにはIPv4アドレスのみが含まれるようになる。
動作確認
index.phpを用意する。
<?php
// Content-Type を明示
header('Content-Type: text/plain; charset=utf-8');
// すべてのヘッダーを取得して出力
foreach (getallheaders() as $name => $value) {
echo "{$name}: {$value}\n";
}アクセスをして、X-Forwarded-For が IPv4アドレスとなっていればOK!
参考
AWS CloudFront デベロッパーガイド - リクエストヘッダーの追加
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/add-origin-custom-headers.htmlIPv6のサポート - CloudFront
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesEnableIPv6
おわりに
CloudFrontを利用する際にX-Forwarded-ForヘッダからクライアントのIPv4アドレスを取得する方法について調査した。IPv6の普及が進んでいるはずなのだが、まだまだアプリケーションのほうが対応ができていないし、世間的にはIPv4のほうが多いので今回はこの設定を行ってみた。
とはいえ、AWSとしてはIPv6を普及させたいのだろうなと思う。