はじめに
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コンソールにアクセスし、対象のディストリビューションを選択する

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
を普及させたいのだろうなと思う。