ping6.net
迁移

AWS、Azure 和 GCP 中的 IPv6

在你的云基础设施中启用 IPv6。AWS、Azure 和 Google Cloud Platform 的实用配置指南。

ping6.net2024年12月14日4 min read
IPv6AWSAzureGCPKubernetes

大多数云工作负载仍然仅运行 IPv4。这正在成为一个问题。

TL;DR - 快速摘要

要点:

  • 移动网络是 IPv6 优先的:强制转换会为大多数用户增加延迟
  • 云中的 IPv4 地址需要花钱,而 IPv6 是免费的
  • AWS、Azure 和 GCP 的配置类似,都支持双栈
  • Kubernetes 集群可以在所有主要云提供商上运行双栈

跳转至: AWS 配置 | Azure 配置 | GCP 配置 | Kubernetes

为什么在云中启用 IPv6#

移动网络多年来一直是 IPv6 优先的。当你的移动用户访问你的服务时,他们来自 IPv6 地址。运行仅 IPv4 意味着在路径中的某个地方强制进行转换,增加延迟和复杂性。

一些 ISP 已经转向仅 IPv6 网络,为传统 IPv4 服务使用 NAT64。如果你无法通过 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-type 设置为 dualstack

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 也支持别名记录的 IPv6,这对于负载均衡器和 CloudFront 分发很有用。

仅出口互联网网关#

如果你希望实例启动出站 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 负载均衡器需要为 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 在采用 IPv6 方面比 AWS 和 Azure 慢,但支持已经显著改善。

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 可以运行双栈。Pod 获得 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

服务可以公开两个地址族。在你的 Service 清单中设置 ipFamilyPolicy: RequireDualStack

Pod IPv6 地址#

每个 pod 接收来自两个族的地址。CNI 插件(VPC CNI、Calico、Cilium)处理地址分配。检查 pod 地址:

kubectl get pods -o wide

pod 内的应用程序应绑定到 :: 以在 IPv4 和 IPv6 上监听。

Service IPv6#

服务从两个族获得 ClusterIP 地址。如果集群支持,LoadBalancer 服务会自动使用双栈前端配置云负载均衡器。

一个问题:并非所有 Ingress 控制器都支持 IPv6。验证你的控制器的文档。

常见挑战#

应用程序支持#

大多数现代语言和框架支持 IPv6,但较旧的应用程序可能不支持。Java 应用程序有时需要 -Djava.net.preferIPv6Addresses=true 来优先使用 IPv6。

数据库很棘手。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 <your-ipv4-address> dev eth0
 
# macOS
sudo ifconfig en0 inet delete

尝试访问你的服务。如果失败,你有配置问题。

使用在线工具如 ipv6-test.com 验证从不同位置的可达性。

使用 dig AAAA yourdomain.com 从多个解析器检查 DNS 传播。

在双栈流量下测试负载均衡器行为。一些负载均衡器在地址族之间具有微妙的路由差异,这些差异仅在负载下出现。

相关文章#

亲自尝试

使用我们的 IPv6 Ping 工具测试你的云实例的 IPv6 连接。

其他资源#