ping6.net

IPv6 auf AWS: VPC, EC2, ELB und mehr

Vollständiger Leitfaden zur Bereitstellung von IPv6 auf Amazon Web Services. Konfigurieren Sie VPCs, Subnetze, Sicherheitsgruppen, Load Balancer und Egress-Only-Gateways.

ping6.net14. Dezember 202413 min read
IPv6AWScloudVPCEC2networking

AWS bietet umfassende IPv6-Unterstützung für die meisten Dienste, aber sie ist nicht standardmäßig aktiviert. Sie müssen sich dafür entscheiden, und die Konfiguration erstreckt sich über mehrere Ebenen.

TL;DR - Kurzübersicht

Wichtige Punkte:

  • AWS bietet Dual-Stack IPv6 (nicht IPv6-only für die meisten Dienste)
  • Sie erhalten von Amazon zugewiesene /56-Blöcke aus dem Bereich 2600::/12
  • Alle IPv6-Adressen sind global eindeutig und routbar (kein NAT)
  • Egress-Only-Gateways bieten zustandsbehaftete Filterung ohne Adressübersetzung

Direkt zu: VPC-Konfiguration | EC2-Instanzen | Sicherheitsgruppen | Load Balancer | Terraform-Beispiel

Übersicht über die AWS IPv6-Architektur#

AWS stellt IPv6 in einer Dual-Stack-Konfiguration bereit. Ihre Ressourcen erhalten sowohl IPv4- als auch IPv6-Adressen. Sie können nicht mit nur IPv6 arbeiten in den meisten Diensten (außer einigen Container- und Serverless-Workloads).

Amazon weist IPv6-CIDR-Blöcke aus ihrem öffentlichen Pool zu. Sie können Ihr Präfix nicht auswählen – AWS weist Ihrer VPC einen /56-Block aus dem Bereich 2600::/12 zu.

Im Gegensatz zu IPv4, wo Sie private RFC1918-Adressen verwenden (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), sind alle AWS IPv6-Adressen global eindeutig und routbar (GUA). Es gibt kein NAT für IPv6 im traditionellen Sinne – wenn Sie reine Ausgangsverbindungen wünschen, verwenden Sie ein Egress-Only-Internet-Gateway.

VPC IPv6-Konfiguration#

Beginnen Sie mit Ihrer VPC. Das Hinzufügen von IPv6 stört vorhandene IPv4-Ressourcen nicht.

IPv6-CIDR-Block zuordnen#

Fügen Sie einen von Amazon bereitgestellten IPv6-CIDR zu Ihrer VPC hinzu:

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

AWS weist einen /56-Block zu. Die Antwort zeigt Ihren zugewiesenen Bereich:

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

Warten Sie, bis sich der Status zu associated ändert:

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

Sie können auch „Bring Your Own IP" (BYOIP) verwenden, wenn Sie anbieterunabhängigen IPv6-Adressraum haben und Adressen über AWS-Konten oder Migrationen hinweg beibehalten möchten. Die meisten Benutzer bleiben bei von Amazon bereitgestellten Adressen.

Subnetz-IPv6-Konfiguration#

Subnetze benötigen ihre eigenen /64-Segmente aus dem /56-Block der VPC.

Listen Sie den IPv6-CIDR Ihrer VPC auf:

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

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

Weisen Sie /64-Blöcke zu Subnetzen zu. Verwenden Sie Hexadezimalwerte 00-FF für den Subnetzteil:

# Öffentliches Subnetz A - 2600:1f13:1234:5600::/64
aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-0abc111 \
  --ipv6-cidr-block 2600:1f13:1234:5600::/64
 
# Öffentliches Subnetz B - 2600:1f13:1234:5601::/64
aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-0abc222 \
  --ipv6-cidr-block 2600:1f13:1234:5601::/64
 
# Privates Subnetz A - 2600:1f13:1234:5610::/64
aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-0abc333 \
  --ipv6-cidr-block 2600:1f13:1234:5610::/64

Aktivieren Sie die automatische Zuweisung von IPv6-Adressen für Instanzen, die in öffentlichen Subnetzen gestartet werden:

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

Routing-Tabellen#

