💫

CloudFrontのWAFで403?実はIPv6が原因だった話

に公開

今回は、AWS WAF(以下「WAF」)とAmazon CloudFront(以下「CloudFront」)の構成で発生した、403 エラーの事例についてご紹介します。

同じようなトラブルに遭遇した方の助けになればと思い、この記事をまとめました。

はじめに

いきなりですが、皆さん一度はこの画面を見たことがあるのではないでしょうか?

この画面はAWSリソースにアクセスする際に、アクセス権限がない場合や、WAFによってブロックされた場合などに表示されます。
今回は、CloudFront + WAFの構成で発生した403 エラーの実例をご紹介しながら、
原因や対処法について詳しく解説していきます。

何が起きたのか?

今回起きた事象をまとめると以下の通りです。

  • CloudFront + WAFを経由して、Amazon S3(静的ウェブホスティング)に配置したアプリにアクセスしようとしたところ、403 エラーが発生
  • WAFはデフォルトで全てのアクセスをブロックし、指定したIPアドレスのみを許可する
  • 自宅ネットワークからのみ、WAFでIPを許可していてもアクセス不可(403 エラー)
  • 他のネットワーク(職場やチームメンバー)は問題なく接続できた
  • WAFのルールを「すべてのIPを許可」に変更すると、自宅からも正常にアクセスできた

一番困ったのは、検索しても同じ状況を扱っている記事を見つけることが難しかったことです。
他の環境では問題が無いことや、WAFを正常に設定している(と思っている)ことが、調査を難航させました。

原因

原因は、WAFで許可していたIPアドレスがIPv4のみだったことでした。

調査する中で、私の自宅のネットワーク環境が、IPv4とIPv6の両方を持つ「デュアルスタック」であることが分かりました。
この場合、CloudFrontへの接続時はIPv6が優先されるため、WAFの許可リストにIPv6アドレスを追加する必要がありました。

以下詳しく解説していきます。

IPv4とIPv6

まず、IPとは「Internet Protocol(インターネット・プロトコル)」の略で、「v4」や「v6」はそのバージョンを表しています。
近年のインターネットの爆発的な普及により、IPv4のアドレス数が不足する問題が顕在化しました。
この問題を解決するために、新たに設計されたのがIPv6です。

以下の表のとおり、IPv4とIPv6ではアドレスの形式や、割り当て可能なIPアドレス数が大きく異なります。

IPアドレスの規格 IPアドレスの例 IPアドレスの個数
IPv4 172.0.0.1 約43億
IPv6 2001:0db8:0000:0042:0000:8a2e:0370:7334 約340澗(かん)

※1澗 = 10の36乗
参考: IPv4・IPv6の違いは?

ちなみにIPv4のアドレスの個数は「バケツ1個分の砂粒の数」、IPv6アドレスの個数は地球1個分の砂粒の数に相当するそうです。

デュアルスタックとは

IPv4やIPv6はそれぞれ単体で完結する機能で、「プロトコルスタック」と呼ばれます。
そしてデュアルスタックとは、これら2つのプロトコルスタック(IPv4とIPv6)を同時に利用できる状態を指します。

IPv4とIPv6、どちらが優先されるのか?

RFC 6724(複数のアドレス形式がある環境で、どのアドレスを優先的に使用するかを定めた公式仕様)によると、デフォルトではIPv6がIPv4より優先されるようになっています。
この優先順位を変更しない限り、基本的にはIPv6で通信が行われます。

どうやってIPv6で接続されていると気づいたのか?

当時はそもそもIPv6の存在すら意識しておらず、エラーの原因特定にはかなり苦戦しました。転機となったのは、CloudWatch Logsの活用です。
開発中は特に使用していなかったのですが、エラー対応のためにログ出力を設定し、CloudWatch Logsで実際のリクエスト内容を確認したところ、原因特定の手がかりが得られました。
ログの中にあるc-ip(クライアント=リクエスト元のIPアドレス)を確認してみると、
そこに表示されていたのは、普段見慣れているIPv4形式ではなく、見慣れない形式のアドレスでした。
これがIPv6アドレスだったことに気づいたことが、問題解決の大きなヒントになりました。


リクエスト送信時の、CloudWatchログ

解決法

WAFに適用するIP setを作成する際は、IP versionでIPv6を選択し、許可したいIPv6アドレスをIP addressesに登録します。

作成したIP setをWAFに適用することで、無事自宅のネットワークからアクセスが可能になりました。

AWSのIPv6対応状況

本記事では、WAFがIPv6に対応していることをご紹介してきました。
AWSにはWAF以外にもIPv6をサポートしているサービスが多数存在しますので、ここではその一部をピックアップしてご紹介します。

以下は、代表的なAWSサービスにおけるIPv6の対応状況をまとめたものです(2025年4月時点)。

サービス名 デュアルスタックサポート IPv6のみサポート
API Gateway ⭕️ はい ❌ いいえ
Amazon CloudFront ⭕️ はい ❌ いいえ
AWS Lambda ⭕️ はい ❌ いいえ
Amazon S3 ⭕️ はい ❌ いいえ
Amazon EC2 ⭕️ はい ⭕️ はい
Amazon VPC ⭕️ はい ⭕️ はい
AWS WAF ⭕️ はい ⭕️ はい

IPv6のみサポートとは、IPv6だけを使う構成(IPv4を無効化)も可能という意味です。
今回ご紹介したWAFを例に挙げると、IP setにIPv6アドレスのみを登録して運用することで、IPv6のみのアクセスを許可する構成が可能になります。

IPアドレス確認ツールの紹介

ifconfig.io

現在のグローバルIPアドレスや接続元の国、言語、HTTPメソッドなどの情報をシンプルな表形式で表示してくれるツールです。
ブラウザからアクセスするだけで確認できますが、コマンドラインからも利用できます。たとえば以下のように、curlコマンドで実行すると、IPアドレスを取得できます。

$ curl ifconfig.io
2001:db8:a0b:12f0::1/128

IPv6環境で接続している場合は上記のようにIPv6アドレスが表示されます。
IPv4アドレスを明示的に取得したい場合は、-4オプションをつけて実行します。

$ curl ifconfig.io -4
10.0.0.0

https://ifconfig.io/

WhatIsMyIP.com

IPv4・IPv6両方の表示に対応しており、現在の接続IPの種類がひと目で分かります。
さらに、使用しているプロバイダー(ISP)やおおまかなロケーション情報も確認できます。
https://www.whatismyip.com/

CMAN

DNSチェックやPINGチェックなど多機能なネットワークツールが提供されています。ただしIPv6非対応のため、IPv6接続環境でもIPv6アドレスの確認はできず、IPv4のみが表示される点には注意が必要です。
https://www.cman.jp/network/support/go_access.cgi

比較

ツール名 特徴 IPv6表示 CLI対応
ifconfig.io シンプル/開発者向け ⭕️ ⭕️ curlで確認可
WhatIsMyIP.com 情報多め/見やすいUI ⭕️ ❌(GUIのみ)
CMAN 多機能/日本語UI/IPv4のみ

まとめ

本記事では、WAF + CloudFrontの構成において、IPv6が原因で403 エラーが発生した事例をご紹介しました。
最近ではAWSでもIPv6対応が進み、スマートフォンなどの端末もすべてIPv6に対応してきています。
そのため、今後はシステムの設計や運用の際に、「IPv6を前提とした構成」や「IPv6特有の挙動」も意識することがますます重要になってくると感じました。
同じようなトラブルで困っている方のヒントになれば幸いです。

参考

Discussion