AWS VPCのIPv6デュアルスタック設計入門|Egress-Only Internet GatewayとEC2のIPv6有効化手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > AWS VPCのIPv6デュアルスタック設計入門|Egress-Only Internet GatewayとEC2のIPv6有効化手順
VPCにIPv6を設定したいのに「Egress-Only Internet GatewayとInternet Gatewayの使い分けがわからない」「セキュリティグループのIPv4ルールを設定したのにIPv6で通信できない」——AWSでIPv6デュアルスタック設計を試みるとこの2つの壁に当たります。

AWSのVPCは2016年以降、グローバルユニキャストIPv6アドレスの/56ブロックをVPCに無料で割り当てられるようになりました。2024年2月からAWSはパブリックIPv4アドレスの保有に課金(1アドレス月0.005USD)を開始しており、プライベートサブネットからのアウトバウンドをEgress-Only Internet Gateway経由でIPv6化するパターンが実務で増えています。

この記事では、VPCへのIPv6 CIDRブロック付与から始め、パブリック・プライベートの経路設計(IGWとEgress-Only IGW)、EC2インスタンスへのIPv6自動割り当て設定、セキュリティグループのIPv6ルール追加、疎通確認まで、構成設計の実践手順を一通り解説します。

この記事のポイント

・VPCの/56 IPv6 CIDRはAmazon提供の無料ブロック(GUAアドレス)を使う
・パブリックサブネットはIGW、プライベートサブネットはEgress-Only IGWでIPv6経路を分ける
・セキュリティグループのIPv4ルール(0.0.0.0/0)はIPv6に自動適用されない——別途::/0の追加が必須
・EC2へのIPv6自動割り当てはサブネット側でassign-ipv6-address-on-creationを有効化する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜVPCでIPv6対応が求められるのか

IPv4アドレスの枯渇はインフラエンジニアにとって遠い話ではありません。AWSは2024年2月から、使用中のパブリックIPv4アドレスすべてに課金を開始しました(1アドレスあたり月0.005USD。100個保有なら月50USD)。IPv6に移行することでパブリックIPv4の使用本数を削減でき、インフラコストの直接的な削減につながります。

もう一つの背景として、クラウドネイティブ設計ではIPv6専用サブネット(IPv4なし)でEC2を動かす構成もAWSが正式サポートしています。ただし、既存のIPv4資産を抱える環境では段階的な移行が現実的なため、デュアルスタック(IPv4とIPv6を同時に使う構成)が今の実務の主流です。
構成 特徴 典型的なユースケース
IPv4のみ 既存の多くの構成。パブリックIPv4課金の対象 レガシーシステム維持。移行前の状態
デュアルスタック IPv4資産を維持しながらIPv6を追加。段階移行に最適 2024年以降の新規VPC構築・既存VPCのIPv6化
IPv6のみ パブリックIPv4を一切使わない。最大コスト削減 IPv4依存サービスとの接続が不要なコンテナ環境など

AWSのIPv6アーキテクチャ概要|デュアルスタックの仕組み

AWS VPCでIPv6を使うために理解すべきコンポーネントは3つです。

VPCの/56 IPv6 CIDRブロック:AWSが管理するグローバルユニキャストアドレス(GUA)空間から自動割り当てされます。/56は最大256個の/64サブネットを含み、1つのVPCに十分な容量があります。Bring Your Own IPv6(BYOIP)でまたは自社の/56を持ち込むことも可能です。
サブネットの/64 CIDRブロック:各サブネットに/64を割り当てます。IPv6では/64が標準サブネットサイズで、1サブネットに約180京個のアドレスを持てます。
Egress-Only Internet Gateway(EIGW):IPv6専用のアウトバウンドゲートウェイです。プライベートサブネットのEC2がIPv6でインターネットへアクセスできますが、インターネット側からのインバウンドは受け付けません。IPv4でいうNAT Gatewayと同じ役割を担います。

パブリックサブネットとプライベートサブネットで使うゲートウェイが異なる点が、IPv6経路設計の核心です。
サブネット種別 IPv4の経路 IPv6の経路
パブリック Internet Gateway (IGW):双方向 Internet Gateway (IGW):双方向(IPv4と同じIGWを使う)
プライベート NAT Gateway:アウトバウンドのみ Egress-Only Internet Gateway:アウトバウンドのみ
重要な違いとして、NAT GatewayはAZ単位で作成が必要(マルチAZなら各AZに1つ)ですが、Egress-Only Internet GatewayはVPC単位で1つ作成すればマルチAZで共有できます。コスト面でも有利です。

VPCにIPv6 CIDRブロックを付与する

1. AWS CLIでAmazon提供のIPv6 CIDRを付与する

VPCのIDを確認してから、associate-vpc-cidr-blockコマンドに--amazon-provided-ipv6-cidr-blockオプションを指定して実行します。

