ping6.net

IPv6 en AWS: VPC, EC2, ELB y Más

Guía completa para desplegar IPv6 en Amazon Web Services. Configura VPCs, subredes, grupos de seguridad, balanceadores de carga y gateways de solo salida.

ping6.net14 de diciembre de 20249 min read
IPv6AWScloudVPCEC2redes

AWS tiene soporte IPv6 integral en la mayoría de servicios, pero no está habilitado por defecto. Tienes que opt-in, y la configuración está distribuida en múltiples capas.

Descripción General de la Arquitectura IPv6 de AWS#

AWS proporciona IPv6 en configuración de doble pila. Tus recursos obtienen direcciones tanto IPv4 como IPv6. No puedes ejecutar solo IPv6 en la mayoría de servicios (excepto algunas cargas de trabajo de contenedores y serverless).

Amazon asigna bloques CIDR IPv6 de su pool público. No puedes elegir tu prefijo: AWS asigna un bloque /56 a tu VPC del rango 2600::/12.

A diferencia de IPv4 donde usas direcciones privadas RFC1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), todas las direcciones IPv6 de AWS son globalmente únicas y enrutables (GUA). No hay NAT para IPv6 en el sentido tradicional: si quieres conectividad solo saliente, usas un gateway de Internet de solo salida.

TL;DR - Resumen rápido

Puntos clave:

  • AWS proporciona IPv6 de doble pila (no solo IPv6 para la mayoría de servicios)
  • Obtienes bloques /56 asignados por Amazon del rango 2600::/12
  • Todas las direcciones IPv6 son globalmente únicas y enrutables (sin NAT)
  • Los gateways de solo salida proporcionan filtrado con estado sin traducción de direcciones

Ir a: Configuración VPC | Instancias EC2 | Grupos de seguridad | Balanceadores de carga | Ejemplo Terraform


Configuración IPv6 de VPC#

Comienza con tu VPC. Añadir IPv6 no interrumpe los recursos IPv4 existentes.

Asociar Bloque CIDR IPv6#

Añade un CIDR IPv6 proporcionado por Amazon a tu VPC:

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

AWS asigna un bloque /56. La respuesta muestra tu rango asignado:

{
  "Ipv6CidrBlockAssociation": {
    "Ipv6CidrBlock": "2600:1f13:1234:5600::/56",
    "Ipv6CidrBlockState": {
      "State": "associating"
    }
  }
}

Configuración IPv6 de Subred#

Las subredes necesitan sus propias porciones /64 del bloque /56 de la VPC.

Listar el CIDR IPv6 de tu VPC:

aws ec2 describe-vpcs --vpc-ids vpc-0abc123def456 \
  --query 'Vpcs[0].Ipv6CidrBlockAssociationSet[0].Ipv6CidrBlock'

Salida: 2600:1f13:1234:5600::/56

Asignar bloques /64 a subredes. Usar valores hexadecimales 00-FF para la porción de subred:

# Subred pública A - 2600:1f13:1234:5600::/64
aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-0abc111 \
  --ipv6-cidr-block 2600:1f13:1234:5600::/64
 
# Subred pública B - 2600:1f13:1234:5601::/64
aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-0abc222 \
  --ipv6-cidr-block 2600:1f13:1234:5601::/64

Habilitar asignación automática de direcciones IPv6 para instancias lanzadas en subredes públicas:

aws ec2 modify-subnet-attribute \
  --subnet-id subnet-0abc111 \
  --assign-ipv6-address-on-creation

Tablas de Rutas#

El enrutamiento IPv6 es separado de IPv4. Crear rutas para tus bloques CIDR IPv6.

Para subredes públicas, enrutar todo el tráfico IPv6 (::/0) al gateway de Internet:

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

Los gateways de Internet manejan tanto IPv4 como IPv6 sin modificación.

Para subredes privadas, usarás un gateway de Internet de solo salida:

aws ec2 create-route \
  --route-table-id rtb-0abc789 \
  --destination-ipv6-cidr-block ::/0 \
  --egress-only-internet-gateway-id eigw-0ghi012

Configuración IPv6 de Instancia EC2#

Las instancias EC2 necesitan asignación explícita de dirección IPv6.

Lanzar Nuevas Instancias con IPv6#

Especificar --ipv6-address-count al lanzar:

aws ec2 run-instances \
  --image-id ami-0abc123 \
  --instance-type t3.medium \
  --subnet-id subnet-0abc111 \
  --ipv6-address-count 1 \
  --key-name mykey \
  --security-group-ids sg-0abc456

