AWS WAF v2 での IPv6 アドレスからの接続の制御で少し手こずった話

2021.06.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

今回は、AWS WAF v2でのIPv6アドレスからの接続の制御で少し手こずった話です。

発端

ウェブアプリへ接続できるIPアドレスをAWS WAF v2のIP Set Ruleで制限している開発環境で、ある時PJに新規参画したユーザーから「開発環境のウェブアプリにアクセスしたら真っ白になる」と連絡がありました。そこでコンソールからアプリのCloudFrontに適用されているWeb ACLのサンプルログを見るとIPv6アドレスがブロックされていました。

この環境では今までのユーザーは全員IPv4アドレスで接続してきていたためIPv4のIP Setのみ作成していましたが、今回IPv6アドレスのユーザーが初めて現れたため、IPv6用のIP Setを新しく作ることにしました。

手こずり その1(IPv6のIP Setが作れない)

AWS WAF > IP Sets > Create IP set より、ブロックされたIPv6アドレスを登録したIP Setを作成しようとしました。

しかしIP Setの作成が下記のようなエラーとなりました。

どうやら指定したIPアドレスのフォーマットが有効でないようです。

WAFInvalidParameterException: Error reason: The parameter contains formatting that is not valid., field: IP_ADDRESS, parameter: 2405:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64

ドキュメントを確認してみると、IPv6アドレスの指定は短縮記法である必要があるようです。

IPv6 アドレス範囲の 2620:0:2d0:200:0:0:0:0〜2620:0:2d0:200:ffff:ffff:ffff:ffff を指定するには、「2620:0:2d0:200::/64」と入力します。

そこで許可したいアドレスを以下のように短縮して指定し、再度IP Setを作成してみます。

2405:XXXX:XXXX:XXXX::/64

IP Setが無事作成できました。

このIP SetをWeb ACLに適用し、加えて、アプリのバックエンドとなるAPI GatewayのRest APIに適用されているWeb ACLでも同様にIPv6のIP Setを作成して適用しました。そしてユーザーに再度接続を試すよう連絡しました。

手こずり その2(同じユーザーからIPv4とv6の両方で接続が来る)

すると同ユーザーから次は「ウェブアプリを開けたけど次はデータが何も表示されない」という連絡がありました。

Rest APIに適用されているWeb ACLのサンプルログを見てみると、こちらではIPv4アドレスからの接続のブロックが記録されていました。

CloudFrontではIPv6だったのに、Rest APIではIPv4のアドレスで接続が来ているという状態です。そこで調べてみると下記のドキュメントが見つかりました。CloudFrontやAWS WAFなどの一部AWSサービスではIPv6をサポートしているとのことです。

一方でAPI GatewayがIPv6対応しているというドキュメントはありませんでした。

そこで以下のような仮説を立てました。

  • ユーザーのNW環境ではIPv6とIPv4のハイブリッドルーターが使われており、接続先のサポートに応じて両者を使い分けている
  • ハイブリッドルータからの接続の場合、CloudFrontはIPv6で接続を受け、Rest APIはIPv4で接続を受ける

ユーザーのIPv4アドレスをRest APIに適用されたWeb ACLのIP Setに追加してみると、そのユーザーからの接続はブロックされなくなり、問題なくウェブアプリを利用できるようになりました。

おわりに

AWS WAF v2でのIPv6アドレスからの接続の制御で少し手こずった話でした。

IPv6アドレスというと今までCCNAなどの資格試験の勉強など机上でしか触れてこなかったため今回少し戸惑いましたが、なんとか対処出来て良かったです。

以上