# VPCのIDを確認する aws ec2 describe-vpcs --region ap-northeast-1 --query 'Vpcs[*].{VpcId:VpcId,Cidr:CidrBlock,Name:Tags[?Key==]|[0].Value}' # VPCにAmazon提供のIPv6 CIDRブロックを割り当てる aws ec2 associate-vpc-cidr-block --vpc-id vpc-0abc1234def567890 --amazon-provided-ipv6-cidr-block --region ap-northeast-1

2. 付与されたIPv6 CIDRブロックを確認する

aws ec2 describe-vpcs --vpc-ids vpc-0abc1234def567890 --query 'Vpcs[0].Ipv6CidrBlockAssociationSet' --region ap-northeast-1

実行すると次のような出力が返ります。Ipv6CidrBlockの値(例: 2600:1f14:abcd:ef00::/56)が、以降のサブネット割り当てで必要になります。

[ { "AssociationId": "vpc-cidr-assoc-0a1b2c3d4e5f67890", "Ipv6CidrBlock": "2600:1f14:abcd:ef00::/56", "Ipv6CidrBlockState": { "State": "associated" }, "Ipv6Pool": "Amazon" } ]

State: associatedになっていれば正常に付与されています。associatingのまま数秒変わらない場合はコマンドを再実行してください。

サブネットにIPv6 CIDRを割り当てる

VPCに付与された/56から/64を切り出して各サブネットに割り当てます。3AZ構成でパブリック3サブネット+プライベート3サブネットの計6サブネットを持つ場合、先頭3つ(ef00~ef02)をパブリック用、次の3つ(ef10~ef12)をプライベート用とする命名規則が管理しやすいです。

3. パブリックサブネットにIPv6を割り当てる

# パブリックサブネット(AZ-a)にIPv6 CIDRを割り当てる aws ec2 associate-subnet-cidr-block --subnet-id subnet-0pub1a2b3c4d5e6f7 --ipv6-cidr-block 2600:1f14:abcd:ef00::/64 --region ap-northeast-1 # パブリックサブネット(AZ-c) aws ec2 associate-subnet-cidr-block --subnet-id subnet-0pub8a9b0c1d2e3f4 --ipv6-cidr-block 2600:1f14:abcd:ef01::/64 --region ap-northeast-1 # パブリックサブネット(AZ-d) aws ec2 associate-subnet-cidr-block --subnet-id subnet-0pub5e6f7a8b9c0d1 --ipv6-cidr-block 2600:1f14:abcd:ef02::/64 --region ap-northeast-1

4. プライベートサブネットにIPv6を割り当てる

# プライベートサブネット(AZ-a)にIPv6 CIDRを割り当てる aws ec2 associate-subnet-cidr-block --subnet-id subnet-0prv1a2b3c4d5e6f7 --ipv6-cidr-block 2600:1f14:abcd:ef10::/64 --region ap-northeast-1 # プライベートサブネット(AZ-c) aws ec2 associate-subnet-cidr-block --subnet-id subnet-0prv8a9b0c1d2e3f4 --ipv6-cidr-block 2600:1f14:abcd:ef11::/64 --region ap-northeast-1

Egress-Only Internet GatewayでプライベートIPv6経路を設計する

5. Egress-Only Internet Gatewayを作成する

Egress-Only Internet GatewayはVPCに1つ作成します。IPv4のNAT GatewayがAZをまたげないのに対し、EIGWはVPC内のすべてのAZから利用できます。マルチAZにしても1台で済むためコストも抑えられます。

# Egress-Only Internet Gatewayを作成する aws ec2 create-egress-only-internet-gateway --vpc-id vpc-0abc1234def567890 --region ap-northeast-1 # 作成したEIGWのIDを確認する aws ec2 describe-egress-only-internet-gateways --region ap-northeast-1 --query 'EgressOnlyInternetGateways[*].{Id:EgressOnlyInternetGatewayId,State:Attachments[0].State}'

6. ルートテーブルにIPv6デフォルトルートを追加する

プライベートサブネット用のルートテーブルに::/0のルートを追加し、EIGWへ向けます。パブリックサブネットのルートテーブルはInternet Gateway(IGW)に向けます。

# プライベートサブネットのルートテーブルにEIGW経由のIPv6ルートを追加 aws ec2 create-route --route-table-id rtb-0priv1a2b3c4d5e6f --destination-ipv6-cidr-block ::/0 --egress-only-internet-gateway-id eigw-0a1b2c3d4e5f67890 --region ap-northeast-1 # パブリックサブネットのルートテーブルにIGW経由のIPv6ルートを追加 aws ec2 create-route --route-table-id rtb-0pub1a2b3c4d5e6f --destination-ipv6-cidr-block ::/0 --gateway-id igw-0a1b2c3d4e5f67890 --region ap-northeast-1

