การสร้างอินสแตนซ์ VM ที่ใช้ IPv6 เท่านั้นและการเปิดใช้ NAT64/DNS64

1. บทนำ

ความท้าทายหลักอย่างหนึ่งในการย้ายข้อมูลไปยัง IPv6 คือการรักษาความสามารถในการเข้าถึงปลายทางและเครือข่ายที่ใช้ IPv4 เท่านั้น เทคโนโลยีชั้นนำที่ใช้แก้ปัญหานี้คือการใช้ DNS64 (กำหนดไว้ใน RFC6147) ร่วมกันเพื่อแปลระเบียน A เป็นระเบียน AAAA สำหรับไคลเอ็นต์ จากนั้นจึงใช้ร่วมกับ NAT64 (กำหนดไว้ใน RFC6146) เพื่อแปลที่อยู่ IPv6 ที่จัดรูปแบบเป็นพิเศษเป็น IPv4 โดยฝังที่อยู่ IPv4 ไว้ในที่อยู่ IPv6 แบบพิเศษ Codelab นี้จะแนะนำผู้ใช้ในการกำหนดค่าทั้ง 2 ฟีเจอร์ใน Virtual Private Cloud (VPC) ของ Google Cloud Platform (GCP) เมื่อกำหนดค่าร่วมกัน GCP NAT64 และ DNS64 จะช่วยให้อินสแตนซ์ IPv6 เท่านั้นสื่อสารกับเซิร์ฟเวอร์ IPv4 เท่านั้นบนอินเทอร์เน็ตได้

ใน Lab นี้ คุณจะได้ตั้งค่า VPC ที่มีซับเน็ตและอินสแตนซ์ IPv6 ประเภทต่างๆ ได้แก่ GUA (ที่อยู่แบบ Unicast ทั่วโลก) ที่ใช้ IPv6 เท่านั้น, ULA (ที่อยู่เฉพาะในเครือข่ายท้องถิ่น) ที่ใช้ IPv6 เท่านั้น และ ULA แบบ 2 สแต็ก จากนั้นคุณจะกำหนดค่าและทดสอบบริการ DNS64 และ NAT64 ที่มีการจัดการของ Google Cloud เพื่อเข้าถึงเว็บไซต์ที่ใช้ IPv4 เท่านั้นจากบริการเหล่านั้น

2. สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างซับเน็ตและอินสแตนซ์ IPv6 เท่านั้น
  • วิธีเปิดใช้บริการ DNS64 ที่มีการจัดการของ Google Cloud สำหรับ VPC
  • วิธีสร้างเกตเวย์ NAT ของ Google Cloud ที่กำหนดค่าสำหรับ NAT64
  • วิธีทดสอบการแก้ปัญหา DNS64 จากอินสแตนซ์ IPv6 เท่านั้นไปยังปลายทาง IPv4 เท่านั้น
  • ลักษณะการทำงานของ DNS64 และ NAT64 ที่แตกต่างกันระหว่างอินสแตนซ์แบบสแต็กเดียวและแบบ Dual Stack
  • วิธีกำหนดค่าเกตเวย์ NAT สำหรับ NAT64
  • วิธีทดสอบการเชื่อมต่อ NAT64 จากอินสแตนซ์ IPv6 เท่านั้นไปยังปลายทาง IPv4 เท่านั้น

3. ก่อนเริ่มต้น

อัปเดตโปรเจ็กต์เพื่อรองรับ Codelab

Codelab นี้ใช้ $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]

สถาปัตยกรรมโดยรวมของ Lab

63e4293e033da8d3.png

หากต้องการแสดงให้เห็นว่า NAT64 และ DNS64 ทำงานร่วมกับซับเน็ต IPv6 ประเภทต่างๆ อย่างไร คุณจะต้องสร้าง VPC เดียวที่มีซับเน็ต IPv6 ทั้งในรูปแบบ GUA และ ULA นอกจากนี้ คุณยังจะสร้างเครือข่ายย่อยแบบ 2 สแต็ก (ใช้การกำหนดที่อยู่ ULA) เพื่อแสดงให้เห็นว่า DNS64 และ NAT64 ไม่ได้ใช้กับ VM แบบ 2 สแต็ก

จากนั้นคุณจะกำหนดค่า DNS64 และ NAT64 รวมถึงทดสอบการเชื่อมต่อกับปลายทาง IPv6 และ IPv4 บนอินเทอร์เน็ต

4. ขั้นตอนการเตรียม

ก่อนอื่น ให้สร้างบัญชีบริการ, IAM, โครงสร้างพื้นฐานของเครือข่าย และอินสแตนซ์ที่จำเป็นในโปรเจ็กต์ Google Cloud

สร้างบัญชีบริการและการเชื่อมโยง IAM

