إنشاء مثيلات أجهزة افتراضية متوافقة مع IPv6 فقط وتفعيل NAT64/DNS64

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]

البنية العامة للمختبر

63e4293e033da8d3.png

لتوضيح كيفية تفاعل 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 حتى الآن. نفِّذ الأوامر التالية في Cloud Shell.

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 

إنشاء شبكات فرعية

أنشئ شبكة فرعية متوافقة مع الإصدار السادس من بروتوكول الإنترنت (IPv6) فقط، وشبكة فرعية متوافقة مع عناوين ULA الإصدار السادس من بروتوكول الإنترنت (IPv6) فقط، وشبكة فرعية متوافقة مع عناوين 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 تلقائيًا استخدِم الأمر التالي في cloudshell لتنفيذ 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. استمر في الضغط على مفتاح Enter إلى أن يتم إنشاء المفتاح وتنفيذ أمر 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

نلاحظ ثلاثة إدخالات في جدول التوجيه

  1. مسار /65 للشبكة الفرعية GUA التي تنتمي إليها الآلة الافتراضية مع قفزة تالية مشتقة باستخدام عنوان محلي للرابط لبوابة الإنترنت التلقائية يُرجى العِلم أنّ النطاق ‎ /65 العلوي محجوز لموازنات تحميل الشبكة التي تتيح بروتوكول IPv6.
  2. مسار /64 مدمج للبادئة fe80::/64 أحادية الإرسال المحلية
  3. مسار تلقائي يشير إلى عنوان الرابط المحلي للبوابة التلقائية للشبكة الفرعية

لنلقِ نظرة على جدول توجيه 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

اختبارات نظام أسماء النطاقات

اختبِر التحويل باستخدام نظام أسماء النطاقات (DNS) لموقع إلكتروني متوافق مع الإصدار السادس من بروتوكول الإنترنت (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

اختبِر التحويل باستخدام نظام أسماء النطاقات (DNS) لموقع إلكتروني متوافق مع الإصدار الرابع من بروتوكول الإنترنت (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

أولاً، عليك استخدام SSH للوصول إلى مثيل ULA "ula-instance".

gcloud compute ssh ula-instance --project $projectname --zone $zonename

<username>@ula-instance:~$

اختبارات نظام أسماء النطاقات

اختبِر التحويل باستخدام نظام أسماء النطاقات (DNS) لموقع إلكتروني متوافق مع الإصدار السادس من بروتوكول الإنترنت (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

اختبِر التحويل باستخدام نظام أسماء النطاقات (DNS) لموقع إلكتروني متوافق مع الإصدار الرابع من بروتوكول الإنترنت (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 فقط لأنّ مثيل IPv6 فقط لا يمكنه الوصول إلى أي عنوان IPv4، ويحدث انتهاء مهلة بسبب ذلك.

لنختبر الآن إمكانية الوصول عبر الإصدار السادس من بروتوكول الإنترنت (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 من جهاز افتراضي (VM) ذي عنوان 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 يعمل. نفِّذ الأمر التالي داخل الجهاز الظاهري الذي يعمل بمكدّس بروتوكول مزدوج:

<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 لأنّ NAT64، مثل DNS64، يتطلّب أيضًا أن يكون الجهاز الافتراضي متوافقًا مع الإصدار السادس من بروتوكول الإنترنت (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 من بروتوكول الإنترنت فقط على الإنترنت.

ما هي الخطوات التالية؟

اطّلِع على بعض دروس الترميز التطبيقية هذه...

محتوى إضافي للقراءة والفيديوهات

المستندات المرجعية