ルートテーブルの確認はdescribe-route-tablesでIPv6のルート行(DestinationIpv6CidrBlock::/0の行)が存在するかを確認します。この行がなければプライベートEC2からIPv6でインターネットに出られません。

EC2インスタンスにIPv6アドレスを自動割り当てする

7. サブネットのIPv6自動割り当てを有効化する

新しく起動するEC2にIPv6アドレスを自動で付与するには、サブネット側でassign-ipv6-address-on-creationを有効化します。この設定を忘れると、インスタンス起動後にIPv6アドレスが付いておらず手動で追加する手間が発生します。

# サブネットのIPv6自動割り当てを有効化する aws ec2 modify-subnet-attribute --subnet-id subnet-0pub1a2b3c4d5e6f7 --assign-ipv6-address-on-creation --region ap-northeast-1 # 設定を確認する(trueになっていれば有効) aws ec2 describe-subnets --subnet-ids subnet-0pub1a2b3c4d5e6f7 --query 'Subnets[0].{SubnetId:SubnetId,AutoIPv6:AssignIpv6AddressOnCreation,IPv6Block:Ipv6CidrBlockAssociationSet[0].Ipv6CidrBlock}'

既存のEC2インスタンスにIPv6を後から追加するには、ネットワークインターフェース(ENI)へ直接割り当てます。

# 既存EC2のENIにIPv6アドレスを追加する(インスタンスIDからENI IDを取得) ENI_ID= aws ec2 assign-ipv6-addresses --network-interface-id --ipv6-address-count 1 --region ap-northeast-1

8. EC2上でIPv6アドレスを確認する

EC2にSSH接続してip -6 addrでIPv6アドレスが付いているか確認します。LinuxサーバーにおけるネットワークインターフェースのIPv6設定についてはIPv6 設定の参考も参照してください。

# EC2上でIPv6アドレスを確認する(Amazon Linux 2023) $ ip -6 addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 state UP qlen 1000 inet6 2600:1f14:abcd:ef00:ff4a:b8c:d123:456a/128 scope global dynamic valid_lft 549sec preferred_lft 249sec inet6 fe80::887:b9ff:fe78:a1b2/64 scope link valid_lft forever preferred_lft forever # IPv6の疎通確認(Googleのパブリックアドレスへping6) $ ping6 -c 3 2404:6800:4004:819::200e PING 2404:6800:4004:819::200e(2404:6800:4004:819::200e) 56 data bytes 64 bytes from 2404:6800:4004:819::200e: icmp_seq=1 ttl=118 time=3.42 ms 64 bytes from 2404:6800:4004:819::200e: icmp_seq=2 ttl=118 time=3.38 ms 64 bytes from 2404:6800:4004:819::200e: icmp_seq=3 ttl=118 time=3.41 ms --- 2404:6800:4004:819::200e ping statistics --- 3 packets transmitted, 3 received, 0% packet loss

scope global dynamicのIPv6アドレスが表示されていれば、VPCからのIPv6が正常に割り当てられています。scope linkのfe80::で始まるアドレスはリンクローカルアドレスで、VPC外には到達できません。

セキュリティグループにIPv6ルールを追加する

IPv6設計で最もはまりやすい落とし穴が、セキュリティグループのルールです。IPv4の許可ルール(0.0.0.0/0)はIPv6(::/0)に自動適用されません。IPv6通信を通すには、同じポートに対して::/0のIPv6ルールを別途追加する必要があります。

インバウンドSSH(TCP 22):IPv4の0.0.0.0/0ルールがあっても、IPv6の::/0ルールがなければIPv6でSSH接続できません
インバウンドHTTPS(TCP 443):同様にIPv6の::/0ルールを追加します
インバウンドICMPv6(プロトコル58)ping6で疎通確認するにはICMPv6ルールが必要です

# SSH(TCP 22)のIPv6インバウンドルールを追加 aws ec2 authorize-security-group-ingress --group-id sg-0a1b2c3d4e5f67890 --ip-permissions '[{"IpProtocol":"tcp","FromPort":22,"ToPort":22,"Ipv6Ranges":[{"CidrIpv6":"::/0"}]}]' --region ap-northeast-1 # HTTPS(TCP 443)のIPv6インバウンドルールを追加 aws ec2 authorize-security-group-ingress --group-id sg-0a1b2c3d4e5f67890 --ip-permissions '[{"IpProtocol":"tcp","FromPort":443,"ToPort":443,"Ipv6Ranges":[{"CidrIpv6":"::/0"}]}]' --region ap-northeast-1 # ICMPv6(ping6に必要。プロトコル58、-1は全タイプを意味する)のインバウンドルールを追加 aws ec2 authorize-security-group-ingress --group-id sg-0a1b2c3d4e5f67890 --ip-permissions '[{"IpProtocol":"58","FromPort":-1,"ToPort":-1,"Ipv6Ranges":[{"CidrIpv6":"::/0"}]}]' --region ap-northeast-1

