AWS で IPv6 を使う

こんにちは。masm11 です。

IP アドレスが枯渇したと何度も言われているにもかかわらず、IPv6 はなかなか広まりませんね。今回は AWS で IPv6 の設定をしてみたので、設定の手順について説明したいと思います。

前提としては、AWS アカウントがあって、VPC に既に EC2 インスタンスが存在し、IPv4 でアクセスできるものとします。ゴールとしては IPv6 で HTTP アクセスできるところを目指します。

IPv6 について復習

その前に、まずは IPv6 について復習しておきましょう。

  • IPv6 には NAT がない

    f:id:masm11:20191216211545p:plain

    IPv4 の時は、EC2 の手前にポートフォワーディングするものがあって、クライアントはそこのグローバルアドレスに接続し、その接続が EC2 のプライベートアドレスに転送されていました。

    一方、IPv6 には NAT はありません。従って、EC2 にグローバルアドレスを割り当て、クライアントはそのグローバルアドレスに接続することになります。

  • IP アドレスの表記方法が異なる

    まずは IPv4 の場合を見てみます。

    f:id:masm11:20191216211857p:plain

    192.168.123.234 という表記をして、192.168 の部分をネットワーク部分、123 をサブネット部分、234 をホスト部分と言ったりします。どこで区切るかは、割り当てる人が決めます。

    また、ネットワーク部分のみを指して 192.168.0.0/16、サブネット部分まで含めて 192.168.123.0/24 と表記します。

    そして全体で 32ビットです。

    次に IPv6 の場合を見てみます。

    f:id:masm11:20191216212151p:plain

    IPv6 は 128ビットあります。16進数表記で4桁ごとに : で区切っています。

    IPv4 の場合と同じように、先頭からネットワーク部分、サブネット部分、ホスト部分に分かれています。

    また、ネットワーク部分を指して 1234:5678:9abc:de00::/56、サブネット部分まで含めて 1234:5678:9abc:def0::/64 などと表記します。

AWS に設定する

では復習はこのくらいにして、実際に AWS に設定していきましょう。

VPC に IPv6 CIDR を割り当てる

まずは VPC に設定します。

設定したい VPC を選択します。

f:id:masm11:20191216212748p:plain

メニューから「CIDR の編集」を選択します。

f:id:masm11:20191216212907p:plain

以下のような画面になりますので、「IPv6 CIDR の追加」ボタンをクリックします。

f:id:masm11:20191216212953p:plain

これだけで、VPC に IPv6 CIDR が割り当てられました。

f:id:masm11:20191216213153p:plain

ここで割り当てられたのは、/56 ですから、以下の赤枠で囲った部分ですね。

f:id:masm11:20191216213237p:plain

VPC ダッシュボードに戻ると、以下のように反映されています。

f:id:masm11:20191216213338p:plain

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

次に、サブネットに設定します。

まずサブネットを一つ選択します。

f:id:masm11:20191216213508p:plain

メニューから「IPv6 CIDR の編集」を選択します。

f:id:masm11:20191216213540p:plain

「IPv6 CIDR の追加」をクリックします。

f:id:masm11:20191216213614p:plain

以下のような画面になりますので、サブネット部分の2桁を入力します。

f:id:masm11:20191216213738p:plain

この作業を VPC 内の各サブネットについて行います。その結果は以下の通りです。

f:id:masm11:20191216213853p:plain

サブネット部分をそれぞれ 02, 01, 00 と設定しています。

ルートテーブルを設定する

次にルートテーブルを設定します。

まずルートテーブルを選択します。

f:id:masm11:20191216214109p:plain

メニューから「ルートの編集」を選択します。

f:id:masm11:20191216214220p:plain

以下のように、デフォルトゲートウェイをインターネットゲートウェイに向けます。デフォルトゲートウェイは、IPv4 では 0.0.0.0/0 でしたね。IPv6 では ::/0 となります。インターネットゲートウェイはたぶん一つしかないと思いますので、それを選択しておけば大丈夫です。

f:id:masm11:20191216214256p:plain

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

