ping6.net
移行

AWS、Azure、GCPでのIPv6

クラウドインフラストラクチャでIPv6を有効化します。AWS、Azure、Google Cloud Platformの実用的な設定ガイド。

ping6.net2024年12月14日3 min read
IPv6AWSAzureGCPクラウドKubernetes

ほとんどのクラウドワークロードはまだIPv4のみで実行されています。それは問題になりつつあります。

TL;DR - 要点まとめ

重要ポイント:

  • モバイルネットワークはIPv6ファースト:変換を強制するとほとんどのユーザーに遅延を追加
  • クラウドではIPv4アドレスはお金がかかるがIPv6は無料
  • AWS、Azure、GCPで同様の設定、デュアルスタックサポート
  • Kubernetesクラスターはすべての主要クラウドプロバイダーでデュアルスタック実行可能

ジャンプ: AWS設定 | Azure設定 | GCP設定 | Kubernetes

クラウドでIPv6を有効にする理由#

モバイルネットワークは何年もIPv6ファーストです。モバイルユーザーがサービスにアクセスするとき、彼らはIPv6アドレスから来ています。IPv4のみを実行すると、パス内のどこかで変換を強制し、遅延と複雑さを追加します。

一部のISPは、レガシーIPv4サービス用のNAT64を使用してIPv6のみのネットワークに移行しました。IPv6経由で到達できない場合、これらのユーザーに追加の変換ホップを追加しています。

IPv4アドレスは現在お金がかかります。クラウドプロバイダーは、ほとんどの地域でパブリックIPv4アドレスに課金します。IPv6アドレスは無料で豊富です。

アーキテクチャもよりシンプルです。NAT、ポートフォワーディングルール、管理するアドレス枯渇がありません。すべてのインスタンスがグローバルにルーティング可能なアドレスを取得します。

AWS IPv6設定#

AWSはほとんどのサービスで堅実なIPv6サポートを持っています。VPCから始めます。

VPCデュアルスタック設定#

既存のVPCにIPv6 CIDRブロックを追加します:

aws ec2 associate-vpc-cidr-block \
  --vpc-id vpc-abc123 \
  --amazon-provided-ipv6-cidr-block

AWSは/56ブロックを割り当てます。各アベイラビリティゾーンに/64サブネットを関連付けます:

aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-xyz789 \
  --ipv6-cidr-block 2600:1f13:123:4500::/64

ルートテーブルを更新します。IPv6にはインターネットゲートウェイへの独自のルートが必要です:

aws ec2 create-route \
  --route-table-id rtb-abc123 \
  --destination-ipv6-cidr-block ::/0 \
  --gateway-id igw-xyz789

EC2 IPv6アドレッシング#

既存のインスタンスは自動的にIPv6を取得しません。手動でアドレスを割り当てます:

aws ec2 assign-ipv6-addresses \
  --network-interface-id eni-abc123 \
  --ipv6-address-count 1

デュアルスタックサブネット内の新しいインスタンスは、起動時に--ipv6-address-count 1を設定すると自動的にIPv6を取得します。

インスタンス内で、IPv6が設定されていることを確認します。Amazon LinuxとUbuntuはcloud-init経由でこれを自動的に処理しますが、ip -6 addr showで確認してください。

セキュリティグループ#

IPv6トラフィックは別々のルールを使用します。0.0.0.0/0のHTTPルールがある場合、IPv6には適用されません。::/0を追加します:

aws ec2 authorize-security-group-ingress \
  --group-id sg-abc123 \
  --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,Ipv6Ranges='[{CidrIpv6=::/0}]'

一般的な間違い:IPv6ルールの追加を忘れて、接続が失敗する理由を疑問に思う。

ロードバランサー#

アプリケーションおよびネットワークロードバランサーはデュアルスタックをサポートします。ip-address-typedualstackに設定します:

aws elbv2 set-ip-address-type \
  --load-balancer-arn arn:aws:elasticloadbalancing:... \
  --ip-address-type dualstack

ロードバランサーは自動的にAとAAAAの両方のレコードを取得します。

Route 53 DNS#

IPv6アドレスを指すAAAAレコードを作成します:

aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch file://add-aaaa.json

