AWSでIPv6を使ってみよう

# Introduction
本記事は「[AWS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws)」の20日目の記事になります。

今回はIPv6が利用できるEC2周りを構築をしてみたいと思います。
以前はon-premises環境でIPv6も触っていた事もあり興味がある点、最近ANS(AWS Certified Advanced Networking - Specialty)の受験に向けての学習を始めたのもあり、せっかくなので手元でやってみようと言う回です。

基本的には公式ドキュメント等の情報をベースに記事を書いていますが、最新の情報との相違もあるとは思うので、その点はご容赦ください。
(せっかくなので、そう言うのがあれば、是非コメントを頂ければと思います!)

# AWSでIPv6を使う上での確認事項
## 各サービスでのIPv6対応状況
まず、AWS上でIPv6がサポートされているサービス一覧は以下から確認ができます。
https://docs.aws.amazon.com/general/latest/gr/aws-ipv6-support.html
ほとんどのサービスにおいて、IPv4/IPv6 Dual stackでのサポートはされているようで、IPv6 Onlyについても直接ネットワークに関係のあるサービスはサポートされている様に見えます。Public Endpointsにおいてもよく使われるものについては、サポートはされているように思います。
なお、EC2などでIPv6に対応している・対応していないインスタンスがあるので、作成前に確認が必要です。(対応してない場合はインスタンス作成時にエラーが出ますが)

- 参考
[IPv6 on AWS](https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/IPv6-on-AWS.html)
[Dual Stack and IPv6-only Amazon VPC Reference Architectures](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/IPv6-reference-architectures-for-AWS-and-hybrid-networks-ra.pdf?did=wp_card&trk=wp_card)

## IPv6でのGateway周り
Inbound, OutboundのTrafficを用いる場合は、IPv4と同様にInternet Gatewayを利用して通信が可能です。
また、IPv6は所謂Publicアドレスになっている事もあり、外部からの到達性を絶ちOutboudのみの通信で利用する為の、ステートフルなEgress-only internet gatewayも用意されています。

- 参考
[Egress-Only internet gateway](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/egress-only-internet-gateway.html)
[Internet gateway](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)