いよいよ EC2 インスタンスに IPv6 アドレスを割り当てます。

まずは、その EC2 インスタンスが IPv6 に対応しているかどうかを確認します。

EC2 インスタンスを作る際に以下のような画面がありました。 ここに「IPv6 サポート」という列があり、ここに「はい」と表示されているかどうかを確認します。

f:id:masm11:20191216214735p:plain

なのですが、実は現行のインスタンスタイプなら全て対応しているそうです。旧世代のタイプを使っている場合は要確認です。

次に、EC2 ダッシュボードで EC2 インスタンスを選択します。IPv6 IP の欄はまだ空欄ですね。

f:id:masm11:20191216215052p:plain

メニューから「IP アドレスの管理」を選択します。

f:id:masm11:20191216215156p:plain

IPv6 の方の「新しい IP の割り当て」をクリックします。

f:id:masm11:20191216215311p:plain

以下のように、IPv6 アドレスを入力する欄が現れますが、ここは空欄のまま、「更新する」ボタンをクリックします。

f:id:masm11:20191216215416p:plain

すると、以下のように IPv6 アドレスが自動で決まります。

f:id:masm11:20191216215525p:plain

EC2 ダッシュボードに戻ると、IPv6 IP 欄に IPv6 アドレスが表示されました。

f:id:masm11:20191216215620p:plain

しかし、この時点ではまだ OS には反映されていません。 OS に反映させる方法なら何でも良いのですが、ここでは簡単に EC2 インスタンスを再起動します。

f:id:masm11:20191216215828p:plain

端末から IPv4 で ssh して、ip a コマンドを実行すると、IPv6 アドレスが表示されました。OS が認識したことが確認できました。

f:id:masm11:20191216215850p:plain

セキュリティグループを設定する

...そろそろ飽きてきました? これで AWS 的には最後です。頑張りましょう。 セキュリティグループを設定します。

まずセキュリティグループを選択します。

f:id:masm11:20191216220316p:plain

メニューから「インバウンドのルールの編集」を選択します。

f:id:masm11:20191216220347p:plain

SSH をどこからでも接続できるようにします。IPv4 の時は 0.0.0.0/0 でしたね。IPv6 では ::/0 です。 HTTP でも接続したいので、HTTP も同様に設定します。

f:id:masm11:20191216220424p:plain

IPv6 疎通確認

では、ここまでできたので、疎通確認してみましょう。

ssh で IPv6 アドレスを指定してログインしてみます。

f:id:masm11:20191216220817p:plain

接続できました!

DNS を設定する

あとは、ブラウザからアクセスできるようにしましょう。DNS です。

今回は Route53 でなく ConoHa の DNS を使いました。 ConoHa のコントロールパネルは以下のような感じです。

f:id:masm11:20191216221146p:plain

IPv4 の場合、レコードの種類は A でした。IPv6 では AAAA です。A が4文字なのは、IPv4 アドレスは 32ビット、IPv6 アドレスは 128ビットで4倍あることに由来しているそうです。

ホスト名は aws としました。そして TTL、IPv6 アドレスを設定します。

ブラウザからアクセスする

ここで、nginx をインストールして起動する作業が入りますが、内容は省略します。必要でしたら Qiita の記事などを参考にしてみてください。

では、ブラウザからアクセスしてみます。

f:id:masm11:20191216221753p:plain

表示されました!

端末で /var/log/nginx/access.log を確認したところ、 以下のようにアクセス元が IPv6 アドレスになっています。 これで、IPv6 で HTTP アクセスできたことが確認できました。

f:id:masm11:20191216222308p:plain

まとめ

以上、AWS の IPv6 設定について見てきました。いかがだったでしょうか。項目が多かったですね。しかし、毎回この手順が全部必要なわけではなく、VPC やサブネットは一度設定してしまえばいいので、あとは EC2 の設定以降だけで済みます。

社内でこの記事の説明をした後、どこが IPv6 に対応しているか調べていましたが、なんと少ないこと。今対応すれば、まだまだ IPv6 先駆者を名乗れそうに思いました。この記事がお役に立てればと思います。

ではまた!