Route 53は、ロードバランサーとCloudFrontディストリビューションに役立つエイリアスレコードのIPv6もサポートします。

エグレスのみインターネットゲートウェイ#

インスタンスが発信IPv6接続を開始するが、着信接続を受け入れないようにする場合は、エグレスのみゲートウェイを使用します。これはIPv6のNAT相当ですが、ステートフルのみです。アドレス変換はありません。

aws ec2 create-egress-only-internet-gateway \
  --vpc-id vpc-abc123

通常のインターネットゲートウェイの代わりにこれを介してIPv6トラフィックをルーティングするように、プライベートサブネットのルートテーブルを更新します。

Azure IPv6設定#

Azureのアプローチは似ていますが、異なる用語を使用します。

仮想ネットワークデュアルスタック#

VNetにIPv6アドレス空間を追加します。ここではAmazon提供のアドレスを使用できません。Azureは独自の範囲から割り当てます。

az network vnet update \
  --resource-group myResourceGroup \
  --name myVNet \
  --address-prefixes "10.0.0.0/16" "fd00:db8::/56"

Azureはドキュメンテーション例にfd00::/8プレフィックスを使用しますが、本番環境ではパブリックGUAアドレスを取得します。

サブネットにIPv6を追加します:

az network vnet subnet update \
  --resource-group myResourceGroup \
  --vnet-name myVNet \
  --name mySubnet \
  --address-prefixes "10.0.1.0/24" "fd00:db8:1::/64"

VM IPv6設定#

VMにはIPv4とIPv6の両方のネットワークインターフェイス設定が必要です。パブリックIPv6アドレスを作成します:

az network public-ip create \
  --resource-group myResourceGroup \
  --name myPublicIPv6 \
  --version IPv6 \
  --sku Standard

ネットワークインターフェイスに接続します:

az network nic ip-config create \
  --resource-group myResourceGroup \
  --nic-name myNIC \
  --name ipv6config \
  --private-ip-address-version IPv6 \
  --vnet-name myVNet \
  --subnet mySubnet \
  --public-ip-address myPublicIPv6

IPv6を使用したロードバランサー#

Azure Load BalancerにはIPv4とIPv6の別々のフロントエンドIP設定が必要です:

az network lb frontend-ip create \
  --resource-group myResourceGroup \
  --lb-name myLoadBalancer \
  --name LoadBalancerFrontEndIPv6 \
  --public-ip-address myPublicIPv6

両方のスタックのバックエンドプール、ヘルスプローブ、ルールを設定します。設定は重複しており、退屈に感じますが、完全な制御を提供します。

DNSゾーン#

Azure DNSにAAAAレコードを追加します:

az network dns record-set aaaa add-record \
  --resource-group myResourceGroup \
  --zone-name example.com \
  --record-set-name www \
  --ipv6-address 2001:db8::1

GCP IPv6設定#

Google Cloudは、AWSやAzureよりもIPv6の採用が遅れていますが、サポートは大幅に改善されています。

VPC IPv6設定#

GCP VPCはデュアルスタックをサポートしていますが、IPv6は一部の機能でまだプレビュー段階です。サブネット作成時に有効にします:

gcloud compute networks subnets create mysubnet \
  --network=myvpc \
  --region=us-central1 \
  --range=10.0.1.0/24 \
  --stack-type=IPV4_IPV6 \
  --ipv6-access-type=EXTERNAL

GCPは2600:1900::/28範囲から/64を割り当てます。

Compute Engineインスタンス#

デュアルスタックサブネット内のインスタンスは自動的にIPv6を取得します。確認:

gcloud compute instances describe myinstance \
  --zone=us-central1-a \
  --format="get(networkInterfaces[0].ipv6Address)"

ファイアウォールルールには明示的なIPv6 CIDRブロックが必要です:

gcloud compute firewall-rules create allow-ipv6-http \
  --network myvpc \
  --allow tcp:80 \
  --source-ranges ::/0

Cloud Load Balancing#

Googleのグローバルロードバランサーは IPv6をサポートします。転送ルールの作成時にIPバージョンを設定します:

