AWS、Azure 和 GCP 中的 IPv6
在你的云基础设施中启用 IPv6。AWS、Azure 和 Google Cloud Platform 的实用配置指南。
大多数云工作负载仍然仅运行 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-blockAWS 分配一个 /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-xyz789EC2 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.jsonRoute 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::1GCP 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=EXTERNALGCP 从其 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 ::/0Cloud 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 \
--globalGoogle 自动为全球负载均衡器提供任播 IPv6 地址。
Cloud DNS#
创建 AAAA 记录:
gcloud dns record-sets create www.example.com \
--zone=myzone \
--type=AAAA \
--ttl=300 \
--rrdatas=2001:db8::1Kubernetes 和 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 widepod 内的应用程序应绑定到 :: 以在 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 迁移:双栈、隧道和 NAT64 - 学习云部署的迁移策略和最佳实践。
- IPv6 部署:网络管理员检查清单 - 确保你的云 IPv6 部署遵循最佳实践。
亲自尝试
使用我们的 IPv6 Ping 工具测试你的云实例的 IPv6 连接。