IPv6-Routing ist von IPv4 getrennt. Erstellen Sie Routen für Ihre IPv6-CIDR-Blöcke.

Für öffentliche Subnetze leiten Sie allen IPv6-Verkehr (::/0) zum Internet-Gateway:

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

Internet-Gateways verarbeiten sowohl IPv4 als auch IPv6 ohne Änderungen.

Für private Subnetze verwenden Sie ein Egress-Only-Internet-Gateway (später erläutert):

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

Überprüfen Sie die Routen:

aws ec2 describe-route-tables --route-table-ids rtb-0abc123 \
  --query 'RouteTables[0].Routes'

EC2-Instanz IPv6-Konfiguration#

EC2-Instanzen benötigen eine explizite IPv6-Adresszuweisung.

Neue Instanzen mit IPv6 starten#

Geben Sie --ipv6-address-count beim Start an:

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

Oder weisen Sie eine bestimmte IPv6-Adresse aus Ihrem Subnetzbereich zu:

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

IPv6 zu vorhandenen Instanzen hinzufügen#

Holen Sie sich die Netzwerkschnittstellen-ID (ENI):

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

Weisen Sie eine IPv6-Adresse zu:

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

Oder geben Sie genaue Adressen an:

aws ec2 assign-ipv6-addresses \
  --network-interface-id eni-0def456 \
  --ipv6-addresses 2600:1f13:1234:5600::b

Instanz-Betriebssystemkonfiguration#

Die meisten modernen AMIs (Amazon Linux 2023, Amazon Linux 2, Ubuntu 20.04+) konfigurieren IPv6 automatisch über cloud-init und DHCPv6.

Verbinden Sie sich per SSH mit Ihrer Instanz und überprüfen Sie:

ip -6 addr show

Sie sollten Ihre zugewiesene IPv6-Adresse auf der eth0-Schnittstelle sehen:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001
    inet6 2600:1f13:1234:5600::a/128 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::4a2:c9ff:fe12:3456/64 scope link
       valid_lft forever preferred_lft forever

Testen Sie die Konnektivität:

ping6 google.com
curl -6 https://ifconfig.co

Wenn IPv6 nicht konfiguriert ist, überprüfen Sie die cloud-init-Protokolle:

sudo cat /var/log/cloud-init.log | grep -i ipv6

Einige ältere AMIs erfordern möglicherweise eine manuelle Konfiguration. Fügen Sie zu /etc/network/interfaces (Debian/Ubuntu) oder /etc/sysconfig/network-scripts/ifcfg-eth0 (RHEL/CentOS) hinzu.

Sicherheitsgruppen#

Sicherheitsgruppen benötigen explizite IPv6-Regeln. IPv4-Regeln gelten nicht für IPv6-Verkehr.

Erstellen von Dual-Stack-Sicherheitsgruppenregeln#

Erlauben Sie HTTP/HTTPS von überall (sowohl IPv4 als auch 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}]'

Erlauben Sie SSH von einem bestimmten IPv6-Präfix:

aws ec2 authorize-security-group-ingress \
  --group-id sg-0abc123 \
  --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,Ipv6Ranges='[{CidrIpv6=2001:db8::/32,Description="Office IPv6"}]'

Erlauben Sie alle ICMPv6 (erforderlich für IPv6-Betrieb):

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

ICMPv6 ist kritisch für IPv6. Blockieren Sie es nicht. Es wird für Neighbor Discovery, PMTUD und andere Kernfunktionen verwendet.

Best Practices für Sicherheitsgruppen#

  1. Spiegeln Sie IPv4-Regeln auf IPv6, es sei denn, Sie haben spezifische Gründe, dies nicht zu tun
  2. Erlauben Sie immer ICMPv6 von denselben Quellen wie Ihr Anwendungsverkehr
  3. Verwenden Sie Präfixlisten für die Verwaltung komplexer Regelsätze über beide Familien hinweg
  4. Taggen Sie Sicherheitsgruppen, um Dual-Stack von IPv4-only zu identifizieren

Beispiel: Erstellen Sie eine verwaltete Präfixliste für die IPv6-Bereiche Ihrer Organisation:

aws ec2 create-managed-prefix-list \
  --prefix-list-name org-ipv6-ranges \
  --address-family IPv6 \
  --max-entries 10 \
  --entries Cidr=2001:db8:100::/40,Description=HQ \
           Cidr=2001:db8:200::/40,Description=DataCenter

Verweisen Sie in Sicherheitsgruppenregeln darauf:

aws ec2 authorize-security-group-ingress \
  --group-id sg-0abc123 \
  --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,PrefixListIds='[{PrefixListId=pl-0abc123}]'

Elastic Load Balancing#

Application Load Balancer (ALB) und Network Load Balancer (NLB) unterstützen Dual-Stack. Classic Load Balancer nicht.

Application Load Balancer Dual-Stack#

Erstellen Sie oder ändern Sie einen ALB, um Dual-Stack zu verwenden:

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

Für vorhandene Load Balancer:

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

Der Load Balancer erhält automatisch sowohl A- als auch AAAA-DNS-Einträge:

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

Clients können über IPv4 oder IPv6 verbinden. Der Load Balancer leitet Verkehr an Ziele unter Verwendung ihrer konfigurierten Adressfamilie weiter (normalerweise IPv4 für Backend-Instanzen).

Network Load Balancer Dual-Stack#

NLB unterstützt Dual-Stack ähnlich:

aws elbv2 create-load-balancer \
  --name my-nlb \
  --type network \
  --subnets subnet-0abc111 subnet-0abc222 \
  --ip-address-type dualstack

NLB bewahrt Client-IP-Adressen, sodass Ziele die tatsächlichen IPv6-Quelladressen sehen. Stellen Sie sicher, dass Ihre Anwendungsprotokolle und Sicherheitsgruppen beide Adressfamilien verarbeiten.

Zielgruppen#

Zielgruppen registrieren Instanzen über ihre IPv4-Adressen (am häufigsten) oder IPv6. Sie können Adressfamilien nicht in einer einzigen Zielgruppe mischen.

Erstellen Sie eine IPv4-Zielgruppe:

aws elbv2 create-target-group \
  --name my-targets-ipv4 \
  --protocol HTTP \
  --port 80 \
  --vpc-id vpc-0abc123 \
  --ip-address-type ipv4

Erstellen Sie eine IPv6-Zielgruppe:

aws elbv2 create-target-group \
  --name my-targets-ipv6 \
  --protocol HTTP \
  --port 80 \
  --vpc-id vpc-0abc123 \
  --ip-address-type ipv6

Die meisten Bereitstellungen verwenden IPv4-Zielgruppen auch mit Dual-Stack-Load-Balancern. Der Load Balancer übernimmt die Protokollübersetzung transparent.

Egress-Only-Internet-Gateway#

Egress-Only-Internet-Gateways ermöglichen ausgehende IPv6-Verbindungen von privaten Subnetzen, während sie eingehende Verbindungen blockieren. Dies ist ähnlich wie NAT für IPv4, aber ohne Adressübersetzung – IPv6-Adressen bleiben global eindeutig.

Egress-Only-Gateway erstellen#

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

Notieren Sie sich die Gateway-ID:

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

Verkehr von privatem Subnetz routen#

Fügen Sie eine Route in Ihrer privaten Subnetz-Routing-Tabelle hinzu:

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

Instanzen in privaten Subnetzen können jetzt ausgehende IPv6-Verbindungen initiieren, akzeptieren aber keinen eingehenden Verkehr aus dem Internet.

Anwendungsfälle:

  • Datenbankserver, die Software-Updates benötigen
  • Anwendungsserver, die auf externe APIs zugreifen
  • Interne Dienste, die AWS-APIs aufrufen (S3, DynamoDB usw.) über IPv6

Sicherheitsüberlegungen#

Egress-Only-Gateways bieten keine Anonymität. Ihre IPv6-Adresse ist für externe Dienste weiterhin sichtbar. Es ist zustandsbehaftetes Firewalling, kein NAT.

Wenn Sie echtes Nur-Ausgehend mit Adressmaskierung benötigen, benötigen Sie ein NAT64-Gateway (komplexere Einrichtung, selten notwendig).

Route 53 DNS#

Route 53 unterstützt IPv6 vollständig mit AAAA-Einträgen.

AAAA-Einträge erstellen#