gcloud compute forwarding-rules create ipv6-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL \
  --ip-protocol=TCP \
  --ports=443 \
  --address=myipv6address \
  --ip-version=IPV6 \
  --target-https-proxy=mytargetproxy \
  --global

Googleは、グローバルロードバランサー用にエニーキャストIPv6アドレスを自動的にプロビジョニングします。

Cloud DNS#

AAAAレコードを作成します:

gcloud dns record-sets create www.example.com \
  --zone=myzone \
  --type=AAAA \
  --ttl=300 \
  --rrdatas=2001:db8::1

KubernetesとIPv6#

主要なマネージドKubernetesサービスは、デュアルスタッククラスターをサポートするようになりました。

デュアルスタッククラスター#

EKS、AKS、GKEはデュアルスタックを実行できます。ポッドはIPv4とIPv6の両方のアドレスを取得します。クラスター作成時に有効にします:

# EKS
eksctl create cluster --name mycluster --ip-family ipv4,ipv6
 
# GKE
gcloud container clusters create mycluster \
  --enable-ip-alias \
  --stack-type=IPV4_IPV6

サービスは両方のアドレスファミリを公開できます。サービスマニフェストでipFamilyPolicy: RequireDualStackを設定します。

ポッドIPv6アドレッシング#

各ポッドは両方のファミリからアドレスを受信します。CNIプラグイン(VPC CNI、Calico、Cilium)がアドレス割り当てを処理します。ポッドアドレスを確認:

kubectl get pods -o wide

ポッド内のアプリケーションは、IPv4とIPv6の両方をリッスンするために::にバインドする必要があります。

サービスIPv6#

サービスは両方のファミリからClusterIPアドレスを取得します。LoadBalancerサービスは、クラスターがサポートしている場合、デュアルスタックフロントエンドを使用してクラウドロードバランサーを自動的にプロビジョニングします。

1つの問題:すべてのIngressコントローラーがまだIPv6をサポートしているわけではありません。コントローラーのドキュメントを確認してください。

一般的な課題#

アプリケーションサポート#

ほとんどの最新言語とフレームワークはIPv6をサポートしていますが、古いアプリケーションはサポートしていない可能性があります。JavaアプリケーションはIPv6を優先するために-Djava.net.preferIPv6Addresses=trueが必要な場合があります。

データベースは厄介です。MySQLとPostgreSQLはIPv6をサポートしていますが、接続文字列とクライアントライブラリには適切な角括弧表記が必要です:psql -h [2001:db8::1] -p 5432

監視のギャップ#

一部の監視ツールは、デフォルトでIPv4メトリックのみを収集します。CloudWatch、Azure Monitor、Cloud MonitoringはIPv6をサポートしていますが、カスタムダッシュボードには更新が必要な場合があります。

サードパーティのAPMツール(Datadog、New Relic)はデュアルスタックを処理しますが、エージェントが正しく設定されていることを確認してください。

コストの考慮事項#

IPv6自体は無料ですが、エグレスコストは残ります。実際、一部のクラウドプロバイダーは、IPv6にIPv4と同じエグレスレートを課金するため、コスト削減は提供されません。アーキテクチャ上の利点のみです。

AWSは、一部の地域でエグレスのみのインターネットゲートウェイに課金します。展開前に価格ページを確認してください。

クラウドIPv6のテスト#

機能すると仮定しないでください。IPv6のみのネットワークからテストします。

ローカルマシンでIPv4を一時的に無効にします:

# Linux
sudo ip addr del <あなたのipv4アドレ> dev eth0
 
# macOS
sudo ifconfig en0 inet delete

サービスへのアクセスを試みます。失敗した場合、設定に問題があります。

ipv6-test.comのようなオンラインツールを使用して、さまざまな場所からの到達可能性を確認します。

複数のリゾルバからdig AAAA yourdomain.comでDNS伝播を確認します。

デュアルスタックトラフィック下でのロードバランサーの動作をテストします。一部のロードバランサーには、負荷がかかったときにのみ現れるアドレスファミリ間の微妙なルーティングの違いがあります。

関連記事#

実際に試してみましょう

IPv6 Pingツールを使用して、クラウドインスタンスのIPv6接続をテストします。

追加リソース#