เราเริ่มต้นด้วยการสร้างบัญชีบริการใหม่เพื่อให้อินสแตนซ์ SSH ถึงกันได้โดยใช้ gcloud เราจำเป็นต้องมีความสามารถนี้เนื่องจากใช้ IAP เพื่อเข้าถึงอินสแตนซ์ IPv6 เท่านั้นของ GUA ไม่ได้ และ 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) อีก 2 กฎอนุญาตการรับส่งข้อมูลจากช่วง 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 v6 เท่านั้น, ซับเน็ต ULA v6 เท่านั้น และซับเน็ต ULA แบบ Dual Stack เรียกใช้คำสั่งต่อไปนี้ใน 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 เป็น Jumpbox สำหรับอินสแตนซ์ GUA ด้วย (เนื่องจาก IAP ใช้กับอินสแตนซ์ GUA ไม่ได้ และ VM ของ Cloud Shell จะเข้าถึงปลายทาง 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 เท่านั้นทั้ง 2 รายการโดยการ 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

เราสังเกตเห็นรายการ 3 รายการในตารางการกำหนดเส้นทาง

  1. เส้นทาง /65 สำหรับซับเน็ต GUA ที่อินสแตนซ์เป็นของซับเน็ตนั้น โดยมีฮอพถัดไปที่ได้มาซึ่งใช้ที่อยู่เฉพาะลิงก์สำหรับเกตเวย์เริ่มต้น โปรดทราบว่า /65 ตอนบนสงวนไว้สำหรับตัวจัดสรรภาระงานเครือข่าย IPv6 Pass-Through
  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 (169.254.169.154) ได้ เนื่องจากยังคงเป็นปลายทาง IPv4 เท่านั้น

เนื่องจากอินสแตนซ์จะใช้ IP 169.254.1.2 เมื่อเป็นอินสแตนซ์ IPv6 เท่านั้น IP นี้ไม่สามารถกำหนดเส้นทางไปยังที่ใดได้นอกจากเซิร์ฟเวอร์ข้อมูลเมตาของ Compute ดังนั้นอินสแตนซ์จึงแยกออกจากเครือข่าย IPv4 ทั้งหมดได้อย่างมีประสิทธิภาพ

การทดสอบ Curl

มาทดสอบการเชื่อมต่อจริงกับเว็บไซต์ที่ใช้เฉพาะ 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

ตามที่คาดไว้ อินสแตนซ์ IPv6 เท่านั้นจะเข้าถึงปลายทางอินเทอร์เน็ต IPv4 ไม่ได้ หากไม่ได้จัดสรร 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

เราสังเกตเห็นรายการ 3 รายการในตารางการกำหนดเส้นทาง ซึ่งคล้ายกับอินสแตนซ์ GUA ยกเว้นมาสก์ที่เป็น /64 แทน /65 และเส้นทางซับเน็ตอยู่ในช่วง ULA (ภายใต้ fd20::/20 aggregate)

มาดูตารางการกำหนดเส้นทาง 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

การทดสอบการเชื่อมต่อกับเว็บไซต์ที่ใช้ IPv4 เท่านั้นและ IPv6 เท่านั้นซ้ำโดยใช้ 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 จะไม่มีการเข้าถึงปลายทางทั้ง 2 ของอินเทอร์เน็ต เนื่องจากสำหรับปลายทาง IPv6 เราไม่สามารถใช้ที่อยู่ ULA เพื่อสื่อสารภายนอกได้ และอินสแตนซ์จะไม่มีการเข้าถึง IPv4 เนื่องจากเป็นอินสแตนซ์ IPv6 เท่านั้น

6. เปิดใช้ NAT64 และ DNS64

กำหนดค่าบริการ DNS64 และ NAT64 ที่มีการจัดการสำหรับ VPC

DNS64

เปิดใช้นโยบายเซิร์ฟเวอร์ DNS64 สำหรับ VPC ซึ่งจะบอกรีโซลเวอร์ DNS ของ 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

ทดสอบการแปลง 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 (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 รายการหนึ่งที่เราได้รับ

การทดสอบ Curl

มาทดสอบการเชื่อมต่อจริงกับปลายทาง v4 เท่านั้นและ v6 เท่านั้นเดียวกันโดยใช้ 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 ทั้ง 2 รายการสำเร็จ โปรดสังเกตว่าการเชื่อมต่อกับเว็บไซต์ที่ใช้ 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

ทดสอบการแปลง 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 (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 รายการหนึ่งที่เราได้รับ

การทดสอบ Curl

มาทดสอบการเชื่อมต่อจริงกับปลายทาง 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

แม้ว่าทั้ง 2 คำสั่ง curl จะล้มเหลว โดยจะล้มเหลวด้วยเหตุผลที่แตกต่างกัน ด้านล่างนี้คือเอาต์พุตตัวอย่าง

<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 IPv4 ไปยังปลายทาง IPv6 เท่านั้นจะล้มเหลวเนื่องจากการแปลง DNS สำหรับระเบียน A ไม่สำเร็จ (ดังที่แสดงให้เห็นในระหว่างการทดสอบ DNS) การใช้ 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 จากอินสแตนซ์ 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 เท่านั้น และไม่ได้ประเมินสำหรับอินสแตนซ์แบบ Dual Stack

หากต้องการข้ามความจำเป็นในการใช้ 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

คำสั่ง curl ควรหมดเวลาเนื่องจาก NAT64 กำหนดให้อินสแตนซ์เป็น IPv6 เท่านั้นจึงจะใช้ได้ เช่นเดียวกับ DNS64

หากต้องการยืนยันว่า NAT64 ไม่ได้ใช้กับอินสแตนซ์แบบ Dual Stack จริงๆ ให้ใช้คำสั่ง "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 เท่านั้น แต่ไม่ได้จัดสรรสำหรับอินสแตนซ์แบบ Dual Stack

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 เพื่อให้ใช้แฟล็ก 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

ล้างข้อมูลสิทธิ์ 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 เท่านั้นบนอินเทอร์เน็ตได้สำเร็จ

ขั้นตอนถัดไปคือ

ลองดู Codelab เหล่านี้

อ่านเพิ่มเติมและวิดีโอ

เอกสารอ้างอิง