Fügen Sie einen AAAA-Eintrag für Ihre Instanz oder Ihren Load Balancer hinzu:

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"}]
      }
    }]
  }'

Alias-Einträge für Load Balancer#

Verwenden Sie Alias-Einträge für ALB/NLB (besser als AAAA-Einträge – werden automatisch aktualisiert, wenn sich LB-IPs ändern):

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
        }
      }
    }]
  }'

Die HostedZoneId in AliasTarget ist die kanonische gehostete Zone für ELB in dieser Region (siehe AWS-Dokumentation für den korrekten Wert).

Integritätsprüfungen#

Route 53-Integritätsprüfungen unterstützen IPv6:

aws route53 create-health-check \
  --health-check-config \
    IPAddress=2600:1f13:1234:5600::a,Port=443,Type=HTTPS,ResourcePath=/health,RequestInterval=30,FailureThreshold=3 \
  --caller-reference $(uuidgen)

Verwenden Sie Integritätsprüfungen mit Failover- oder gewichteten Routing-Richtlinien für hohe Verfügbarkeit.

CloudFront IPv6#

CloudFront-Distributionen unterstützen IPv6 standardmäßig (kann in den meisten Fällen nicht deaktiviert werden).

Das globale Edge-Netzwerk von CloudFront verwendet Dual-Stack. Clients, die über IPv6 verbinden, erreichen dieselben Edge-Standorte wie IPv4-Clients.

Überprüfen Sie die IPv6-Unterstützung:

dig d111111abcdef8.cloudfront.net AAAA

CloudFront übernimmt die Protokollübersetzung. Wenn Ihr Origin nur IPv4 verwendet, liefert CloudFront dennoch Inhalte an IPv6-Clients.

Die Origin-Konfiguration benötigt keine Änderungen:

aws cloudfront create-distribution \
  --distribution-config file://distribution-config.json

Beispiel distribution-config.json (abgekürzt):

{
  "Origins": {
    "Items": [{
      "Id": "my-origin",
      "DomainName": "example.com",
      "CustomOriginConfig": {
        "OriginProtocolPolicy": "https-only"
      }
    }]
  },
  "Enabled": true,
  "Comment": "My distribution"
}

CloudFront stellt automatisch IPv6-Adressen für Ihre Distribution bereit. Keine zusätzliche Konfiguration erforderlich.

NAT64 für IPv6-Only-Workloads#

Einige Workloads (Lambda, Fargate) können nur mit IPv6 laufen. Wenn sie auf IPv4-only-Ressourcen zugreifen müssen, verwenden Sie NAT64.

AWS bietet kein verwaltetes NAT64. Sie müssen Ihr eigenes NAT64/DNS64-Gateway auf EC2 ausführen.

Beispiel mit Tayga (NAT64) und BIND (DNS64):

  1. Starten Sie eine EC2-Instanz mit sowohl IPv4 als auch IPv6
  2. Installieren und konfigurieren Sie Tayga für NAT64-Übersetzung
  3. Installieren und konfigurieren Sie BIND mit DNS64-Modul
  4. Routen Sie IPv6-only-Ressourcen durch NAT64-Gateway

Dies ist komplex und selten erforderlich. Die meisten Bereitstellungen laufen stattdessen mit Dual-Stack.

Terraform-Beispiel#

Infrastructure as Code für Dual-Stack-AWS-Setup:

# VPC mit 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"
  }
}
 
# Internet Gateway
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id
}
 
# Egress-Only Internet Gateway
resource "aws_egress_only_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id
}
 
# Öffentliches Subnetz
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"
  }
}
 
# Routing-Tabelle für öffentliches Subnetz
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"
  }
}
 
resource "aws_route_table_association" "public" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public.id
}
 
# Sicherheitsgruppe
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"]
  }
}
 
# EC2-Instanz mit 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]  # Weitere Subnetze für HA hinzufügen
  ip_address_type    = "dualstack"
 
  tags = {
    Name = "main-alb"
  }
}
 
# IPv6-CIDR ausgeben
output "vpc_ipv6_cidr" {
  value = aws_vpc.main.ipv6_cidr_block
}
 
output "instance_ipv6" {
  value = aws_instance.web.ipv6_addresses
}

