ایجاد نمونه های VM فقط IPv6 و فعال کردن NAT64/DNS64

1. مقدمه

یکی از چالش های اصلی مهاجرت به IPv6 حفظ دسترسی به نقاط پایانی و شبکه های فقط IPv4 است. یک فناوری پیشرو برای مقابله با این چالش، ترکیب استفاده از DNS64 (تعریف شده در RFC6147) برای ترجمه رکوردهای A به رکوردهای AAAA برای مشتریان است، سپس با NAT64 (تعریف شده در RFC6146) ترکیب می‌شود تا آدرس‌های IPv6 فرمت‌شده خاص را به IPv4 ترجمه کند که در آن آدرس IPv4، آدرس IPv6 ویژه تعبیه شده است. این آزمایشگاه کد کاربر را به پیکربندی هر دو ویژگی در یک ابر خصوصی مجازی (VPC) پلتفرم Google Cloud (GCP) راهنمایی می‌کند. وقتی GCP NAT64 و DNS64 با هم پیکربندی می شوند، به نمونه های فقط IPv6 اجازه می دهند با سرورهای فقط IPv4 در اینترنت ارتباط برقرار کنند.

در این آزمایشگاه، یک VPC با انواع مختلف زیرشبکه‌ها و نمونه‌های IPv6 راه‌اندازی خواهید کرد: GUA فقط IPv6 (آدرس جهانی Unicast)، فقط IPv6 ULA (آدرس محلی منحصر به فرد) و 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. قبل از شروع

پروژه را برای پشتیبانی از Codelab به روز کنید

این Codelab از متغیرهای $ برای کمک به پیاده سازی پیکربندی 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. مراحل آماده سازی

ابتدا، حساب سرویس، IAM، زیرساخت شبکه و نمونه‌های لازم را در پروژه Google Cloud خود تنظیم کنید.

ایجاد حساب سرویس و IAM Bindings

ما با ایجاد یک حساب سرویس جدید شروع می کنیم تا به نمونه ها اجازه دهیم با استفاده از gcloud به یکدیگر SSH کنند. ما به این توانایی نیاز داریم زیرا نمی‌توانیم از IAP برای دسترسی به نمونه GUA IPv6 استفاده کنیم و cloudshell هنوز اجازه دسترسی مستقیم به 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 ایجاد کنید.

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).

دستور(های) زیر را در cloudshell اجرا کنید:

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 v6، یک زیرشبکه فقط ULA v6 و یک زیرشبکه ULA دو پشته ایجاد کنید. دستور(های) زیر را در cloudshell اجرا کنید:

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 با پلتفرم ابری مشخص شده است تا به ما اجازه دهد از آن به عنوان یک جعبه پرش برای نمونه GUA فقط IPv6 استفاده کنیم. دستور(های) زیر را در cloudshell اجرا کنید:

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 هستید. با استفاده از دستور gcloud زیر، SSH را به نمونه GUA انجام دهید.

اولین باری که یک دستور 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 موفقیت آمیز خواهد بود و شما با موفقیت به نمونه 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 ابتدا با پریدن از نمونه "ula-instance" به "gua-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 که نمونه با یک hop بعدی مشتق شده با استفاده از یک آدرس لینک محلی برای دروازه پیش فرض به آن تعلق دارد. به یاد داشته باشید که 65/بالا برای متعادل کننده بار شبکه IPv6 Pass-Through محفوظ است
  2. یک مسیر داخلی /64 برای پیشوند پیوند محلی unicast 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 نگهداری می‌کنیم تا اجازه دسترسی به سرور فراداده محاسبه (169.254.169.154) را بدهیم زیرا هنوز یک نقطه پایانی فقط IPv4 است.

از آنجایی که این نمونه زمانی که یک نمونه فقط IPv6 است، IP 169.254.1.2 را می گیرد. این IP در جایی به جز سرور Compute Metadata قابل مسیریابی نیست، بنابراین نمونه به طور موثر از تمام شبکه های IPv4 جدا می شود.

تست های کرل

بیایید اتصال واقعی به وب‌سایت‌های فقط v4 و v6 را با استفاده از 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 را بررسی کنید

