1. مقدمة
من التحديات الرئيسية التي تواجه عملية الانتقال إلى IPv6 الحفاظ على إمكانية الوصول إلى نقاط النهاية والشبكات التي تستخدم IPv4 فقط. من التقنيات الرائدة لمواجهة هذا التحدي الجمع بين استخدام DNS64 (المحدّد في RFC6147) لترجمة سجلّات A إلى سجلّات AAAA للعملاء، ثم يتم الجمع بين ذلك وبين NAT64 (المحدّد في RFC6146) لترجمة عناوين IPv6 المنسّقة خصيصًا إلى IPv4 حيث يتم تضمين عنوان IPv4 في عنوان IPv6 الخاص. يرشد هذا الدرس العملي المستخدم إلى كيفية ضبط الميزتَين على شبكة سحابة إلكترونية خاصة افتراضية (VPC) في Google Cloud Platform (GCP). عند إعداد GCP NAT64 وDNS64 معًا، تسمح هذه الخدمات للأجهزة الافتراضية التي تستخدم IPv6 فقط بالتواصل مع الخوادم التي تستخدم IPv4 فقط على الإنترنت.
في هذا التمرين، ستُعدّ شبكة VPC تتضمّن أنواعًا مختلفة من الشبكات الفرعية والمثيلات التي تستخدم IPv6 : عنوان GUA (عنوان البث الأحادي العام) الذي يستخدم IPv6 فقط، وعنوان ULA (عنوان محلي فريد) الذي يستخدم IPv6 فقط، وعنوان ULA ثنائي الحزمة. بعد ذلك، عليك ضبط خدمات DNS64 وNAT64 المُدارة من Google Cloud واختبارها للوصول إلى المواقع الإلكترونية التي تستخدم IPv4 فقط.
2. أهداف الدورة التعليمية
- كيفية إنشاء شبكات فرعية ومثيلات IPv6 فقط
- كيفية تفعيل خدمة DNS64 المُدارة من Google Cloud لشبكة VPC
- كيفية إنشاء بوابة NAT على Google Cloud تم إعدادها لاستخدام NAT64
- كيفية اختبار تحليل DNS64 من مثيلات IPv6 فقط إلى وجهات IPv4 فقط
- كيف يختلف سلوك DNS64 وNAT64 بين مثيلات الحزمة الفردية والحزمة المزدوجة؟
- كيفية إعداد بوابة NAT لـ NAT64
- كيفية اختبار اتصال NAT64 من مثيلات IPv6 فقط إلى وجهات IPv4 فقط
3- قبل البدء
تعديل المشروع ليتوافق مع الدرس التطبيقي العملي
يستفيد هذا الدرس التطبيقي حول الترميز من $variables للمساعدة في تنفيذ عملية إعداد gcloud في Cloud Shell.
داخل Cloud Shell، نفِّذ ما يلي
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
export projectname=$(gcloud config list --format="value(core.project)")
export zonename=[COMPUTE ZONE NAME]
export regionname=[REGION NAME]
البنية العامة للمختبر
لتوضيح كيفية تفاعل NAT64 وDNS64 مع أنواع مختلفة من الشبكات الفرعية IPv6، عليك إنشاء شبكة VPC واحدة مع شبكات فرعية IPv6 بنوعَي GUA وULA. ستنشئ أيضًا شبكة فرعية ثنائية الحزمة (باستخدام عناوين ULA) لتوضيح كيف لا ينطبق كلّ من DNS64 وNAT64 على الأجهزة الافتراضية ثنائية الحزمة.
بعد ذلك، عليك ضبط DNS64 وNAT64 واختبار الاتصال بوجهات IPv6 وIPv4 على الإنترنت.
4. خطوات التحضير
أولاً، عليك إعداد حساب الخدمة و"إدارة الهوية وإمكانية الوصول" وبنية الشبكة الأساسية والآلات الافتراضية اللازمة في مشروعك على Google Cloud.
إنشاء حساب خدمة وعمليات ربط في "إدارة الهوية وإمكانية الوصول"
نبدأ بإنشاء حساب خدمة جديد للسماح للأجهزة الافتراضية بالاتصال ببعضها البعض عبر SSH باستخدام gcloud. نحتاج إلى هذه الإمكانية لأنّه لا يمكننا استخدام IAP للوصول إلى مثيل GUA الذي يستخدم بروتوكول IPv6 فقط، ولا يسمح Cloud Shell بالوصول المباشر إلى بروتوكول IPv6 حتى الآن. نفِّذ الأوامر التالية في cloudshell.
gcloud iam service-accounts create ipv6-codelab \
--description="temporary service account for a codelab" \
--display-name="ipv6codelabSA" \
--project $projectname
gcloud projects add-iam-policy-binding $projectname \
--member=serviceAccount:ipv6-codelab@$projectname.iam.gserviceaccount.com \
--role=roles/compute.instanceAdmin.v1
gcloud iam service-accounts add-iam-policy-binding \
ipv6-codelab@$projectname.iam.gserviceaccount.com \
--member=serviceAccount:ipv6-codelab@$projectname.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountUser
إنشاء شبكة VPC وتفعيل ULA
أنشِئ شبكة VPC مع وضع شبكة فرعية مخصّص وفعِّل عنوان IPv6 الداخلي الفريد على مستوى العالم(ULA) عن طريق تنفيذ الأوامر التالية في Cloud Shell.
gcloud compute networks create ipv6-only-vpc \
--project=$projectname \
--subnet-mode=custom \
--mtu=1500 --bgp-routing-mode=global \
--enable-ula-internal-ipv6
إنشاء قواعد جدار الحماية
أنشئ قواعد جدار الحماية للسماح بالوصول إلى بروتوكول SSH. تسمح إحدى القواعد باستخدام SSH من نطاق ULA الإجمالي (fd20::/20). تسمح قاعدتان أخريان بمرور الزيارات من نطاقات IPv6 وIPv4 المحدّدة مسبقًا في IAP (2600:2d00:1:7::/64 و35.235.240.0/20 على التوالي).
نفِّذ الأوامر التالية في Cloud Shell:
gcloud compute firewall-rules create allow-v6-ssh-ula \
--direction=INGRESS --priority=200 \
--network=ipv6-only-vpc --action=ALLOW \
--rules=tcp:22 --source-ranges=fd20::/20 \
--project=$projectname
gcloud compute firewall-rules create allow-v6-iap \
--direction=INGRESS --priority=300 \
--network=ipv6-only-vpc --action=ALLOW \
--rules=tcp --source-ranges=2600:2d00:1:7::/64 \
--project=$projectname
gcloud compute firewall-rules create allow-v4-iap \
--direction=INGRESS --priority=300 \
--network=ipv6-only-vpc --action=ALLOW \
--rules=tcp --source-ranges=35.235.240.0/20 \
--project=$projectname
إنشاء شبكات فرعية
أنشئ شبكة فرعية مخصّصة لبروتوكول GUA الإصدار 6 فقط، وشبكة فرعية مخصّصة لبروتوكول ULA الإصدار 6 فقط، وشبكة فرعية مخصّصة لبروتوكول ULA ثنائي الحزمة. نفِّذ الأوامر التالية في Cloud Shell:
gcloud compute networks subnets create gua-v6only-subnet \
--network=ipv6-only-vpc \
--project=$projectname \
--stack-type=IPV6_ONLY \
--ipv6-access-type=external \
--region=$regionname
gcloud compute networks subnets create ula-v6only-subnet \
--network=ipv6-only-vpc \
--project=$projectname \
--stack-type=IPV6_ONLY \
--ipv6-access-type=internal \
--enable-private-ip-google-access \
--region=$regionname
gcloud compute networks subnets create ula-dualstack-subnet \
--network=ipv6-only-vpc \
--project=$projectname \
--stack-type=IPV4_IPV6 \
--range=10.120.0.0/16 \
--ipv6-access-type=internal \
--region=$regionname
إنشاء مثيلات
أنشئ مثيلات في كل شبكة فرعية أنشأتها للتو. يتم تحديد مثيل ULA الذي يستخدم IPv6 فقط باستخدام cloud-platform للسماح لنا باستخدامه كخادم وسيط لمثيل GUA الذي يستخدم IPv6 فقط. نفِّذ الأوامر التالية في Cloud Shell:
gcloud compute instances create gua-instance \
--subnet gua-v6only-subnet \
--stack-type IPV6_ONLY \
--zone $zonename \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--service-account=ipv6-codelab@$projectname.iam.gserviceaccount.com \
--project=$projectname
gcloud compute instances create ula-instance \
--subnet ula-v6only-subnet \
--stack-type IPV6_ONLY \
--zone $zonename \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--service-account=ipv6-codelab@$projectname.iam.gserviceaccount.com \
--project=$projectname
gcloud compute instances create dualstack-ula-instance \
--subnet ula-dualstack-subnet \
--stack-type IPV4_IPV6 \
--zone $zonename \
--project=$projectname
الوصول إلى الجهاز الافتراضي وإعداده في البداية
يمكنك استخدام SSH للوصول إلى مثيل ULA الذي سيستخدم IAP تلقائيًا. استخدِم الأمر التالي في Cloud Shell لتنفيذ SSH إلى مثيل ULA:
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$
سنستخدم أيضًا مثيل ULA كخادم وسيط لمثيل GUA (لأنّ خدمة IAP لا تعمل مع مثيلات GUA ولا يمكن لأجهزة Cloudshell الافتراضية الوصول إلى وجهات IPv6).
أثناء البقاء داخل غلاف مثيل ULA حاوِل فتح SSH في مثيل GUA باستخدام أمر gcloud التالي.
في المرة الأولى التي تنفّذ فيها أمر SSH داخل آلة افتراضية، سيُطلب منك إعداد زوج مفاتيح SSH. استمر في الضغط على مفتاح الإدخال إلى أن يتم إنشاء المفتاح وتنفيذ أمر SSH، ما يؤدي إلى إنشاء زوج مفاتيح جديد بدون عبارة مرور.
ula-instance:~$ gcloud compute ssh gua-instance
WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/galhabian/.ssh/google_compute_engine
Your public key has been saved in /home/galhabian/.ssh/google_compute_engine.pub
The key fingerprint is:
SHA256:5PYzydjcpWYiFtzetYCBI6vmy9dqyLsxgDORkB9ynqY galhabian@ula-instance
The key's randomart image is:
+---[RSA 3072]----+
|.. |
|+.o . |
|o= o . + . |
| o= * o o |
|+o. . S o . o |
|Eo . . . O + = . |
| .=. .+ @ * . |
| +ooo... * |
| **.. |
+----[SHA256]-----+
في حال نجاح العملية، سيتم تنفيذ أمر SSH بنجاح وستتمكّن من استخدام SSH في مثيل GUA بنجاح:
Updating instance ssh metadata...done.
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.3639038240056074485' (ED25519) to the list of known hosts.
Linux gua-instance 6.1.0-34-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.135-1 (2025-04-25) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
<username>@gua-instance:~$
5- فحص مثيلات IPv6 فقط
لنفحص كلتا الآلتين الافتراضيتين اللتين تستخدمان IPv6 فقط من خلال الاتصال بهما عبر SSH وفحص جداول التوجيه الخاصة بهما.
فحص مثيل GUA
يمكنك استخدام SSH في "gua-instance" من خلال الانتقال إلى مثيل "ula-instance" أولاً.
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$ gcloud compute ssh gua-instance
لنلقِ نظرة على جدول توجيه IPv6 الخاص بالجهاز الظاهري باستخدام الأمر التالي
<username>@gua-instance:~$ ip -6 route
2600:1900:4041:461::/65 via fe80::56:11ff:fef9:88c1 dev ens4 proto ra metric 100 expires 81sec pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::56:11ff:fef9:88c1 dev ens4 proto ra metric 100 expires 81sec mtu 1500 pref medium
نلاحظ ثلاثة إدخالات في جدول التوجيه
- مسار /65 لشبكة GUA الفرعية التي تنتمي إليها الآلة الافتراضية مع تحديد عنوان الوثبة التالية باستخدام عنوان محلي للرابط لعنوان البوابة التلقائي تذكَّر أنّ النطاق /65 العلوي محجوز لموازنات تحميل الشبكة التي تتيح بروتوكول IPv6.
- مسار /64 مدمج للبادئة fe80::/64 أحادية الإرسال المحلية
- مسار تلقائي يشير إلى عنوان الرابط المحلي للبوابة التلقائية للشبكة الفرعية
لنلقِ نظرة على جدول توجيه IPv4 من خلال تنفيذ هذا الأمر
<username>@gua-instance:~$ ip -4 route
default via 169.254.1.1 dev ens4 proto dhcp src 169.254.1.2 metric 100
169.254.1.1 dev ens4 proto dhcp scope link src 169.254.1.2 metric 100
169.254.169.254 via 169.254.1.1 dev ens4 proto dhcp src 169.254.1.2 metric 100
هل هذا مفاجئ؟ في الواقع، نحتفظ بجدول توجيه IPv4 في مثيلات IPv6 فقط للسماح بالوصول إلى خادم البيانات الوصفية من Compute Engine (169.254.169.154) لأنّه لا يزال نقطة نهاية IPv4 فقط.
وذلك لأنّ المثيل يتولّى عنوان IP 169.254.1.2 عندما يكون مثيلاً من الإصدار السادس من بروتوكول الإنترنت فقط. لا يمكن توجيه عنوان IP هذا إلى أي مكان سوى خادم البيانات الوصفية Compute، لذا يتم عزل الجهاز الظاهري بشكل فعّال عن جميع شبكات IPv4.
اختبارات Curl
لنختبر إمكانية الاتصال الفعلي بالمواقع الإلكترونية التي تستخدم الإصدار 4 فقط والإصدار 6 فقط باستخدام curl.
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
في ما يلي نموذج للناتج.
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
* Trying [2600:9000:20be:cc00:9:ec55:a1c0:93a1]:80...
* Connected to v6.ipv6test.app (2600:9000:20be:cc00:9:ec55:a1c0:93a1) port 80 (#0)
> GET / HTTP/1.1
> Host: v6.ipv6test.app
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
!! Rest of output truncated
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
* Trying 3.163.165.4:80...
* ipv4 connect timeout after 4985ms, move on!
* Trying 3.163.165.50:80...
* ipv4 connect timeout after 2492ms, move on!
* Trying 3.163.165.127:80...
* ipv4 connect timeout after 1246ms, move on!
* Trying 3.163.165.37:80...
* ipv4 connect timeout after 1245ms, move on!
* Failed to connect to v4.ipv6test.app port 80 after 10000 ms: Timeout was reached
* Closing connection 0
curl: (28) Failed to connect to v4.ipv6test.app port 80 after 10000 ms: Timeout was reached
وكما هو متوقّع، لا يمكن الوصول إلى نقطة نهاية إنترنت IPv4 من مثيل IPv6 فقط. بدون توفير DNS64 وNAT64، لا يتوفّر للمثيل الذي يستخدم IPv6 فقط مسار إلى وجهة IPv4. يمكن الوصول إلى وجهة IPv6 بشكل طبيعي لأنّ الجهاز الافتراضي يتضمّن عنوان IPv6 من نوع GUA.
فحص نسخة ULA
تسجيل الدخول إلى الجهاز الظاهري "ula-instance" باستخدام SSH (يستخدم IAP تلقائيًا)
gcloud compute ssh ula-instance --project $projectname --zone $zonename
لنلقِ نظرة على جدول توجيه IPv6 الخاص بالجهاز الظاهري باستخدام الأمر التالي
<username>@ula-instance:~$ ip -6 route
fd20:f06:2e5e:2000::/64 via fe80::55:82ff:fe6b:1d7 dev ens4 proto ra metric 100 expires 84sec pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::55:82ff:fe6b:1d7 dev ens4 proto ra metric 100 expires 84sec mtu 1500 pref medium
نلاحظ ثلاثة إدخالات في جدول التوجيه، على غرار مثيل GUA، باستثناء القناع الذي يبلغ /64 بدلاً من /65. وينتمي مسار الشبكة الفرعية إلى نطاق ULA. (ضمن مجموعة fd20::/20)
لنلقِ نظرة على جدول توجيه IPv4 من خلال تنفيذ هذا الأمر
<username>@ula-instance:~$ ip -4 route
default via 169.254.1.1 dev ens4 proto dhcp src 169.254.1.2 metric 100
169.254.1.1 dev ens4 proto dhcp scope link src 169.254.1.2 metric 100
169.254.169.254 via 169.254.1.1 dev ens4 proto dhcp src 169.254.1.2 metric 100
التي تعرض حالة مشابهة لمثيل GUA.
اختبارات Curl
تكرار اختبارات الاتصال بالمواقع الإلكترونية التي تستخدم الإصدار 4 فقط والإصدار 6 فقط باستخدام curl
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
في ما يلي نموذج للناتج.
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
* Trying [2600:9000:20be:8400:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 4986ms, move on!
* Trying [2600:9000:20be:9000:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 2493ms, move on!
* Trying [2600:9000:20be:d600:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 1246ms, move on!
* Trying [2600:9000:20be:b000:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 622ms, move on!
* Trying [2600:9000:20be:7200:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 312ms, move on!
* Trying [2600:9000:20be:8600:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 155ms, move on!
* Trying [2600:9000:20be:7a00:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 77ms, move on!
* Trying [2600:9000:20be:ce00:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 77ms, move on!
* Failed to connect to v6.ipv6test.app port 80 after 10000 ms: Timeout was reached
* Closing connection 0
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
* Trying 3.163.165.4:80...
* ipv4 connect timeout after 4985ms, move on!
* Trying 3.163.165.50:80...
* ipv4 connect timeout after 2492ms, move on!
* Trying 3.163.165.127:80...
* ipv4 connect timeout after 1246ms, move on!
* Trying 3.163.165.37:80...
* ipv4 connect timeout after 1245ms, move on!
* Failed to connect to v4.ipv6test.app port 80 after 10000 ms: Timeout was reached
* Closing connection 0
curl: (28) Failed to connect to v4.ipv6test.app port 80 after 10000 ms: Timeout was reached
في حالة مثيل ULA، لا يمكن الوصول إلى كلتا نقطتَي نهاية الإنترنت لأنّه بالنسبة إلى نقطة نهاية IPv6، لا يمكننا استخدام عنوان ULA للتواصل مع الخارج، ولا يمكن الوصول إلى IPv4 من المثيل لأنّه مثيل IPv6 فقط.
6. تفعيل NAT64 وDNS64
اضبط خدمات DNS64 وNAT64 المُدارة لشبكة VPC.
DNS64
فعِّل سياسة خادم DNS64 لشبكة VPC . يطلب ذلك من برنامج تعيين نظام أسماء النطاقات في السحابة الخاصة الافتراضية (VPC) إنشاء سجلّات AAAA للردود التي تتضمّن سجلّات A فقط. نفِّذ الأوامر التالية في Cloud Shell:
gcloud beta dns policies create allow-dns64 \
--description="Enable DNS64 Policy" \
--networks=ipv6-only-vpc \
--enable-dns64-all-queries \
--project $projectname
NAT64
أنشئ جهاز توجيه Cloud Router، وهو أمر ضروري لاستخدام Cloud NAT . بعد ذلك، أنشئ بوابة Cloud NAT تم ضبطها على NAT64، وفعِّلها لجميع نطاقات عناوين IP للشبكات الفرعية التي تستخدم IPv6 فقط، وخصِّص عناوين IP خارجية تلقائيًا. نفِّذ الأوامر التالية في Cloud Shell:
gcloud compute routers create nat64-router \
--network=ipv6-only-vpc \
--region=$regionname \
--project=$projectname
gcloud beta compute routers nats create nat64-natgw \
--router=nat64-router \
--region=$regionname \
--auto-allocate-nat-external-ips \
--nat64-all-v6-subnet-ip-ranges \
--project=$projectname
7. اختبار NAT64 وDNS64
لنختبر الآن إعداد NAT64 وDNS64 من مثيلات IPv6 فقط، بدءًا بمثيل GUA ثم مثيل ULA.
اختبار DNS64/NAT64 من مثيل GUA
يمكنك استخدام SSH في "gua-instance" من خلال الانتقال إلى مثيل "ula-instance" أولاً.
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$ gcloud compute ssh gua-instance
اختبارات نظام أسماء النطاقات
اختبِر دقة نظام أسماء النطاقات لموقع إلكتروني يستخدم IPv6 فقط (مثل v6.ipv6test.app ولكن يجب أن يؤدي أي موقع إلكتروني متاح عبر IPv6 فقط إلى نتيجة مشابهة).
<username>@gua-instance:~$ host -t AAAA v6.ipv6test.app
<username>@gua-instance:~$ host -t A v6.ipv6test.app
نتوقّع أن يتم عرض إجابات AAAA التي تتضمّن IPv6 فقط.
مثال على الناتج
<username>@gua-instance:~$ host -t AAAA v6.ipv6test.app
v6.ipv6test.app has IPv6 address 2600:9000:269f:1000:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:6600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:b600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:3e00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:9c00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:b200:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:a600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:1400:9:ec55:a1c0:93a1
<username>@gua-instance:~$ host -t A v6.ipv6test.app
v6.ipv6test.app has no A record
اختبِر التحويل باستخدام نظام أسماء النطاقات لموقع إلكتروني يستخدم IPv4 فقط (مثل v4.ipv6test.app). من المتوقّع أن يتضمّن الردّ سجلّ A (الإصدار الرابع من بروتوكول الإنترنت الأصلي) وسجلّ AAAA تم إنشاؤه بواسطة DNS64 باستخدام البادئة المعروفة 64:ff9b::/96 .
<username>@gua-instance:~$ host -t AAAA v4.ipv6test.app
<username>@gua-instance:~$ host -t A v4.ipv6test.app
مثال على الناتج
<username>@gua-instance:~$ host -t AAAA v4.ipv6test.app
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3318
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3344
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:333c
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3326
<username>@gua-instance:~$ host -t A v4.ipv6test.app
v4.ipv6test.app has address 54.192.51.68
v4.ipv6test.app has address 54.192.51.24
v4.ipv6test.app has address 54.192.51.60
v4.ipv6test.app has address 54.192.51.38
في المثال أعلاه، سيتم تحويل عنوان IPv4 (54.192.51.38) في النظام العشري إلى (36 c0 33 26) في النظام الست عشري، وبالتالي نتوقّع أن تكون إجابة سجلّ AAAA هي (64:ff9b::36c0:3326)، وهي تطابق إحدى إجابات AAAA التي تلقّيناها.
اختبارات Curl
لنختبر الاتصال الفعلي بنقاط النهاية نفسها التي تستخدم الإصدار 4 فقط والإصدار 6 فقط باستخدام curl عبر IPv6
<username>@gua-instance:~$ curl -vv -6 v6.ipv6test.app
<username>@gua-instance:~$ curl -vv -6 v4.ipv6test.app
في ما يلي نموذج للناتج.
<username>@gua-instance:~$ curl -vv -6 v6.ipv6test.app
* Trying [2600:9000:269f:1000:9:ec55:a1c0:93a1]:80...
* Connected to v6.ipv6test.app (2600:9000:269f:1000:9:ec55:a1c0:93a1) port 80 (#0)
> GET / HTTP/1.1
##
## <Output truncated for brevity>
##
<username>@gua-instance:~$ curl -vv -6 v4.ipv6test.app
* Trying [64:ff9b::36c0:333c]:80...
* Connected to v4.ipv6test.app (64:ff9b::36c0:333c) port 80 (#0)
> GET / HTTP/1.1
##
## <Output truncated for brevity>
##
نجاح كلا الأمرَين curl لاحظ كيف كان من الممكن الاتصال بموقع إلكتروني يستخدم IPv4 فقط عبر IPv6، وذلك بفضل عمل NAT64 وDNS64 معًا لإتاحة الاتصال بنجاح.
التحقّق من عناوين IP المصدر
لنستخدِم خدمة عكس عنوان IP للتحقّق من عنوان IP المصدر الذي رصده الوجهة .
<username>@gua-instance:~$ curl -6 v4.ipv6test.app
<username>@gua-instance:~$ curl -6 v6.ipv6test.app
مثال على الناتج
<username>@gua-instance:~$ curl -6 v4.ipv6test.app
34.47.60.91
<username>@gua-instance:~$ curl -6 v6.ipv6test.app
2600:1900:40e0:6f:0:1::
يجب أن يتطابق عنوان IPv6 الذي تم إدخاله مع عنوان IPv6 الخاص بالجهاز الظاهري . يجب أن يتطابق هذا العنوان مع ناتج الأمر "ip -6 address" على الجهاز الظاهري. على سبيل المثال
<username>@gua-instance:~$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2600:1900:40e0:6f:0:1::/128 scope global dynamic noprefixroute
valid_lft 79912sec preferred_lft 79912sec
inet6 fe80::86:d9ff:fe34:27ed/64 scope link
valid_lft forever preferred_lft forever
ومع ذلك، يجب أن يتطابق عنوان IPv4 الذي تم الإبلاغ عنه مع عنوان IP الخارجي لبوابة Cloud NAT لأنّها تنفّذ وظيفة NAT64 قبل الخروج إلى الإنترنت. يمكن التحقّق من ذلك من خلال تنفيذ أمر gcloud التالي في Cloud Shell
gcloud compute routers get-nat-ip-info \
nat64-router \
--region=$regionname
مثال على الناتج
result:
- natIpInfoMappings:
- mode: AUTO
natIp: 34.47.60.91
usage: IN_USE
natName: nat64-natgw
يُرجى العِلم أنّ قيمة "natIp" المُسجّلة في الناتج تتطابق مع الناتج الذي تم تلقّيه من الموقع الإلكتروني لعكس عنوان IP.
اختبار DNS64/NAT64 من مثيل ULA
أولاً، اتّصِل بمثيل ULA "ula-instance" باستخدام بروتوكول SSH
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$
اختبارات نظام أسماء النطاقات
اختبِر دقة نظام أسماء النطاقات لموقع إلكتروني يستخدم IPv6 فقط (مثل v6.ipv6test.app ولكن يجب أن يؤدي أي موقع إلكتروني متاح عبر IPv6 فقط إلى نتيجة مشابهة).
<username>@ula-instance:~$ host -t AAAA v6.ipv6test.app
<username>@ula-instance:~$ host -t A v6.ipv6test.app
نتوقّع أن يتم عرض إجابات AAAA التي تتضمّن IPv6 فقط.
مثال على الناتج
<username>@ula-instance:~$ host -t AAAA v6.ipv6test.app
v6.ipv6test.app has IPv6 address 2600:9000:269f:1000:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:6600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:b600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:3e00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:9c00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:b200:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:a600:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:1400:9:ec55:a1c0:93a1
<username>@ula-instance:~$ host -t A v6.ipv6test.app
v6.ipv6test.app has no A record
اختبِر التحويل باستخدام نظام أسماء النطاقات لموقع إلكتروني يستخدم IPv4 فقط (مثل v4.ipv6test.app). من المتوقّع أن يتضمّن الردّ سجلّ A (الإصدار الرابع من بروتوكول الإنترنت الأصلي) وسجلّ AAAA تم إنشاؤه بواسطة DNS64 باستخدام البادئة المعروفة 64:ff9b::/96 .
<username>@ula-instance:~$ host -t AAAA v4.ipv6test.app
<username>@ula-instance:~$ host -t A v4.ipv6test.app
مثال على الناتج
<username>@gua-instance:~$ host -t AAAA v4.ipv6test.app
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3318
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3344
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:333c
v4.ipv6test.app has IPv6 address 64:ff9b::36c0:3326
<username>@gua-instance:~$ host -t A v4.ipv6test.app
v4.ipv6test.app has address 54.192.51.68
v4.ipv6test.app has address 54.192.51.24
v4.ipv6test.app has address 54.192.51.60
v4.ipv6test.app has address 54.192.51.38
في المثال أعلاه، سيتم تحويل عنوان IPv4 (54.192.51.38) في النظام العشري إلى (36 c0 33 26) في النظام الست عشري، وبالتالي نتوقّع أن تكون إجابة سجلّ AAAA هي (64:ff9b::36c0:3326)، وهي تطابق إحدى إجابات AAAA التي تلقّيناها.
اختبارات Curl
لنختبر إمكانية الاتصال الفعلية بنقاط النهاية نفسها التي تستخدم الإصدار 4 فقط والإصدار 6 فقط باستخدام curl.
كنقطة بداية، لنوضّح أنّه لا يمكن الوصول إلى الإصدار الرابع من بروتوكول الإنترنت (IPv4) لأنّ الجهاز الظاهري هو جهاز ظاهري للإصدار السادس من بروتوكول الإنترنت (IPv6) فقط.
<username>@ula-instance:~$ curl -vv -4 --connect-timeout 10 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv -4 --connect-timeout 10 v4.ipv6test.app
في حين سيتعذّر تنفيذ كلتا العمليتَين. وسيتعذّر تنفيذها لأسباب مختلفة. في ما يلي نموذج للناتج.
<username>@ula-instance:~$ curl -vv -4 v6.ipv6test.app
* Could not resolve host: v6.ipv6test.app
* Closing connection 0
curl: (6) Could not resolve host: v6.ipv6test.app
<username>@ula-instance:~$ curl -vv -4 --connect-timeout 10 v4.ipv6test.app
* Trying 54.192.51.68:80...
* ipv4 connect timeout after 4993ms, move on!
* Trying 54.192.51.38:80...
* ipv4 connect timeout after 2496ms, move on!
* Trying 54.192.51.24:80...
* ipv4 connect timeout after 1248ms, move on!
* Trying 54.192.51.60:80...
* Connection timeout after 10000 ms
* Closing connection 0
curl: (28) Connection timeout after 10000 ms
يتعذّر تنفيذ طلب curl للإصدار 4 من بروتوكول الإنترنت (IPv4) إلى نقطة نهاية للإصدار 6 من بروتوكول الإنترنت (IPv6) فقط لأنّ التحويل باستخدام نظام أسماء النطاقات (DNS) للسجلّ A يتعذّر (كما هو موضّح أثناء اختبارات نظام أسماء النطاقات). يتعذّر تنفيذ طلب curl لبروتوكول IPv4 إلى نقطة نهاية IPv4 فقط لأنّه لا يمكن الوصول إلى أي عنوان IPv4 من مثيل IPv6 فقط، ويحدث انتهاء مهلة بسبب ذلك.
الآن، لنختبر إمكانية الوصول عبر الإصدار السادس من بروتوكول الإنترنت (IPv6).
<username>@ula-instance:~$ curl -vv -6 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv -6 v4.ipv6test.app
في ما يلي نموذج للناتج.
<username>@ula-instance:~$ curl -vv -6 v6.ipv6test.app
* Trying [2600:9000:20be:c000:9:ec55:a1c0:93a1]:80...
* connect to 2600:9000:20be:c000:9:ec55:a1c0:93a1 port 80 failed: Connection timed out
* Trying [2600:9000:20be:f000:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 84507ms, move on!
* Trying [2600:9000:20be:ae00:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 42253ms, move on!
* Trying [2600:9000:20be:2000:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 21126ms, move on!
* Trying [2600:9000:20be:b600:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 10563ms, move on!
* Trying [2600:9000:20be:7600:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 5282ms, move on!
* Trying [2600:9000:20be:b000:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 2640ms, move on!
* Trying [2600:9000:20be:3400:9:ec55:a1c0:93a1]:80...
* ipv6 connect timeout after 2642ms, move on!
* Failed to connect to v6.ipv6test.app port 80 after 300361 ms: Timeout was reached
* Closing connection 0
<username>@ula-instance:~$ curl -vv -6 v4.ipv6test.app
* Trying [64:ff9b::36c0:333c]:80...
* Connected to v4.ipv6test.app (64:ff9b::36c0:333c) port 80 (#0)
> GET / HTTP/1.1
##
## <Output truncated for brevity>
##
في حين يتعذّر تنفيذ الأمر curl على الموقع الإلكتروني الذي يستخدم IPv6 فقط لأنّ الشبكات الفرعية التي تستخدم عناوين ULA لا يمكن الوصول إليها مباشرةً من الإنترنت. ينجح curl في الوصول إلى الموقع الإلكتروني الذي يستخدم IPv4 فقط لأنّ DNS64 وNAT64 تعملان بالطريقة نفسها مع مثيلات GUA وULA، والشرط الوحيد هو أن يكون المثيل IPv6 فقط.
اختبار DNS64/NAT64 من مثيل ULA مزدوج الحزمة
أولاً، يمكنك استخدام SSH للوصول إلى مثيل Dual-Stack ULA "dualstack-ula-instance". علينا استخدام العلامة "–tunnel-through-iap" لإجبار gcloud على استخدام عنوان IPv4 لخدمة IAP.
gcloud compute ssh dualstack-ula-instance --project $projectname --zone $zonename --tunnel-through-iap
<username>@dualstack-ula-instance:~$
لنختبر DNS64 الآن باستخدام الأداة المساعدة "host".
<username>@dualstack-ula-instance:~$ host v4.ipv6test.app
v4.ipv6test.app has address 54.192.51.38
v4.ipv6test.app has address 54.192.51.24
v4.ipv6test.app has address 54.192.51.68
v4.ipv6test.app has address 54.192.51.60
<username>@dualstack-ula-instance:~$ host v6.ipv6test.app
v6.ipv6test.app has IPv6 address 2600:9000:269f:fc00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:1c00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:a200:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:8a00:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:c800:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:c200:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:5800:9:ec55:a1c0:93a1
v6.ipv6test.app has IPv6 address 2600:9000:269f:dc00:9:ec55:a1c0:93a1
لاحظ كيف أنّ الموقع الإلكتروني الذي يستخدم IPv4 فقط يعرض الآن عناوين IPv4 فقط وليس إجابات DNS64 الاصطناعية بعد الآن. ويرجع ذلك إلى أنّ DNS64 لا يتم تطبيقه إلا على مثيلات IPv6 فقط، ولا يتم تقييمه للمثيلات ذات الحزمة المزدوجة.
لتجنُّب الحاجة إلى DNS64، لنضِف إدخالاً إلى ملف /etc/hosts لاختبار ما إذا كان NAT64 يعمل. نفِّذ الأمر التالي داخل الجهاز الظاهري الذي يتيح استخدام بروتوكولَي IPv4 وIPv6:
<username>@dualstack-ula-instance:~$ echo '64:ff9b::36c0:3326 v4.ipv6test.app' | sudo tee -a /etc/hosts
لنستخدِم curl لاختبار الوصول إلى موقع الويب الذي يستخدم IPv4 عبر IPv6
<username>@dualstack-ula-instance:~$ curl -vv -6 --connect-timeout 10 v4.ipv6test.app
في ما يلي نموذج للناتج من الأمر أعلاه
<username>@dualstack-ula-instance:~$ curl -vv -6 --connect-timeout 10 v4.ipv6test.app
* Trying [64:ff9b::36c0:3326]:80...
* ipv6 connect timeout after 10000ms, move on!
* Failed to connect to v4.ipv6test.app port 80 after 10001 ms: Timeout was reached
* Closing connection 0
curl: (28) Failed to connect to v4.ipv6test.app port 80 after 10001 ms: Timeout was reached
من المفترض أن تنتهي مهلة curl لأنّه مثل DNS64، يتطلّب NAT64 أيضًا أن تكون الآلة الافتراضية متوافقة مع الإصدار السادس من بروتوكول الإنترنت (IPv6) فقط لكي يتم تطبيقها.
للتأكّد من أنّ NAT64 لا ينطبق فعليًا على مثيل الحزمة المزدوجة، لنستخدِم الأمر "get-nat-mapping" لإدراج جميع عمليات ربط المنافذ التي تطبّقها بوابة NAT. نفِّذ الأوامر التالية في Cloud Shell:
gcloud compute routers get-nat-mapping-info \
nat64-router --region $regionname \
--project $projectname
من المفترض أن يظهر لك ناتج مشابه للمقتطف أدناه:
---
instanceName: gua-instance
interfaceNatMappings:
- natIpPortRanges:
- 34.47.60.91:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
sourceAliasIpRange: ''
sourceVirtualIp: '2600:1900:40e0:6f:0:1::'
- natIpPortRanges:
- 34.47.60.91:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
sourceAliasIpRange: ''
sourceVirtualIp: '2600:1900:40e0:6f:0:1::'
---
instanceName: ula-instance
interfaceNatMappings:
- natIpPortRanges:
- 34.47.60.91:1056-1087
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
sourceAliasIpRange: ''
sourceVirtualIp: fd20:9c2:93fc:2800:0:0:0:0
- natIpPortRanges:
- 34.47.60.91:32800-32831
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
sourceAliasIpRange: ''
sourceVirtualIp: fd20:9c2:93fc:2800:0:0:0:0
يوضّح الناتج من NAT أنّ بوابة NAT64 خصّصت منافذًا فقط لمثيلات GUA وULA التي تستخدم IPv6 فقط، وليس للمثيل الذي يستخدم كلا البروتوكولَين.
8. تَنظيم
تنظيف Cloud Router
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute routers delete nat64-router \
--region $regionname \
--project $projectname --quiet
إلغاء ربط سياسة نظام أسماء النطاقات وتنظيفها
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud beta dns policies update allow-dns64 \
--networks="" \
--project $projectname
gcloud beta dns policies delete allow-dns64 \
--project $projectname --quiet
تنظيف النُسخ
داخل Cloud Shell، نفِّذ ما يلي: (ملاحظة: يتم استخدام gcloud beta للسماح لنا باستخدام العلامة no-graceful-shutdown لإجراء عملية حذف أسرع للآلة الافتراضية)
gcloud beta compute instances delete gua-instance \
--zone $zonename \
--no-graceful-shutdown \
--project=$projectname --quiet
gcloud beta compute instances delete ula-instance \
--zone $zonename \
--no-graceful-shutdown \
--project=$projectname --quiet
gcloud beta compute instances delete dualstack-ula-instance \
--zone $zonename \
--no-graceful-shutdown \
--project=$projectname --quiet
تنظيم الشبكات الفرعية
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets delete gua-v6only-subnet \
--project=$projectname --quiet \
--region=$regionname
gcloud compute networks subnets delete ula-v6only-subnet \
--project=$projectname --quiet \
--region=$regionname
gcloud compute networks subnets delete ula-dualstack-subnet \
--project=$projectname --quiet \
--region=$regionname
تنظيف قواعد جدار الحماية
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute firewall-rules delete allow-v6-iap \
--project=$projectname \
--quiet
gcloud compute firewall-rules delete allow-v6-ssh-ula \
--project=$projectname \
--quiet
gcloud compute firewall-rules delete allow-v4-iap \
--project=$projectname \
--quiet
تنظيف شبكة VPC
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks delete ipv6-only-vpc \
--project=$projectname \
--quiet
تنظيف أذونات "إدارة الهوية وإمكانية الوصول" وحساب الخدمة
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud projects remove-iam-policy-binding $projectname \
--member=serviceAccount:ipv6-codelab@$projectname.iam.gserviceaccount.com \
--role=roles/compute.instanceAdmin.v1
gcloud iam service-accounts delete \
ipv6-codelab@$projectname.iam.gserviceaccount.com \
--quiet \
--project $projectname
9- تهانينا
لقد استخدمت NAT64 وDNS64 بنجاح للسماح للمثيلات التي تستخدم الإصدار 6 من بروتوكول الإنترنت فقط بالوصول إلى الوجهات التي تستخدم الإصدار 4 من بروتوكول الإنترنت فقط على الإنترنت.
ما هي الخطوات التالية؟
يمكنك الاطّلاع على بعض دروس الترميز التطبيقية هذه...
- الوصول إلى Google APIs من مضيفين محليين باستخدام عناوين IPv6
- خيارات عناوين IP IPv4 وIPv6
- استخدام مثيل القفزة التالية وعنوان القفزة التالية وبوابة القفزة التالية في مسارات IPv6 الثابتة