## NAT64/DNS64
NAT64/DNS64もAWSでも使うことができます。
簡単に言うところの、IPv6とIPv4を相互に変換してIPv6の環境からIPv4しかない環境へアクセスするための仕組みの一つです。
NAT64/DNS64については、以下の[Biglobe](https://style.biglobe.co.jp/entry/2020/07/29/120000)さんの記事などを参照。

- 参考
[AWS DNS64 と NAT64](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/nat-gateway-nat64-dns64.html)

## Route 53
Route 53はAAAAレコードにも対応していますし、IPv6 Transportもしっかり対応しているみたいで、世の中的にはIPv6関係のPTRは設定無しが良くあることですが、PTRもIPv6向けに設定できるようです。
また、Route 53 resolverにおいても、fd00:ec2::253で到達性があるようです。

:::note warn
もしかするとルーティング等の問題があったのかもしれませんが、fd00:ec2::253についてはIPv6 Onlyのサブネットでのみ動作しているように見えました。Dual stack環境のサブネットの場合IPv4で使われてるDNS resolver宛てのみの様です。
:::

## IPv6全般に関する事
こちらの本が公開/販売されていますので、興味のある方は是非。
[プロフェッショナルIPv6](https://booth.pm/ja/items/913273)

# 実際に触ってみる
IPv6 Transportで通信可能なインスタンスを作成してみます。
今回はus-east-1で作成しています。他のregionでは異なる可能性があります。
## VPCを作成
VPCについてはIPv4/IPv6での割り当てが必要になります。(サブネットはIPv6 Onlyが可能)
また、IPv4/IPv6共にIPAM管理やBYODでのアドレス持ち込みもできるみたいです。
今回は「Amazon 提供の IPv6 CIDR ブロック」を選択して作成していきます。
![ipv6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/e12ad777-97de-e6f9-2e18-42e74b577210.png)

IPv6の割り当てが無事できました! VPCでのアサインは/56でされるようです。
![ipv6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/95677bda-47ab-a500-cc0b-fe74a0c1f99a.png)


## サブネットを作成
サブネットの作成画面です。緑の枠のチェックをつけると作成サブネットがIPv6 Onlyになります。
Dual stackの場合はチェックをつけず、IPv4/IPv6共にサブネットに割り当てるCIDRを振ることになります。
IPv6の場合は全てを手入力ではなく、/64分のブロックを指定して作成していきます。本格的に運用していくのであればブロックアドレッシングはルール化しておきたい所です。
今回はDual stackで作成していきます。
![ipv6-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/2baa714d-eaab-b6d7-52e3-731c809acc56.png)

ルートテーブルの初期はこんな感じです。
![ipv6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/d47ca7ac-daef-9168-7120-bbce624ab7ab.png)
別途今回はInternet gatewayを作成してルートテーブルにルーティングを追加します。
IPv4/IPv6のデフォルトルートを追加した例。
Egress-only internet gatewayを使う場合も::/0をターゲットでEgress-only internet gatewayに向ければ良いです。

:::note warn
今回は後からIPv6のアドレスを公開して検証するのでInternet gatewayを利用していますが、インスタンスからの通信だけで利用したい場合は「Egress-only internet gateway」にしたほうが良いかと思います。
:::
![ipv6-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/d2121282-6fed-b1b5-976a-3df30babb761.png)

## EC2を作成
IPv6が使えるインスタンスを作成してみたいと思います。
最初の方で述べた通り、IPv6が利用できないインスタンスが存在するため、起動前に「インスタンスタイプを比較」から確認されることをおススメします。
![ipv6-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/986a3c39-2246-1026-c10f-edabd63e2863.png)

インスタンスを起動させる際に、IPv6のVPCを選択すると以下の項目が出てきますので、「IPv6 IP を自動で割り当てる」を「有効化」します。
![ipv6-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/70f87b03-245e-8e27-b71d-b7c5a067aef5.png)
「有効化」を選択すると「高度なネットワーク設定」から「ネットワークインターフェース」の項目も触れるようになります。
![ipv6-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/50619f50-160c-090f-4510-cec30ca8d6c2.png)
ちなみに、同じCIDRブロック内なので使うことは無い気もしますが、上記で割り当て数を変更してIPv6を2IPなどつける事もできます。
![ipv6-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/2ef21990-2fe2-6346-76c6-9adbbfdfb421.png)

## 動作確認
さっそく作成したインスタンス上のLinuxコマンドでもアドレスが付いている事は確認できました。
(今回は2IP付与してしまったので、2つのPublicなIPv6がアサインされています。fe80から始まるアドレスはリンクローカルアドレスです。)
![ipv6-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/60d60993-fd8a-4cf4-9263-9920e8848a46.png)

試しにIPv6 TransportでGoogle Public DNSへdigコマンドを使い問い合わせを行ってみたいと思います。
NOERRORかつ「2001:4860:4860::8888」から応答を得られている事が確認できました。 (facebook.comのAAAAの名前解決例)
![ipv6-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/dc45e82d-8aaa-48a8-f775-0f9264d1a25e.png)

またcurlでexampl.comあてに通信をさせて、念のためtcpdumpでサーバの通信先も確認しておきます。
![ipv6-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/1e46e1ac-fc56-0163-2333-b17688f180aa.png)

tcpdumpの結果
![ipv6-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/5fe8407b-b3df-32be-dfca-d79976335fbd.png)

無事通信は出来ていそうです。最近はモバイルや自宅のブロードバンド環境もIPv6に対応していたりするので、IPv6環境が特殊でもない気がしますが、IPv6の環境を用意したい場合も簡単にAWS上で組めますね。
ここまでできればあとはALBやRoute 53周りを追加していけば、Dual stackでWebを組む事も簡単そうです。

また、当然ですが自宅でIPv6のアドレスが割り振られている場合は、サブネットをIPv6 Onlyにしたうえでインスタンスを起動し、IPv6 TransportのみでSSH接続も可能です。
その場合は、IPv4と同様にセキュリティグループで自宅に割り振られてるIPv6を許可してください。
[https://test-ipv6.com/](https://test-ipv6.com/)などを利用すると自宅のIPv6のアドレスを確認する事ができます。


# さいごに
私自身はかつてon-premisesの規模の大きい設備を仕事で触っていた時代に、ほぼIPv6ネイティブなシステムの設計と構築に携わっていた事もありますが、設定も含めて情報も少なく構築のハードルが高めに感じてはいたのですが、AWSのマネージドのサービスを活用しての構築はかなり楽に組み上げができるなとは感じました。
また、ELBやEKSなどもIPv6には対応しているようですし、来年こそはIPv6の世界に足を踏み入れてみては以如何でしょうか?