SSH به نمونه "ula-instance" (به طور پیش فرض از 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، به استثنای اینکه ماسک به جای 65/64/ است. و مسیر زیرشبکه به یک محدوده 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 نشان می دهد.

تست های کرل

تکرار تست های اتصال به وب سایت های فقط v4 و v6 با استفاده از 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 برای برقراری ارتباط استفاده کنیم، و این نمونه به عنوان یک نمونه فقط IPv6، قابلیت دسترسی به IPv4 ندارد.

6. NAT64 و DNS64 را فعال کنید

سرویس های مدیریت شده DNS64 و NAT64 را برای VPC خود پیکربندی کنید.

DNS64

خط مشی سرور DNS64 را برای VPC خود فعال کنید. این به حل‌کننده DNS VPC می‌گوید که رکوردهای AAAA را برای پاسخ‌های A-فقط ترکیب کند. دستور(های) زیر را در cloudshell اجرا کنید:

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های خارجی فعال می‌کند. دستور(های) زیر را در cloudshell اجرا کنید:

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 ابتدا با پریدن از نمونه "ula-instance" به "gua-instance".

gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$ gcloud compute ssh gua-instance

تست های DNS

وضوح DNS یک وب سایت فقط IPv6 را آزمایش کنید (به عنوان مثال، v6.ipv6test.app اما هر وب سایت فقط IPv6 باید نتیجه مشابهی داشته باشد).

<username>@gua-instance:~$ host -t AAAA v6.ipv6test.app
<username>@gua-instance:~$ host -t A v6.ipv6test.app

انتظار داریم فقط پاسخ های IPv6 AAAA برگردانده شوند.

خروجی نمونه

<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 (IPv4 اصلی) و هم یک رکورد 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 که دریافت کردیم مطابقت دارد.

تست های کرل

بیایید اتصال واقعی را به همان نقاط پایانی فقط v4 و فقط v6 با استفاده از curl over 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 منبع مشاهده شده توسط مقصد استفاده کنیم.

<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 خارجی دروازه NAT Cloud مطابقت داشته باشد زیرا قبل از ورود به اینترنت، عملکرد NAT64 را انجام می دهد. این را می توان با اجرای دستور gcloud در cloudshell تأیید کرد

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

وضوح DNS یک وب سایت فقط IPv6 را آزمایش کنید (به عنوان مثال، v6.ipv6test.app اما هر وب سایت فقط IPv6 باید نتیجه مشابهی داشته باشد).

<username>@ula-instance:~$ host -t AAAA v6.ipv6test.app
<username>@ula-instance:~$ host -t A v6.ipv6test.app

انتظار داریم فقط پاسخ های IPv6 AAAA برگردانده شوند.

خروجی نمونه

<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 (IPv4 اصلی) و هم یک رکورد 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 که دریافت کردیم مطابقت دارد.

تست های کرل

بیایید اتصال واقعی را به همان نقاط پایانی فقط v4 و فقط v6 با استفاده از 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

پیچیدگی IPv4 به نقطه پایانی فقط IPv6 با شکست مواجه می‌شود زیرا وضوح DNS برای رکورد A با شکست مواجه می‌شود (همانطور که در آزمایش‌های DNS نشان داده شد). پیچیدگی 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>
##

در حالی که پیچیدگی وب سایت فقط IPv6 با شکست مواجه می شود زیرا زیرشبکه های ULA دسترسی مستقیم به اینترنت ندارند. پیچیدگی وب‌سایت فقط IPv4 موفقیت‌آمیز است زیرا DNS64 و NAT64 برای نمونه‌های GUA و ULA یکسان عمل می‌کنند. تنها مورد نیاز این است که نمونه فقط IPv6 باشد.

تست DNS64/NAT64 از یک نمونه ULA Dual-Stack

ابتدا، SSH به نمونه ULA Dual-Stack "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 کار می کند یا خیر. دستور زیر را در داخل نمونه dual-stack اجرا کنید:

<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

کرل باید به پایان برسد زیرا درست مانند DNS64، NAT64 نیز برای اعمال نیاز دارد که این نمونه فقط IPv6 باشد.

برای تأیید اینکه NAT64 واقعاً برای نمونه dual-stack اعمال نمی‌شود، اجازه دهید از دستور «get-nat-mapping» برای فهرست کردن تمام نگاشت‌های پورتی که دروازه NAT اعمال می‌کند استفاده کنیم. دستور(های) زیر را در cloudshell اجرا کنید:

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

سیاست DNS را لغو و پاک کنید

در داخل 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 استفاده می‌شود تا ما را قادر می‌سازد تا از پرچم بدون برازنده خاموش کردن برای عملیات حذف سریع‌تر استفاده کنیم)

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

مجوزهای IAM و حساب سرویس را پاک کنید

در داخل 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 استفاده کرده اید تا به نمونه های فقط IPv6 اجازه دهید به مقصدهای فقط IPv4 در اینترنت برسند.

بعدش چی؟

برخی از این کدها را بررسی کنید...

ادامه مطلب و ویدیوها

اسناد مرجع