はじめに

AWSでVPCを使う際に、パブリックにアクセス可能なEC2インスタンスやELBを作成する構成でインターネットゲートウェイがよく使われます

サクッと作成できて便利なインターネットゲートウェイですが、IPv4とIPv6を使う時で少し挙動が違うような記載が公式ドキュメントに書かれているのをご存知でしょうか?

インターネットゲートウェイは、インターネットルーティング可能なトラフィックの VPC ルートテーブル内のターゲットを提供します。IPv4 を使用した通信の場合、インターネットゲートウェイは、ネットワークアドレス変換 (NAT) も実行します。IPv6 を使用した通信の場合、IPv6 アドレスが公開されているため、NAT は必要ありません。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html

今回はこの記事に中の「IPv6ではNATされない」という記載について、実際に検証して確かめてみました

前提知識の整理

本題に入る前に、IPv6とインターネットゲートウェイに関連する前提知識を整理しておきます

IPv6について

上記のドキュメントでは「IPv6 を使用した通信の場合、IPv6 アドレスが公開されているため、NAT は必要ありません」と書かれています

IPv6でNATが不要というのはAWSに限った話ではなく、IPv6の技術仕様として決まっているものになります

日経クロステックさんの記事がわかりやすかったのでこの記事を参考に説明すると、以下のように理由が説明できます

  • IPv4の場合
    • グローバルアドレスとプライベートアドレスで分けて使用するため、プライベートアドレスを使用する端末がインターネットに出るためにはNATが必要
  • IPv6の場合
    • そもそもIPv6は全てのアドレスがグローバルに一意なものである
    • LAN内の通信でも、IPv4のグローバルアドレスに近い「グローバルユニキャストアドレス」を使用するためインターネットに出ることができる。そのためNATは不要。

そのため、プライベートサブネットに配置したEC2インスタンスに対してインターネットアウトバウンドの経路を提供してあげる場合、NATゲートウェイは不要になります

そもそもですが、IPv6通信でNATゲートウェイを使うとIPv4に変換されてインターネットに抜けていきます

NAT ゲートウェイは IPv4 または IPv6 トラフィックでサポートされます。IPv6 トラフィックの場合、NAT ゲートウェイは NAT64 を実行します。これを DNS64 (Route 53 Resolver で利用可能) と組み合わせて使用することで、Amazon VPC のサブネット内の IPv6 ワークロードが IPv4 リソースと通信できます。これらの IPv4 サービスは、オンプレミス環境またはインターネット上の、同じ VPC (別のサブネット内) または別の VPC に存在することがあります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-basics

ですので、IPv6にままインターネットに抜けて欲しい場合にNATゲートウェイは使用できません

Egress-Only インターネットゲートウェイ

では、IPv6のままインターネットに抜けたい時はどうすればいいのでしょうか?

普通のインターネットゲートウェイはIPv6に対応しているため、パブリックサブネットにEC2インスタンスがある場合は特に何もすることなく、IPv6のままインターネットに抜けることが可能です

問題が起こるのは、プライベートサブネットにEC2インスタンスがある時です

インターネットゲートウェイを使うと、インターネットからのインバウンドもできるようになってしまうのでプライベートサブネットでは無くなってしまいます
かといって、NATゲートウェイを使うとIPv4に変換されてしまうので、IPv6のままインターネットに抜けることはできません

ここで登場するのが「Egress-Only インターネットゲートウェイ」です
名前の通り、IPv6を使ったインターネットアウトバウンド通信のみを許可し、インターネットからはアクセスできないようにする特殊なインターネットゲートウェイです

IPv6 経由での VPC からインターネットへの送信を可能にし、インスタンスとの IPv6 接続が開始されるのを防ぎます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/egress-only-internet-gateway.html

検証した内容

今回の記事では以下のような構成で検証を行いました
また、IPアドレスの確認方法としては、EC2インスタンスが存在するVPCでVPCフローログを取得して確認しています

送信元のEC2はプライベートサブネットに設置し、Egress-Onlyインターネットゲートウェイを使ってIPv6のインターネットアウトバウンドを確保しています

なお、IPアドレスを確認する宛先のインスタンスは普通のインターネットゲートウェイで受ける構成にしています
普通のインターネットゲートウェイはIPv4/IPv6いずれにも対応しているので、IPv4/IPv6の差分による影響を受けることがないと仮設し、普通のインターネットゲートウェイを使っています

もしIPv6でNATが行われなければ、宛先EC2があるVPCでのフローログでは送信元EC2に直接付与されているIPv6アドレスが見えるはずです
NATが行われれば、別のIPアドレスが見えるはずです

検証時の設定と結果

今回使用する送信元EC2インスタンスの設定はこちらです

宛先EC2インスタンスの設定はこちらです

なお、結果が判別しやすいように、画像ではパブリックなIPアドレスの一部だけマスキングしない状態にしてあります

送信先になるEC2で以下のコマンドを実施し

$ ping6 2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:bb58

宛先EC2があるVPCのVPCフローログを確認すると以下のようになっていました

2 xxxxxxxxxxxx eni-xxxxxxxxxxxx 2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:d062 2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:bb58 0 0 58 17 1768 1709627080 1709627199 ACCEPT OK
2 xxxxxxxxxxxx eni-xxxxxxxxxxxx 2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:bb58 2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:d062 0 0 58 17 1768 1709627080 1709627199 ACCEPT OK

送信元/宛先IPアドレスは、いずれもEC2インスタンスが持ってるアドレスになっていることがわかります
つまり、この構成でNATは行われていないということがわかりました

まとめ

「IPv6を使用する時にNATは不要である」という技術仕様を、VPC上で検証してみました

結果、やはりIPv6はNATせずにEC2インスタンスが使うIPアドレスでインターネットに抜けていることがわかりました

なお、一番最初に記載したドキュメントに「IPv4 を使用した通信の場合、インターネットゲートウェイは、ネットワークアドレス変換 (NAT) も実行します」と書かれているのも、具体的にどんな挙動になるのかが気になるところです
こちらの検証も実施できたら、また記事にしようと思います!

この記事が誰かの役に立てば幸いです