ping6.net
Migración

IPv6 en AWS, Azure y GCP

Habilita IPv6 en tu infraestructura en la nube. Guías de configuración prácticas para AWS, Azure y Google Cloud Platform.

ping6.net14 de diciembre de 20248 min read
IPv6AWSAzureGCPnubeKubernetes

La mayoría de las cargas de trabajo en la nube todavía ejecutan solo IPv4. Eso se está convirtiendo en un problema.

TL;DR - Resumen rápido

Puntos clave:

  • Las redes móviles son IPv6-first: Forzar traducciones añade latencia para la mayoría de usuarios
  • Las direcciones IPv4 cuestan dinero en la nube mientras IPv6 es gratis
  • La configuración es similar entre AWS, Azure y GCP con soporte dual-stack
  • Los clústeres Kubernetes pueden ejecutar dual-stack en todos los proveedores de nube principales

Ir a: Configuración AWS | Configuración Azure | Configuración GCP | Kubernetes


Por qué habilitar IPv6 en la nube#

Las redes móviles han sido IPv6-first durante años. Cuando tus usuarios móviles acceden a tu servicio, vienen desde una dirección IPv6. Ejecutar solo IPv4 significa forzar una traducción en algún punto del camino, añadiendo latencia y complejidad.

Algunos ISPs se han movido a redes solo IPv6 con NAT64 para servicios IPv4 heredados. Si no eres accesible vía IPv6, estás añadiendo un salto de traducción extra para estos usuarios.

Las direcciones IPv4 cuestan dinero ahora. Los proveedores de nube cobran por direcciones IPv4 públicas en la mayoría de las regiones. Las direcciones IPv6 son gratuitas y abundantes.

La arquitectura también es más simple. Sin NAT, sin reglas de reenvío de puertos, sin agotamiento de direcciones para gestionar. Cada instancia obtiene una dirección enrutable globalmente.

Configuración IPv6 de AWS#

AWS tiene sólido soporte IPv6 en la mayoría de los servicios. Comienza con tu VPC.

Configuración Dual-Stack de VPC#

Añade un bloque CIDR IPv6 a tu VPC existente:

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

AWS asigna un bloque /56. Asocia subredes /64 a cada zona de disponibilidad:

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

Actualiza tus tablas de rutas. IPv6 necesita su propia ruta al internet gateway:

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

Direccionamiento IPv6 de EC2#

Las instancias existentes no obtienen IPv6 automáticamente. Asigna direcciones manualmente:

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

Las nuevas instancias en subredes dual-stack obtienen IPv6 automáticamente si estableces --ipv6-address-count 1 al lanzar.

Dentro de la instancia, verifica que IPv6 esté configurado. Amazon Linux y Ubuntu manejan esto automáticamente vía cloud-init, pero verifica con ip -6 addr show.

Grupos de seguridad#

El tráfico IPv6 usa reglas separadas. Si tienes una regla HTTP para 0.0.0.0/0, no aplicará a IPv6. Añade ::/0:

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

Error común: olvidar añadir reglas IPv6 y preguntarse por qué las conexiones fallan.

Load Balancers#

Los Application y Network Load Balancers soportan dual-stack. Establece ip-address-type a dualstack:

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

El load balancer obtiene tanto registros A como AAAA automáticamente.

DNS de Route 53#

Crea registros AAAA apuntando a tus direcciones IPv6:

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

Route 53 soporta IPv6 para registros alias también, lo cual es útil para load balancers y distribuciones CloudFront.

Egress-Only Internet Gateway#

Si quieres que las instancias inicien conexiones IPv6 salientes pero no acepten entrantes, usa un egress-only gateway. Este es el equivalente IPv6 de NAT, pero solo con estado—no hay traducción de direcciones.

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

Actualiza la tabla de rutas para subredes privadas para enrutar tráfico IPv6 a través de ella en lugar del internet gateway regular.

Configuración IPv6 de Azure#

El enfoque de Azure es similar pero usa terminología diferente.

Dual-Stack de red virtual#

Añade un espacio de direcciones IPv6 a tu VNet. No puedes usar direcciones proporcionadas por Amazon aquí; Azure asigna desde sus propios rangos.

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

Azure usa prefijos fd00::/8 para sus ejemplos de documentación, pero obtendrás direcciones GUA públicas en producción.

Añade IPv6 a subredes:

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

Configuración IPv6 de VM#

Las VMs necesitan tanto configuraciones de interfaz de red IPv4 como IPv6. Crea una dirección IPv6 pública:

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