Anwenden mit:

terraform init
terraform plan
terraform apply

CloudFormation-Beispiel#

YAML-Vorlage für Dual-Stack-VPC:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Dual-Stack-VPC mit IPv6'
 
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
 
  IPv6CidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      AmazonProvidedIpv6CidrBlock: true
 
  PublicSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      Ipv6CidrBlock: !Select [0, !Cidr [!GetAtt VPC.Ipv6CidrBlock, 256, 64]]
      AssignIpv6AddressOnCreation: true
      AvailabilityZone: !Select [0, !GetAZs '']
 
  InternetGateway:
    Type: AWS::EC2::InternetGateway
 
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
 
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
 
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
 
  PublicRouteIPv6:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationIpv6CidrBlock: ::/0
      GatewayId: !Ref InternetGateway
 
  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
 
Outputs:
  VPCId:
    Value: !Ref VPC
  IPv6CidrBlock:
    Value: !GetAtt VPC.Ipv6CidrBlock

Bereitstellen mit:

aws cloudformation create-stack \
  --stack-name ipv6-vpc \
  --template-body file://template.yaml

Testen Ihrer AWS IPv6-Bereitstellung#

Überprüfen Sie die End-to-End-Konnektivität:

# DNS-Auflösung testen
dig app.example.com AAAA
 
# HTTP/HTTPS-Zugriff testen
curl -6 https://app.example.com
 
# Von Instanz testen
ssh ec2-user@<instance-ipv6>
ping6 google.com
curl -6 https://ifconfig.co

Verwenden Sie AWS Reachability Analyzer, um Netzwerkpfade zu überprüfen:

aws ec2 create-network-insights-path \
  --source <instance-eni> \
  --destination <alb-eni> \
  --protocol tcp \
  --destination-port 443
 
aws ec2 start-network-insights-analysis \
  --network-insights-path-id <path-id>

Überprüfen Sie auf Fehlkonfigurationen, die IPv6 blockieren könnten.

Häufige Probleme und Lösungen#

Problem: Instanz hat IPv6-Adresse, kann aber nicht ins Internet Lösung: Überprüfen Sie, ob die Routing-Tabelle eine ::/0-Route zum IGW hat, überprüfen Sie, ob die Sicherheitsgruppe ausgehenden IPv6-Verkehr erlaubt

Problem: Load Balancer hat keinen AAAA-Eintrag Lösung: Stellen Sie sicher, dass ip-address-type auf dualstack gesetzt ist, überprüfen Sie, ob Subnetze IPv6-CIDR-Blöcke haben

Problem: Kann nicht per SSH über IPv6 auf Instanz zugreifen Lösung: Fügen Sie eine Sicherheitsgruppenregel hinzu, die TCP-Port 22 von ::/0 oder einem bestimmten IPv6-CIDR erlaubt

Problem: Egress-Only-Gateway funktioniert nicht Lösung: Überprüfen Sie die Zuordnung der Routing-Tabelle, prüfen Sie, ob der Instanz eine IPv6-Adresse zugewiesen ist

Problem: CloudFront liefert nicht über IPv6 Lösung: CloudFront IPv6 ist automatisch und kann nicht deaktiviert werden – überprüfen Sie DNS-Auflösung und Client-Konnektivität

Kostenüberlegungen#

IPv6 selbst ist kostenlos bei AWS. Sie zahlen nicht für IPv6-CIDR-Blöcke oder Adressen.

Die Datenübertragungskosten sind für IPv4 und IPv6 gleich. Es gibt keinen Preisvorteil für IPv6 – der Vorteil liegt in der architektonischen Einfachheit und der Vermeidung von IPv4-Erschöpfung.

Egress-Only-Internet-Gateways sind kostenlos (im Gegensatz zu NAT-Gateways, die ~0,045 $/Stunde plus Datenverarbeitungsgebühren kosten).

Verwandte Artikel#

AWS IPv6-Konnektivität überprüfen

Verwenden Sie unser Ping-Tool, um Ihre AWS-Ressourcen zu testen, und das DNS-Tool, um Ihre Route 53-AAAA-Einträge zu überprüfen.

Zusätzliche Ressourcen#