はじめに
AWS で Public IPv4 アドレスの有料化が発表され、AWS で IPv6 を利用することが注目されているように感じています。一方、既存の IPv4 の VPC 構成を、IPv6 に変更が出来るのか気になります。結論から書くと、既存の IPv4 の VPC 構成に、後から IPv6 を有効化することは可能です。この記事では手順を確認していきます。
なお、この記事は VPC や Subnet, Internet Gateway, Egress-only Gateway, Route Table の設定や、それに伴う EC2 インスタンスの動作確認に主眼を置いています。実際に IPv6 化を進める際に、ELB や CloudFront, Transit Gateway, VPN など関連するネットワークサービスも考慮が必要です。
ネットワークサービスに関する IPv6 の情報は、次の AWS Blog がとてもわかりやすいのでお勧めです。ぜひ一読ください。
構成図
今回は、既存の IPv4 の VPC に対して、後から IPv6 を付与する手順を確認してきます。この手順の最終構成このようなネットワーク構成を目指していきます。
IPv4 を持つ EC2 インスタンスを作る (IPv6 なし)
まず、IPv4 だけの VPC と Subnet, EC2 インスタンスを構成します。IPv6 は無効化のままです。
2 つの EC2 インスタンスを Public Subnet に作りました。
Amazon Linux のインターフェースです。IPv6 はありません。
[ec2-user@ip-10-4-7-67 ~]$ ip -d a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 minmtu 0 maxmtu 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:c7:51:ee:79:df brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
altname eni-0a669e62d4a866cc7
altname device-number-0
inet 10.4.7.67/20 metric 512 brd 10.4.15.255 scope global dynamic enX0
valid_lft 3077sec preferred_lft 3077sec
inet6 fe80::4c7:51ff:feee:79df/64 scope link
valid_lft forever preferred_lft forever
Amazon Linux の Routing 情報
[ec2-user@ip-10-4-7-67 ~]$ ip r
default via 10.4.0.1 dev enX0 proto dhcp src 10.4.7.67 metric 512
10.4.0.0/20 dev enX0 proto kernel scope link src 10.4.7.67 metric 512
10.4.0.1 dev enX0 proto dhcp scope link src 10.4.7.67 metric 512
10.4.0.2 dev enX0 proto dhcp scope link src 10.4.7.67 metric 512
Windows のインターフェースです。IPv6 はありません。
C:\Users\Administrator>ipconfig /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : EC2AMAZ-4LHT491
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : us-east-1.ec2-utilities.amazonaws.com
ap-northeast-1.ec2-utilities.amazonaws.com
ap-northeast-1.compute.internal
Ethernet adapter Ethernet 3:
Connection-specific DNS Suffix . : ap-northeast-1.compute.internal
Description . . . . . . . . . . . : Amazon Elastic Network Adapter
Physical Address. . . . . . . . . : 06-B2-9B-E8-79-83
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::fadd:40b:ff6a:ce5b%6(Preferred)
IPv4 Address. . . . . . . . . . . : 10.4.9.195(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Lease Obtained. . . . . . . . . . : Wednesday, September 6, 2023 9:49:53 AM
Lease Expires . . . . . . . . . . : Thursday, September 7, 2023 4:49:54 AM
Default Gateway . . . . . . . . . : 10.4.0.1
DHCP Server . . . . . . . . . . . : 10.4.0.1
DHCPv6 IAID . . . . . . . . . . . : 134613603
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2C-89-FD-60-12-34-9A-BE-A5-E7
DNS Servers . . . . . . . . . . . : 10.4.0.2
NetBIOS over Tcpip. . . . . . . . : Enabled
Windows Routing
C:\Users\Administrator>route PRINT
===========================================================================
Interface List
6...06 b2 9b e8 79 83 ......Amazon Elastic Network Adapter
1...........................Software Loopback Interface 1
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.4.0.1 10.4.9.195 15
10.4.0.0 255.255.240.0 On-link 10.4.9.195 271
10.4.9.195 255.255.255.255 On-link 10.4.9.195 271
10.4.15.255 255.255.255.255 On-link 10.4.9.195 271
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
169.254.169.123 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.249 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.250 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.251 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.253 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.254 255.255.255.255 10.4.0.1 10.4.9.195 30
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 10.4.9.195 271
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 10.4.9.195 271
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 331 ::1/128 On-link
6 271 fe80::/64 On-link
6 271 fe80::fadd:40b:ff6a:ce5b/128
On-link
1 331 ff00::/8 On-link
6 271 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
VPC や Subnet で IPv6 を有効化
次に、VPC と Subnet で IPv6 アドレスを有効化します。既存 IPv4 のみの VPC や Subnet に後から追加が可能です。なお、VPC と Subnet に追加しただけでは EC2 インスタンスそのものに IPv6 はまだ付与されないです。
VPC を選択して、Edit CIDRs を選びます。
Add new IPv6 CIDR を選択することで、VPC に IPv6 の追加ができます。
Amazon-provided IPv6 CIDR block を指定します。
すると、VPC に /56 の CIDR が自動的に割り当てられます。VPC に割り当てるものは、インターネット上で一意のアドレスとして利用できる グローバルユニキャストアドレス です。
VPC に付与されました。
次に Subnet を選択して、Edit IPv6 CIDRs を押します。
Add IPv6 CIDR を押します。
VPC で確保された IPv6 CIDR の中から、8 bit 分を指定して Save を押します。
Subnet に IPv6 が指定されました。
Subnet で新規インスタンスに対する IPv6 を有効化
Subnet の設定の中に、新規作成の EC2 インスタンスで自動的に IPv6 アドレスを付与するのかどうかのデフォルト値を設定できます。デフォルト値が変わるだけなので、個別の EC2 インスタンスごとに無効にすることも可能です。基本的には有効でも良いのかなと思います。
チェックを ON にします。
EC2 に IPv6 を有効化
次に、EC2 インスタンス単位で IPv6 を有効化していきます。この手順を実施すると、対象の EC2 インスタンスで IPv6 を認識できるようになり、通信状況に影響が発生する場合があります。本番環境では、より慎重に作業を進めましょう。(この記事の順番ではないですが、EC2 インスタンスの IPv6 有効化よりまえに Internet Gateway などの Route Table の更新を実施しておくとよいでしょう)
対象の EC2 インスタンスを選択して、Manage IP addresses を選択します。
IPv6 で Assing new IP address を選択します。
Confirm を押します。
EC2 インスタンスに IPv6 アドレスが付与されました。
Amazon Linux 2023 のインターフェースを見てみましょう。Interface enX0 に、IPv6 アドレス 2406:da14:f9:f100:89b0:6140:148:e9d0/128
が付与されました。グローバルユニキャストアドレスを持っています。なお、fe80::4c7:51ff:feee:79df/64
はユニークローカルユニキャストアドレスです。
[ec2-user@ip-10-4-7-67 ~]$ ip -d a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 minmtu 0 maxmtu 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:c7:51:ee:79:df brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
altname eni-0a669e62d4a866cc7
altname device-number-0
inet 10.4.7.67/20 metric 512 brd 10.4.15.255 scope global dynamic enX0
valid_lft 3343sec preferred_lft 3343sec
inet6 2406:da14:f9:f100:89b0:6140:148:e9d0/128 scope global dynamic noprefixroute
valid_lft 382sec preferred_lft 72sec
inet6 fe80::4c7:51ff:feee:79df/64 scope link
valid_lft forever preferred_lft forever
IPv6 のルーティングテーブルです。
[ec2-user@ip-10-4-7-67 ~]$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2406:da14:f9:f100::/64 dev enX0 proto ra metric 512 pref medium
fe80::/64 dev enX0 proto kernel metric 256 pref medium
default via fe80::4e5:8ff:fea4:bb41 dev enX0 proto ra metric 512 expires 1794sec pref me
dium
Windows の EC2 インスタンスにも IPv6 を有効化します。
Windows のOS 上でインターフェースを確認すると、2406:da14:f9:f100:51dc:4a90:6623:5428
が付与されています。
C:\Users\Administrator>ipconfig /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : EC2AMAZ-4LHT491
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : us-east-1.ec2-utilities.amazonaws.com
ap-northeast-1.ec2-utilities.amazonaws.com
ap-northeast-1.compute.internal
Ethernet adapter Ethernet 3:
Connection-specific DNS Suffix . : ap-northeast-1.compute.internal
Description . . . . . . . . . . . : Amazon Elastic Network Adapter
Physical Address. . . . . . . . . : 06-B2-9B-E8-79-83
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IPv6 Address. . . . . . . . . . . : 2406:da14:f9:f100:51dc:4a90:6623:5428(Preferred)
Lease Obtained. . . . . . . . . . : Friday, September 8, 2023 2:11:08 PM
Lease Expires . . . . . . . . . . : Friday, September 8, 2023 2:18:38 PM
Link-local IPv6 Address . . . . . : fe80::fadd:40b:ff6a:ce5b%6(Preferred)
IPv4 Address. . . . . . . . . . . : 10.4.9.195(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Lease Obtained. . . . . . . . . . : Wednesday, September 6, 2023 9:49:53 AM
Lease Expires . . . . . . . . . . : Friday, September 8, 2023 2:49:54 PM
Default Gateway . . . . . . . . . : fe80::4e5:8ff:fea4:bb41%6
10.4.0.1
DHCP Server . . . . . . . . . . . : 10.4.0.1
DHCPv6 IAID . . . . . . . . . . . : 134613603
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2C-89-FD-60-12-34-9A-BE-A5-E7
DNS Servers . . . . . . . . . . . : 10.4.0.2
NetBIOS over Tcpip. . . . . . . . : Enabled
ルーティング情報です。IPv6 用のものが確認できます。
C:\Users\Administrator>route PRINT
===========================================================================
Interface List
6...06 b2 9b e8 79 83 ......Amazon Elastic Network Adapter
1...........................Software Loopback Interface 1
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.4.0.1 10.4.9.195 15
10.4.0.0 255.255.240.0 On-link 10.4.9.195 271
10.4.9.195 255.255.255.255 On-link 10.4.9.195 271
10.4.15.255 255.255.255.255 On-link 10.4.9.195 271
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
169.254.169.123 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.249 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.250 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.251 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.253 255.255.255.255 10.4.0.1 10.4.9.195 30
169.254.169.254 255.255.255.255 10.4.0.1 10.4.9.195 30
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 10.4.9.195 271
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 10.4.9.195 271
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
6 271 ::/0 fe80::4e5:8ff:fea4:bb41
1 331 ::1/128 On-link
6 271 2406:da14:f9:f100::/64 On-link
6 271 2406:da14:f9:f100:51dc:4a90:6623:5428/128
On-link
6 271 fe80::/64 On-link
6 271 fe80::fadd:40b:ff6a:ce5b/128
On-link
1 331 ff00::/8 On-link
6 271 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
EC2 の通信確認 (IPv6 + No Gateway)
この時点で、EC2 インスタンスからインターネット向けの通信を確認してみましょう。まず、curl で IPv6 の通信を強制するために -6
オプションを付けます。
まだ Route Table で IPv6 の通信を Internet Gateway に向けていないので、想定通り通信ができません。
[ec2-user@ip-10-4-7-67 ~]$ curl www.google.co.jp -6 -v
* Trying [2404:6800:4004:80f::2003]:80...
-6
オプションを外してみると、curl コマンドの場合はまず初めに IPv6 で通信を試みて、だめだったので IPv4 で通信をしてくれました。
[ec2-user@ip-10-4-7-67 ~]$ curl www.google.co.jp -v
* Trying [2404:6800:4004:80f::2003]:80...
* Trying 216.58.220.99:80...
* Connected to www.google.co.jp (216.58.220.99) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.co.jp
> User-Agent: curl/8.0.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 09 Sep 2023 13:10:31 GMT
< Expires: -1
< Cache-Control: private, max-age=0
一方 wget コマンドの場合は、IPv6 の通信をずっと試みています。アプリケーション側の実装によって、通信の可否が変わるのが理解できます。
[ec2-user@ip-10-4-7-67 ~]$ wget www.google.co.jp -v
--2023-09-09 13:14:43-- http://www.google.co.jp/
Resolving www.google.co.jp (www.google.co.jp)... 2404:6800:4004:827::2003, 142.251.222.3
Connecting to www.google.co.jp (www.google.co.jp)|2404:6800:4004:827::2003|:80...
Route Table で IPv6 用に Internet Gateway を紐づける
IPv6 で通信を許可させるため、Route Table で Internet Gateway を紐づけます。この作業を実施すると、EC2 インスタンスに付与している IPv6 アドレスは、いわゆる Public IP 扱いになります。VPC からインターネット側へ通信が出来る用になりますし、逆方向のインターネット側から EC2 インスタンスへ通信ができる IP アドレスです。
Route テーブルを変更します。
::/0
を Internet Gateway に向けます。これによりインターネットに接続します。
EC2 の通信確認 (IPv6 + Internet Gateway)
Internet Gateway を設定したため、IPv6 を使った通信ができるようになりました!
[ec2-user@ip-10-4-7-67 ~]$ curl www.google.co.jp -6 -v
* Trying [2404:6800:4004:827::2003]:80...
* Connected to www.google.co.jp (2404:6800:4004:827::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.co.jp
> User-Agent: curl/8.0.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 09 Sep 2023 13:34:34 GMT
< Expires: -1
< Cache-Control: private, max-age=0
なお、Internet 側から EC2 インスタンスに紐づいている IPv6 アドレスにもアクセスができました。Public IP として動いています。
Ping の例
[ec2-user@ip-10-0-15-36 ~]$ ping 2406:da14:f9:f100:89b0:6140:148:e9d0
PING 2406:da14:f9:f100:89b0:6140:148:e9d0(2406:da14:f9:f100:89b0:6140:148:e9d0) 56 data bytes
64 bytes from 2406:da14:f9:f100:89b0:6140:148:e9d0: icmp_seq=1 ttl=63 time=0.478 ms
64 bytes from 2406:da14:f9:f100:89b:6140:148:e9d0: icmp_seq=2 ttl=63 time=0.490 ms
64 bytes from 2406:da14:f9:f100:89b0:6140:148:e9d0: icmp_seq=3 ttl=63 time=0.525 ms
SSH の例
[ec2-user@ip-10-0-15-36 ~]$ ssh ec2-user@2406:da14:f9:f100:89b0:6140:148:e9d0
A newer release of "Amazon Linux" is available.
Version 2023.1.20230906:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Sat Sep 9 13:58:29 2023 from 2406:da14:39b:2c00:c909:5c8c:c312:7bcd
[ec2-user@ip-10-4-7-67 ~]$
[ec2-user@ip-10-4-7-67 ~]$
Route Table で IPv6 用に Egress-only Internet Gateway を紐づける
ここまでで、Public Subnet に対して IPv6 アドレスを有効化する手順を確認しました。では、Private Subnet で従来のような NAT Gateway のようにアウトバウンドだけ許可させて、インバウンドを禁止する方法はどのように実施するのでしょうか。IPv6 専用のゲートウェイとして、Egress-only Internet Gateway があります。これを利用することで、VPC の中からインターネットへの通信だけを許可できます。NAT Gateway とは異なり、IPv4 Public IP を持たないですし、時間課金もないのでコスト最適化のメリットもあります。
設定手順を確認しましょう。手順としては以下の 2 ポイントは省略します。
- 新たに IPv6 Private Subnet を作成
- IPv6 を持つ EC2 インスタンスを作成
次のように IPv6 を持つ EC2 インスタンスを Private Subnet に作成しました。
この段階では、IPv6 を使ってインターネットへ通信することができません。
[ec2-user@ip-10-4-132-174 ~]$ curl www.google.co.jp -v
* processing: www.google.co.jp
* Trying [2404:6800:4004:826::2003]:80...
* Trying 172.217.26.227:80...
* Connected to www.google.co.jp (172.217.26.227) port 80
> GET / HTTP/1.1
> Host: www.google.co.jp
> User-Agent: curl/8.2.1
まず、Egress-only Internet Gateway を作成しましょう。
適当に名前を付与します。
Egress-only Internet Gateway を作成できました。
Route Table を編集します。
インターネットの通信 (::/0
) を Egress-only Internet Gateway に向けます。
この設定で通信できました!
[ec2-user@ip-10-4-132-174 ~]$ curl www.google.co.jp -v
* processing: www.google.co.jp
* Trying [2404:6800:4004:801::2003]:80...
* Connected to www.google.co.jp (2404:6800:4004:801::2003) port 80
> GET / HTTP/1.1
> Host: www.google.co.jp
なお、この時に送信元 IP アドレスがどうなるか確認しました。結論としては、EC2 インスタンスに付与されている IPv6 アドレスが、Source IP となります。NAT Gateway のように NAT はされないので、動作の違いを覚えておくと良さそうです。
[ec2-user@ip-10-4-132-174 ~]$ curl https://domains.google.com/checkip
2406:da14:f9:f101:2300:2f4f:8474:a402
余談 : Security Group を確認
余談ですが、Security Group については何も意識しなくとも、IPv6 のアウトバウンド通信が許可されていました。
検証を通じてわかったこと
-
VPC や Subnet に対して後から IPv6 を追加することが可能。
-
VPC には、/56 の IPv6 CIDR 付与し、Subnet には /64 の IPv6 CIDR を付与する。この CIDR は固定となる。
-
/64 の IPv6 サブネットは、IP アドレスの枯渇に関しては考慮しても良いと思う。1 個の Subnet に 約 1800 京 (億の上) の IPv6 アドレスを保有できる。
-
既存のEC2 インスタンスに IPv6 を有効化する時に、すべての EC2 インスタンスを一括で有効化はできない。一つずつ有効化の作業が必要。AWS CLI などで自動化を検討してもいいかもしれない。
-
EC2 インスタンスに付与される IPv6 アドレスはグローバルユニキャストアドレスとなるが、従来の IPv4 のように意識して設定しない限りインターネットから直接アクセスが出来ないようになっている。
-
いわゆる、従来の IPv4 の Public Subnet のように構成したいときは、Internet Gateway を利用する。
-
対して、Private Subnet のように構成したいときは、Egress-only Internet Gateway を利用する。
-
Egress-only Internet Gateway を利用して、VPC からインターネット側へ通信を行った際の送信元 IP アドレスは、EC2 インスタンスが持っている IPv6 アドレスになる。IPv4 の NAT Gateway のように、NAT されるわけではない。
参考リソース