IPv6 على AWS: VPC و EC2 و ELB وما بعدها
دليل كامل لنشر IPv6 على خدمات Amazon Web Services. تكوين VPCs والشبكات الفرعية ومجموعات الأمان وموازنات التحميل وبوابات الخروج فقط.
لدى AWS دعم شامل لـ IPv6 عبر معظم الخدمات، ولكنه غير مُمكّن افتراضيًا. عليك الاشتراك، والتكوين منتشر عبر طبقات متعددة.
TL;DR - ملخص سريع
النقاط الرئيسية:
- توفر AWS IPv6 مزدوج المكدس (وليس IPv6 فقط لمعظم الخدمات)
- تحصل على كتل
/56معينة من Amazon من نطاق2600::/12 - جميع عناوين IPv6 فريدة عالمياً وقابلة للتوجيه (بدون NAT)
- توفر بوابات الخروج فقط تصفية ذات حالة بدون ترجمة العناوين
انتقل إلى: تكوين VPC | مثيلات EC2 | مجموعات الأمان | موازنات التحميل | مثال Terraform
نظرة عامة على بنية AWS IPv6#
توفر AWS IPv6 في تكوين مضاعف المكدس. تحصل مواردك على عناوين IPv4 و IPv6. لا يمكنك تشغيل IPv6 فقط في معظم الخدمات (باستثناء بعض أحمال عمل الحاويات وبدون خادم).
تُعيّن Amazon كتل CIDR لـ IPv6 من مجموعتها العامة. لا يمكنك اختيار البادئة الخاصة بك — تُخصص AWS كتلة /56 لـ VPC الخاص بك من نطاق 2600::/12.
على عكس IPv4 حيث تستخدم عناوين RFC1918 الخاصة (10.0.0.0/8، 172.16.0.0/12، 192.168.0.0/16)، جميع عناوين AWS IPv6 فريدة عالميًا وقابلة للتوجيه (GUA). لا يوجد NAT لـ IPv6 بالمعنى التقليدي — إذا كنت تريد اتصالاً صادرًا فقط، فاستخدم بوابة إنترنت للخروج فقط.
تكوين VPC IPv6#
ابدأ بـ VPC الخاص بك. إضافة IPv6 لا تعطل موارد IPv4 الموجودة.
ربط كتلة CIDR لـ IPv6#
أضف CIDR IPv6 المقدم من Amazon إلى VPC الخاص بك:
aws ec2 associate-vpc-cidr-block \
--vpc-id vpc-0abc123def456 \
--amazon-provided-ipv6-cidr-blockتُعيّن AWS كتلة /56. تُظهر الاستجابة نطاقك المعين:
{
"Ipv6CidrBlockAssociation": {
"Ipv6CidrBlock": "2600:1f13:1234:5600::/56",
"Ipv6CidrBlockState": {
"State": "associating"
}
}
}انتظر حتى تتغير الحالة إلى associated:
aws ec2 describe-vpcs --vpc-ids vpc-0abc123def456 \
--query 'Vpcs[0].Ipv6CidrBlockAssociationSet[0].Ipv6CidrBlockState.State'يمكنك أيضًا استخدام «bring your own IP» (BYOIP) إذا كان لديك مساحة IPv6 مستقلة عن المزود وتريد الاحتفاظ بالعناوين عبر حسابات AWS أو الهجرات. يلتزم معظم المستخدمين بالعناوين المقدمة من Amazon.
تكوين الشبكة الفرعية IPv6#
تحتاج الشبكات الفرعية إلى شرائح /64 خاصة بها من كتلة /56 لـ VPC.
اسرد CIDR IPv6 لـ VPC الخاص بك:
aws ec2 describe-vpcs --vpc-ids vpc-0abc123def456 \
--query 'Vpcs[0].Ipv6CidrBlockAssociationSet[0].Ipv6CidrBlock'الإخراج: 2600:1f13:1234:5600::/56
عيّن كتل /64 للشبكات الفرعية. استخدم قيم سداسية عشرية 00-FF لجزء الشبكة الفرعية:
# Public subnet A - 2600:1f13:1234:5600::/64
aws ec2 associate-subnet-cidr-block \
--subnet-id subnet-0abc111 \
--ipv6-cidr-block 2600:1f13:1234:5600::/64
# Public subnet B - 2600:1f13:1234:5601::/64
aws ec2 associate-subnet-cidr-block \
--subnet-id subnet-0abc222 \
--ipv6-cidr-block 2600:1f13:1234:5601::/64
# Private subnet A - 2600:1f13:1234:5610::/64
aws ec2 associate-subnet-cidr-block \
--subnet-id subnet-0abc333 \
--ipv6-cidr-block 2600:1f13:1234:5610::/64مكّن التعيين التلقائي لعناوين IPv6 للحالات المُطلقة في الشبكات الفرعية العامة:
aws ec2 modify-subnet-attribute \
--subnet-id subnet-0abc111 \
--assign-ipv6-address-on-creationجداول التوجيه#
توجيه IPv6 منفصل عن IPv4. أنشئ مسارات لكتل CIDR لـ IPv6.
بالنسبة للشبكات الفرعية العامة، وجّه كل حركة مرور IPv6 (::/0) إلى بوابة الإنترنت:
aws ec2 create-route \
--route-table-id rtb-0abc123 \
--destination-ipv6-cidr-block ::/0 \
--gateway-id igw-0def456تتعامل بوابات الإنترنت مع كل من IPv4 و IPv6 دون تعديل.
بالنسبة للشبكات الفرعية الخاصة، ستستخدم بوابة إنترنت للخروج فقط (موضحة لاحقًا):
aws ec2 create-route \
--route-table-id rtb-0abc789 \
--destination-ipv6-cidr-block ::/0 \
--egress-only-internet-gateway-id eigw-0ghi012تحقق من المسارات:
aws ec2 describe-route-tables --route-table-ids rtb-0abc123 \
--query 'RouteTables[0].Routes'تكوين حالة EC2 IPv6#
تحتاج حالات EC2 إلى تعيين عنوان IPv6 صريح.
إطلاق حالات جديدة مع IPv6#
حدد --ipv6-address-count عند الإطلاق:
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أو عيّن عنوان IPv6 محددًا من نطاق شبكتك الفرعية:
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 إلى الحالات الموجودة#
احصل على معرف واجهة الشبكة (ENI):
aws ec2 describe-instances --instance-ids i-0abc123 \
--query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId'عيّن عنوان IPv6:
aws ec2 assign-ipv6-addresses \
--network-interface-id eni-0def456 \
--ipv6-address-count 1أو حدد العناوين الدقيقة:
aws ec2 assign-ipv6-addresses \
--network-interface-id eni-0def456 \
--ipv6-addresses 2600:1f13:1234:5600::bتكوين نظام التشغيل للحالة#
تقوم معظم AMIs الحديثة (Amazon Linux 2023، Amazon Linux 2، Ubuntu 20.04+) بتكوين IPv6 تلقائيًا عبر cloud-init و DHCPv6.
SSH إلى حالتك وتحقق:
ip -6 addr showيجب أن ترى عنوان IPv6 المعين على واجهة eth0:
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اختبر الاتصال:
ping6 google.com
curl -6 https://ifconfig.coإذا لم يتم تكوين IPv6، تحقق من سجلات cloud-init:
sudo cat /var/log/cloud-init.log | grep -i ipv6قد تتطلب بعض AMIs القديمة تكوينًا يدويًا. أضف إلى /etc/network/interfaces (Debian/Ubuntu) أو /etc/sysconfig/network-scripts/ifcfg-eth0 (RHEL/CentOS).
مجموعات الأمان#
تحتاج مجموعات الأمان إلى قواعد IPv6 صريحة. لا تنطبق قواعد IPv4 على حركة مرور IPv6.
إنشاء قواعد مجموعة الأمان مضاعفة المكدس#
السماح بـ HTTP/HTTPS من أي مكان (كل من IPv4 و 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}]'السماح بـ SSH من بادئة IPv6 محددة:
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"}]'السماح بجميع ICMPv6 (مطلوب لتشغيل IPv6):
aws ec2 authorize-security-group-ingress \
--group-id sg-0abc123 \
--ip-permissions IpProtocol=ipv6-icmp,FromPort=-1,ToPort=-1,Ipv6Ranges='[{CidrIpv6=::/0}]'ICMPv6 حاسم لـ IPv6. لا تحظره. يُستخدم لاكتشاف الجيران و PMTUD ووظائف أساسية أخرى.
أفضل ممارسات مجموعة الأمان#
- انعكس قواعد IPv4 إلى IPv6 ما لم يكن لديك أسباب محددة لعدم القيام بذلك
- اسمح دائمًا بـ ICMPv6 من نفس المصادر مثل حركة مرور تطبيقك
- استخدم قوائم البادئات لإدارة مجموعات القواعد المعقدة عبر كلا العائلتين
- ضع علامات على مجموعات الأمان لتحديد مضاعف المكدس مقابل IPv4 فقط
مثال: أنشئ قائمة بادئات مُدارة لنطاقات IPv6 لمؤسستك:
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أشر إليها في قواعد مجموعة الأمان:
aws ec2 authorize-security-group-ingress \
--group-id sg-0abc123 \
--ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,PrefixListIds='[{PrefixListId=pl-0abc123}]'موازنة التحميل المرنة#
تدعم موازنات تحميل التطبيق (ALB) وموازنات تحميل الشبكة (NLB) مضاعف المكدس. لا تدعم موازنات التحميل الكلاسيكية.
موازن تحميل التطبيق مضاعف المكدس#
أنشئ أو عدّل ALB لاستخدام مضاعف المكدس:
aws elbv2 create-load-balancer \
--name my-alb \
--subnets subnet-0abc111 subnet-0abc222 \
--security-groups sg-0abc123 \
--ip-address-type dualstackلموازنات التحميل الموجودة:
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يحصل موازن التحميل على سجلات DNS لكل من A و AAAA تلقائيًا:
dig my-alb-1234567890.us-east-1.elb.amazonaws.com A
dig my-alb-1234567890.us-east-1.elb.amazonaws.com AAAAيمكن للعملاء الاتصال عبر IPv4 أو IPv6. يُعيد موازن التحميل توجيه حركة المرور إلى الأهداف باستخدام عائلة العناوين المكونة (عادةً IPv4 لحالات الخلفية).
موازن تحميل الشبكة مضاعف المكدس#
يدعم NLB مضاعف المكدس بشكل مماثل:
aws elbv2 create-load-balancer \
--name my-nlb \
--type network \
--subnets subnet-0abc111 subnet-0abc222 \
--ip-address-type dualstackيحتفظ NLB بعناوين IP للعميل، لذا ترى الأهداف عناوين مصدر IPv6 الفعلية. تأكد من أن تطبيقك وسجلات ومجموعات الأمان تتعامل مع كلا عائلتي العناوين.
مجموعات الهدف#
تسجل مجموعات الهدف الحالات بعناوين IPv4 الخاصة بها (الأكثر شيوعًا) أو IPv6. لا يمكنك مزج عائلات العناوين في مجموعة هدف واحدة.
أنشئ مجموعة هدف IPv4:
aws elbv2 create-target-group \
--name my-targets-ipv4 \
--protocol HTTP \
--port 80 \
--vpc-id vpc-0abc123 \
--ip-address-type ipv4أنشئ مجموعة هدف IPv6:
aws elbv2 create-target-group \
--name my-targets-ipv6 \
--protocol HTTP \
--port 80 \
--vpc-id vpc-0abc123 \
--ip-address-type ipv6تستخدم معظم النشر مجموعات هدف IPv4 حتى مع موازنات تحميل مضاعفة المكدس. يتعامل موازن التحميل مع ترجمة البروتوكول بشفافية.
بوابة الإنترنت للخروج فقط#
تسمح بوابات الإنترنت للخروج فقط باتصالات IPv6 الصادرة من الشبكات الفرعية الخاصة مع حظر الاتصالات الواردة. هذا مشابه لـ NAT لـ IPv4، ولكن بدون ترجمة عنوان — تظل عناوين IPv6 فريدة عالميًا.
إنشاء بوابة للخروج فقط#
aws ec2 create-egress-only-internet-gateway \
--vpc-id vpc-0abc123لاحظ معرف البوابة:
{
"EgressOnlyInternetGateway": {
"EgressOnlyInternetGatewayId": "eigw-0abc123"
}
}توجيه حركة مرور الشبكة الفرعية الخاصة#
أضف مسارًا في جدول توجيه شبكتك الفرعية الخاصة:
aws ec2 create-route \
--route-table-id rtb-0abc789 \
--destination-ipv6-cidr-block ::/0 \
--egress-only-internet-gateway-id eigw-0abc123يمكن للحالات في الشبكات الفرعية الخاصة الآن بدء اتصالات IPv6 الصادرة ولكن لن تقبل حركة المرور الواردة من الإنترنت.
حالات الاستخدام:
- خوادم قواعد البيانات التي تحتاج إلى تحديثات البرامج
- خوادم التطبيقات التي تصل إلى واجهات برمجة التطبيقات الخارجية
- الخدمات الداخلية التي تستدعي واجهات برمجة تطبيقات AWS (S3، DynamoDB، إلخ) عبر IPv6
اعتبارات الأمان#
لا توفر بوابات الخروج فقط عدم الكشف عن الهوية. لا يزال عنوان IPv6 الخاص بك مرئيًا للخدمات الخارجية. إنها جدار حماية ذي حالة، وليست NAT.
إذا كنت بحاجة إلى خروج فقط حقيقي مع إخفاء العنوان، فستحتاج إلى بوابة NAT64 (إعداد أكثر تعقيدًا، نادرًا ما يكون ضروريًا).
Route 53 DNS#
يدعم Route 53 بالكامل IPv6 مع سجلات AAAA.
إنشاء سجلات AAAA#
أضف سجل AAAA لحالتك أو موازن التحميل:
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"}]
}
}]
}'سجلات الاسم المستعار لموازنات التحميل#
استخدم سجلات الاسم المستعار لـ ALB/NLB (أفضل من سجلات AAAA — يتم تحديثها تلقائيًا إذا تغيرت IPs لـ 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
}
}
}]
}'HostedZoneId في AliasTarget هو منطقة الاستضافة الأساسية لـ ELB في تلك المنطقة (انظر وثائق AWS للقيمة الصحيحة).
فحوصات الصحة#
تدعم فحوصات صحة Route 53 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)استخدم فحوصات الصحة مع سياسات التوجيه للتعطل أو الموزونة للتوافر العالي.
CloudFront IPv6#
تدعم توزيعات CloudFront IPv6 افتراضيًا (لا يمكن تعطيله في معظم الحالات).
تستخدم شبكة حافة CloudFront العالمية مضاعف المكدس. يضرب العملاء الذين يتصلون عبر IPv6 نفس مواقع الحافة مثل عملاء IPv4.
تحقق من دعم IPv6:
dig d111111abcdef8.cloudfront.net AAAAيتعامل CloudFront مع ترجمة البروتوكول. إذا كان أصلك IPv4 فقط، فلا يزال CloudFront يخدم المحتوى لعملاء IPv6.
لا يحتاج تكوين الأصل إلى تغييرات:
aws cloudfront create-distribution \
--distribution-config file://distribution-config.jsonمثال distribution-config.json (مختصر):
{
"Origins": {
"Items": [{
"Id": "my-origin",
"DomainName": "example.com",
"CustomOriginConfig": {
"OriginProtocolPolicy": "https-only"
}
}]
},
"Enabled": true,
"Comment": "My distribution"
}يوفر CloudFront تلقائيًا عناوين IPv6 لتوزيعك. لا حاجة لتكوين إضافي.
مثال Terraform#
البنية التحتية كرمز لإعداد AWS مضاعف المكدس:
# VPC with 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
}
# Public Subnet
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"
}
}
# Route Table for Public Subnet
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
}
# Security Group
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 Instance with 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"
}
}
# Output IPv6 CIDR
output "vpc_ipv6_cidr" {
value = aws_vpc.main.ipv6_cidr_block
}
output "instance_ipv6" {
value = aws_instance.web.ipv6_addresses
}طبّق باستخدام:
terraform init
terraform plan
terraform applyاختبار نشر AWS IPv6 الخاص بك#
تحقق من الاتصال من طرف إلى طرف:
# اختبار حل DNS
dig app.example.com AAAA
# اختبار الوصول إلى HTTP/HTTPS
curl -6 https://app.example.com
# اختبار من الحالة
ssh ec2-user@<instance-ipv6>
ping6 google.com
curl -6 https://ifconfig.coاستخدم AWS Reachability Analyzer للتحقق من مسارات الشبكة:
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>تحقق من التكوينات الخاطئة التي قد تحظر IPv6.
المشاكل الشائعة والحلول#
المشكلة: الحالة لديها عنوان IPv6 ولكن لا يمكن الوصول إلى الإنترنت
الحل: تحقق من أن جدول التوجيه لديه مسار ::/0 إلى IGW، وتحقق من أن مجموعة الأمان تسمح بـ IPv6 الصادر
المشكلة: موازن التحميل لا يحتوي على سجل AAAA
الحل: تأكد من تعيين ip-address-type إلى dualstack، وتحقق من أن الشبكات الفرعية لديها كتل CIDR لـ IPv6
المشكلة: لا يمكن SSH إلى الحالة عبر IPv6
الحل: أضف قاعدة مجموعة أمان تسمح بمنفذ TCP 22 من ::/0 أو CIDR IPv6 محدد
المشكلة: بوابة الخروج فقط لا تعمل الحل: تحقق من ربط جدول التوجيه، وتحقق من أن الحالة لديها عنوان IPv6 معين
المشكلة: CloudFront لا يخدم عبر IPv6 الحل: IPv6 لـ CloudFront تلقائي ولا يمكن تعطيله — تحقق من حل DNS واتصال العميل
اعتبارات التكلفة#
IPv6 نفسه مجاني على AWS. لا تدفع مقابل كتل CIDR لـ IPv6 أو العناوين.
تكاليف نقل البيانات هي نفسها لكل من IPv4 و IPv6. لا توجد ميزة تسعير لـ IPv6 — الفائدة هي البساطة المعمارية وتجنب استنزاف IPv4.
بوابات الإنترنت للخروج فقط مجانية (على عكس بوابات NAT التي تكلف ~$0.045/ساعة بالإضافة إلى رسوم معالجة البيانات).
مقالات ذات صلة#
- IPv6 في AWS و Azure و GCP — نظرة عامة على IPv6 متعدد السحابة
- أفضل ممارسات IPv6 — إرشادات نشر الإنتاج
- دليل ترحيل مضاعف المكدس — الانتقال من IPv4 فقط إلى مضاعف المكدس