O asignar una dirección IPv6 específica de tu rango de subred:

aws ec2 run-instances \
  --image-id ami-0abc123 \
  --instance-type t3.medium \
  --subnet-id subnet-0abc111 \
  --ipv6-addresses Ipv6Address=2600:1f13:1234:5600::a \
  --key-name mykey \
  --security-group-ids sg-0abc456

Añadir IPv6 a Instancias Existentes#

Obtener el ID de interfaz de red (ENI):

aws ec2 describe-instances --instance-ids i-0abc123 \
  --query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId'

Asignar una dirección IPv6:

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

Grupos de Seguridad#

Los grupos de seguridad necesitan reglas IPv6 explícitas. Las reglas IPv4 no aplican al tráfico IPv6.

Crear Reglas de Grupo de Seguridad Dual-Stack#

Permitir HTTP/HTTPS desde cualquier lugar (tanto IPv4 como IPv6):

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

Permitir todo ICMPv6 (requerido para operación IPv6):

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

ICMPv6 es crítico para IPv6. No lo bloquees. Se usa para descubrimiento de vecinos, PMTUD y otras funciones centrales.

Elastic Load Balancing#

Los Application Load Balancers (ALB) y Network Load Balancers (NLB) soportan dual-stack. Los Classic Load Balancers no.

Application Load Balancer Dual-Stack#

Crear o modificar un ALB para usar dual-stack:

aws elbv2 create-load-balancer \
  --name my-alb \
  --subnets subnet-0abc111 subnet-0abc222 \
  --security-groups sg-0abc123 \
  --ip-address-type dualstack

Para balanceadores de carga existentes:

aws elbv2 set-ip-address-type \
  --load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-alb/1234567890abcdef \
  --ip-address-type dualstack

El balanceador de carga obtiene registros DNS tanto A como AAAA automáticamente:

dig my-alb-1234567890.us-east-1.elb.amazonaws.com A
dig my-alb-1234567890.us-east-1.elb.amazonaws.com AAAA

Los clientes pueden conectar vía IPv4 o IPv6. El balanceador de carga reenvía tráfico a objetivos usando su familia de direcciones configurada (típicamente IPv4 para instancias backend).

Gateway de Internet de Solo Salida#

Los gateways de Internet de solo salida permiten conexiones IPv6 salientes desde subredes privadas mientras bloquean conexiones entrantes. Esto es similar a NAT para IPv4, pero sin traducción de direcciones: las direcciones IPv6 permanecen globalmente únicas.

Crear Gateway de Solo Salida#

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

Nota el ID del gateway:

{
  "EgressOnlyInternetGateway": {
    "EgressOnlyInternetGatewayId": "eigw-0abc123"
  }
}

Enrutar Tráfico de Subred Privada#

Añadir una ruta en tu tabla de rutas de subred privada:

aws ec2 create-route \
  --route-table-id rtb-0abc789 \
  --destination-ipv6-cidr-block ::/0 \
  --egress-only-internet-gateway-id eigw-0abc123

Las instancias en subredes privadas ahora pueden iniciar conexiones IPv6 salientes pero no aceptarán tráfico entrante desde Internet.

Casos de uso:

  • Servidores de base de datos que necesitan actualizaciones de software
  • Servidores de aplicaciones accediendo APIs externas
  • Servicios internos llamando APIs de AWS (S3, DynamoDB, etc.) sobre IPv6

DNS de Route 53#

Route 53 soporta completamente IPv6 con registros AAAA.

Crear Registros AAAA#

Añadir un registro AAAA para tu instancia o balanceador de carga:

aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch '{
    "Changes": [{
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "app.example.com",
        "Type": "AAAA",
        "TTL": 300,
        "ResourceRecords": [{"Value": "2600:1f13:1234:5600::a"}]
      }
    }]
  }'

Registros Alias para Balanceadores de Carga#

Usar registros alias para ALB/NLB (mejor que registros AAAA: actualizados automáticamente si cambian las IPs del LB):

aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch '{
    "Changes": [{
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "app.example.com",
        "Type": "AAAA",
        "AliasTarget": {
          "HostedZoneId": "Z35SXDOTRQ7X7K",
          "DNSName": "my-alb-1234567890.us-east-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    }]
  }'

CloudFront IPv6#

Las distribuciones CloudFront soportan IPv6 por defecto (no se puede deshabilitar en la mayoría de casos).

La red edge global de CloudFront usa dual-stack. Los clientes conectando sobre IPv6 golpean las mismas ubicaciones edge que los clientes IPv4.

Verificar soporte IPv6:

dig d111111abcdef8.cloudfront.net AAAA

CloudFront maneja traducción de protocolo. Si tu origen es solo IPv4, CloudFront todavía sirve contenido a clientes IPv6.

Ejemplo de Terraform#

Infraestructura como código para configuración AWS dual-stack:

# VPC con IPv6
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  assign_generated_ipv6_cidr_block = true
  enable_dns_support   = true
  enable_dns_hostnames = true
 
  tags = {
    Name = "main-vpc"
  }
}
 
# Gateway de Internet
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id
}
 
# Gateway de Internet de Solo Salida
resource "aws_egress_only_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id
}
 
# Subred Pública
resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  ipv6_cidr_block         = cidrsubnet(aws_vpc.main.ipv6_cidr_block, 8, 1)
  assign_ipv6_address_on_creation = true
  availability_zone       = "us-east-1a"
 
  tags = {
    Name = "public-subnet"
  }
}
 
# Tabla de Rutas para Subred Pública
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id
 
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }
 
  route {
    ipv6_cidr_block = "::/0"
    gateway_id      = aws_internet_gateway.main.id
  }
 
  tags = {
    Name = "public-rt"
  }
}
 
# Grupo de Seguridad
resource "aws_security_group" "web" {
  name        = "web-sg"
  description = "Allow HTTP/HTTPS"
  vpc_id      = aws_vpc.main.id
 
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
 
  ingress {
    from_port   = -1
    to_port     = -1
    protocol    = "ipv6-icmp"
    ipv6_cidr_blocks = ["::/0"]
  }
 
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
}
 
# Instancia EC2 con IPv6
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2023
  instance_type = "t3.medium"
  subnet_id     = aws_subnet.public.id
  ipv6_address_count = 1
 
  vpc_security_group_ids = [aws_security_group.web.id]
 
  tags = {
    Name = "web-server"
  }
}
 
# Application Load Balancer
resource "aws_lb" "main" {
  name               = "main-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.web.id]
  subnets            = [aws_subnet.public.id]
  ip_address_type    = "dualstack"
 
  tags = {
    Name = "main-alb"
  }
}
 
# Salida CIDR IPv6
output "vpc_ipv6_cidr" {
  value = aws_vpc.main.ipv6_cidr_block
}
 
output "instance_ipv6" {
  value = aws_instance.web.ipv6_addresses
}

Aplicar con:

terraform init
terraform plan
terraform apply

Probar Tu Despliegue IPv6 de AWS#

Verificar conectividad extremo a extremo:

# Probar resolución DNS
dig app.example.com AAAA
 
# Probar acceso HTTP/HTTPS
curl -6 https://app.example.com
 
# Probar desde instancia
ssh ec2-user@<instance-ipv6>
ping6 google.com
curl -6 https://ifconfig.co

Problemas Comunes y Soluciones#

Problema: La instancia tiene dirección IPv6 pero no puede alcanzar Internet Solución: Verificar que la tabla de rutas tiene ruta ::/0 a IGW, verificar que el grupo de seguridad permite IPv6 saliente

Problema: El balanceador de carga no tiene registro AAAA Solución: Asegurar que ip-address-type está establecido a dualstack, verificar que las subredes tienen bloques CIDR IPv6

Problema: No puedo hacer SSH a instancia vía IPv6 Solución: Añadir regla de grupo de seguridad permitiendo TCP puerto 22 desde ::/0 o CIDR IPv6 específico

Problema: Gateway de solo salida no funciona Solución: Verificar asociación de tabla de rutas, verificar que la instancia tiene dirección IPv6 asignada

Consideraciones de Costo#

IPv6 en sí es gratis en AWS. No pagas por bloques CIDR IPv6 o direcciones.

Los costos de transferencia de datos son los mismos para IPv4 e IPv6. No hay ventaja de precio para IPv6: el beneficio es simplicidad arquitectónica y evitar agotamiento de IPv4.

Los gateways de Internet de solo salida son gratis (a diferencia de los gateways NAT que cuestan ~$0.045/hora más cargos de procesamiento de datos).

Artículos Relacionados#

Verificar Conectividad IPv6 de AWS

Usa nuestra Herramienta Ping para probar tus recursos AWS, y Herramienta DNS para verificar tus registros AAAA de Route 53.

Recursos Adicionales#