プライベートサブネットのEC2にはアウトバウンドのIPv6通信も許可します。

# アウトバウンドのIPv6を全許可(プライベートEC2からEIGW経由でインターネットへ) aws ec2 authorize-security-group-egress --group-id sg-0a1b2c3d4e5f67890 --ip-permissions '[{"IpProtocol":"-1","Ipv6Ranges":[{"CidrIpv6":"::/0"}]}]' --region ap-northeast-1

セキュリティグループの設定ミスは原因の特定に時間がかかります。「疎通できない」と感じたら、まずIPv6ルールの有無を確認する習慣をつけましょう。

「IPv6で通信できない」時のトラブルシュート

【確認1】VPCにIPv6 CIDRが付与されているか

aws ec2 describe-vpcs --vpc-ids vpc-0abc1234def567890 --query 'Vpcs[0].Ipv6CidrBlockAssociationSet[0].{Cidr:Ipv6CidrBlock,State:Ipv6CidrBlockState.State}'

State: associatedでなければassociate-vpc-cidr-blockを再実行します。

【確認2】サブネットにIPv6 CIDRが割り当てられており自動割り当てが有効か

aws ec2 describe-subnets --subnet-ids subnet-0pub1a2b3c4d5e6f7 --query 'Subnets[0].{AutoIPv6:AssignIpv6AddressOnCreation,IPv6Block:Ipv6CidrBlockAssociationSet[0].Ipv6CidrBlock}'

【確認3】ルートテーブルにIPv6の::/0ルートが存在するか

aws ec2 describe-route-tables --route-table-ids rtb-0priv1a2b3c4d5e6f --query 'RouteTables[0].Routes[?DestinationIpv6CidrBlock!=null]'

プライベートサブネットのルートテーブルにEgressOnlyInternetGatewayIdが設定された::/0ルートがあることを確認します。

【確認4】セキュリティグループにIPv6ルールがあるか

aws ec2 describe-security-groups --group-ids sg-0a1b2c3d4e5f67890 --query 'SecurityGroups[0].IpPermissions[?Ipv6Ranges[0].CidrIpv6!=null].{Proto:IpProtocol,From:FromPort,IPv6:Ipv6Ranges[0].CidrIpv6}'

期待するポートのIPv6ルールが表示されない場合はauthorize-security-group-ingressでルールを追加します。

【確認5】EC2インスタンスにIPv6アドレスが付与されているか

aws ec2 describe-instances --instance-ids i-0a1b2c3d4e5f67890 --query 'Reservations[0].Instances[0].NetworkInterfaces[0].Ipv6Addresses'

空配列[]が返る場合はIPv6が付与されていません。assign-ipv6-addressesコマンドで手動割り当てするか、サブネットの自動割り当て設定を有効化してインスタンスを再起動します。

本記事のまとめ

VPCのIPv6デュアルスタック設計に必要な作業を一覧にまとめます。
作業 コマンド ポイント
VPCにIPv6 CIDR付与 associate-vpc-cidr-block Amazon提供の/56ブロックが無料で割り当てられる
サブネットにIPv6割り当て associate-subnet-cidr-block 各サブネットに/64を割り当てる。パブリック・プライベートで番号帯を分けると管理しやすい
Egress-Only IGWの作成 create-egress-only-internet-gateway VPCに1つ作成。マルチAZで共有できる(NAT Gatewayと異なる)
ルートテーブルのIPv6ルート追加 create-route(::/0) パブリック→IGW、プライベート→EIGW で経路を分ける
EC2へのIPv6自動割り当て modify-subnet-attribute サブネット側で有効化しておくと起動時に自動付与される
セキュリティグループのIPv6ルール authorize-security-group-ingress IPv4の0.0.0.0/0ルールはIPv6に自動適用されない。::/0を別途追加が必須
IPv6移行はVPCの基盤設計から取り掛かると、EC2・RDS・ALBなど各サービスのIPv6対応が一気に進みます。AWSのLinux基礎からAmazon Linux実践まで体系的に学びたい方は、AWS・Amazon Linux入門ガイドもあわせてご覧ください。マルチAZを含むAWS冗長構成の全体像はAWS冗長構成設計ガイド(上級編)で詳しく解説しています。

VPC設計を「実務の型」として身につけませんか?

IPv6の設定手順は調べれば分かります。でも「デュアルスタックで移行するときに何を先に決めるか」「Egress-Only IGWとNAT Gatewayのコストをどう試算するか」を設計前から語れますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。