Adjúntala a la interfaz de red:

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

Load Balancer con IPv6#

Azure Load Balancer necesita configuraciones de IP frontend separadas para IPv4 e IPv6:

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

Configura pools backend, sondas de salud y reglas para ambos stacks. La configuración está duplicada, lo cual se siente tedioso pero te da control completo.

Zonas DNS#

Añade registros AAAA a Azure DNS:

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

Configuración IPv6 de GCP#

Google Cloud ha sido más lento en adoptar IPv6 que AWS y Azure, pero el soporte ha mejorado significativamente.

Configuración IPv6 de VPC#

Las VPCs de GCP soportan dual-stack, pero IPv6 aún está en preview para algunas características. Habilítalo al crear subred:

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 asigna un /64 desde su rango 2600:1900::/28.

Instancias de Compute Engine#

Las instancias en subredes dual-stack obtienen IPv6 automáticamente. Verifica con:

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

Las reglas de firewall necesitan bloques CIDR IPv6 explícitos:

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

Cloud Load Balancing#

Los load balancers globales de Google soportan IPv6. Establece la versión IP al crear una regla de reenvío:

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 aprovisiona automáticamente una dirección IPv6 anycast para load balancers globales.

Cloud DNS#

Crea registros AAAA:

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

Kubernetes e IPv6#

Los principales servicios de Kubernetes gestionados ahora soportan clusters dual-stack.

Clusters Dual-Stack#

EKS, AKS y GKE pueden ejecutar dual-stack. Los pods obtienen tanto direcciones IPv4 como IPv6. Habilita durante la creación del cluster:

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

Los servicios pueden exponer ambas familias de direcciones. Establece ipFamilyPolicy: RequireDualStack en tu manifiesto de servicio.

Direccionamiento IPv6 de pods#

Cada pod recibe direcciones de ambas familias. Los plugins CNI (VPC CNI, Calico, Cilium) manejan la asignación de direcciones. Verifica direcciones de pod:

kubectl get pods -o wide

Las aplicaciones dentro de pods deben vincularse a :: para escuchar en tanto IPv4 como IPv6.

Servicio IPv6#

Los servicios obtienen direcciones ClusterIP de ambas familias. Los servicios LoadBalancer aprovisionan load balancers de nube con frontends dual-stack automáticamente si el cluster lo soporta.

Un problema: no todos los controladores Ingress soportan IPv6 todavía. Verifica la documentación de tu controlador.

Desafíos comunes#

Soporte de aplicaciones#

La mayoría de los lenguajes y frameworks modernos soportan IPv6, pero las aplicaciones más antiguas podrían no hacerlo. Las aplicaciones Java a veces necesitan -Djava.net.preferIPv6Addresses=true para preferir IPv6.

Las bases de datos son complicadas. MySQL y PostgreSQL soportan IPv6, pero las cadenas de conexión y bibliotecas cliente necesitan notación de corchetes apropiada: psql -h [2001:db8::1] -p 5432.

Brechas de monitoreo#

Algunas herramientas de monitoreo solo recopilan métricas IPv4 por defecto. CloudWatch, Azure Monitor y Cloud Monitoring soportan IPv6, pero los dashboards personalizados podrían necesitar actualizaciones.

Las herramientas APM de terceros (Datadog, New Relic) manejan dual-stack, pero verifica que tus agentes estén configurados correctamente.

Consideraciones de costos#

IPv6 en sí es gratuito, pero los costos de egreso permanecen. De hecho, algunos proveedores de nube cobran las mismas tarifas de egreso para IPv6 que para IPv4, lo que no proporciona ahorros de costos—solo beneficios arquitectónicos.

AWS cobra por egress-only internet gateways en algunas regiones. Verifica la página de precios antes de desplegar.

Probar tu IPv6 en la nube#

No asumas que funciona. Prueba desde una red solo IPv6.

Deshabilita IPv4 en tu máquina local temporalmente:

# Linux
sudo ip addr del <tu-dirección-ipv4> dev eth0
 
# macOS
sudo ifconfig en0 inet delete

Intenta acceder a tu servicio. Si falla, tienes problemas de configuración.

Usa herramientas en línea como ipv6-test.com para verificar accesibilidad desde diferentes ubicaciones.

Verifica propagación DNS con dig AAAA tudominio.com desde múltiples resolvers.

Prueba el comportamiento del load balancer bajo tráfico dual-stack. Algunos load balancers tienen diferencias sutiles de enrutamiento entre familias de direcciones que solo aparecen bajo carga.

Recursos adicionales#