for Startups Tech blog

このブログのデザインを刷新しました。(2023/12/26)

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

こんにちは、エンジニアの田畑です。今回は、AWS WAF & Shiled(以下「WAF」)とAmazon CloudFront(以下「CloudFront」)の構成で発生した、403エラーの事例についてご紹介します。

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

はじめに

AWSを触っていると、突然このような画面に出会ったことはありませんか? AWS403エラーの画像

この画面は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アドレスを追加する必要がありました。

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

IPv4IPv6

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

以下の表のとおり、IPv4IPv6ではアドレスの形式や、割り当て可能な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個分の砂粒の数に相当するそうです。

デュアルスタックとは

デュアルスタックとは、IPv4IPv6の両方を同時に利用できる状態を指します。これにより、IPv4しか対応していない機器とも、IPv6に対応した最新の環境とも通信が可能になります。

IPv4IPv6はどちらが優先されるのか?

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

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

結論CloudWatch Logsを活用し、ログを追うことで解決しました。

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

当時はそもそもIPv6の存在すら意識しておらず、エラーの原因特定にはかなり苦戦しました。転機となったのは、CloudWatch Logsの活用です。

開発中は特に使用していなかったのですが、エラー対応のためにログ出力を設定し、CloudWatch Logsで実際のリクエスト内容を確認したところ、原因特定の手がかりが得られました。ログの中にあるc-ip(クライアント=リクエスト元のIPアドレス)を確認してみると、そこに表示されていたのは、普段見慣れているIPv4形式ではなく、見慣れない形式のアドレスでした。

このIPアドレスIPv6だったことに気づいたことが、問題解決の大きなヒントになりました。

解決法

Web ACLに適用するIP setを作成する際は、IP versionIPv6を選択し、許可したいIPv6アドレスをIP addressesに登録します。 IP set作成画面

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

AWSIPv6対応状況

本記事では、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

IPv4IPv6両方の表示に対応しており、現在の接続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特有の挙動」も意識することがますます重要になってくると感じました。同じようなトラブルで困っている方のヒントになれば幸いです。

参考