Membuat instance VM khusus IPv6 dan mengaktifkan NAT64/DNS64

1. Pengantar

Salah satu tantangan utama saat bermigrasi ke IPv6 adalah mempertahankan aksesibilitas ke endpoint dan jaringan khusus IPv4. Teknologi terkemuka untuk mengatasi tantangan ini adalah dengan menggabungkan penggunaan DNS64 (didefinisikan dalam RFC6147) untuk menerjemahkan data A menjadi data AAAA untuk klien, yang kemudian digabungkan dengan NAT64 (didefinisikan dalam RFC6146) untuk menerjemahkan alamat IPv6 yang diformat khusus menjadi IPv4 dengan alamat IPv4 disematkan ke dalam alamat IPv6 khusus. Codelab ini memandu pengguna untuk mengonfigurasi kedua fitur di Virtual Private Cloud (VPC) Google Cloud Platform (GCP). Jika dikonfigurasi bersama, GCP NAT64 dan DNS64 memungkinkan instance khusus IPv6 berkomunikasi dengan server khusus IPv4 di internet.

Dalam lab ini, Anda akan menyiapkan VPC dengan berbagai jenis subnet dan instance IPv6 : GUA (Global Unicast Address) khusus IPv6, ULA (Unique Local Address) khusus IPv6, dan ULA stack ganda. Kemudian, Anda akan mengonfigurasi dan menguji layanan DNS64 dan NAT64 terkelola Google Cloud untuk mengakses situs khusus IPv4 dari layanan tersebut.

2. Yang akan Anda pelajari

  • Cara membuat subnet dan instance khusus IPv6
  • Cara mengaktifkan layanan DNS64 terkelola Google Cloud untuk VPC .
  • Cara membuat gateway NAT Google Cloud yang dikonfigurasi untuk NAT64 .
  • Cara menguji resolusi DNS64 dari instance khusus IPv6 ke tujuan khusus IPv4.
  • Perbedaan perilaku DNS64 dan NAT64 antara instance stack tunggal dan stack ganda.
  • Cara mengonfigurasi gateway NAT untuk NAT64.
  • Cara menguji konektivitas NAT64 dari instance khusus IPv6 ke tujuan khusus IPv4.

3. Sebelum memulai

Perbarui project untuk mendukung codelab

Codelab ini menggunakan $variables untuk membantu penerapan konfigurasi gcloud di Cloud Shell.

Di dalam Cloud Shell, lakukan hal berikut

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]

Arsitektur Lab Secara Keseluruhan

63e4293e033da8d3.png

Untuk mendemonstrasikan cara NAT64 dan DNS64 berinteraksi dengan berbagai jenis subnet IPv6, Anda akan membuat satu VPC dengan subnet IPv6 dalam versi GUA dan ULA. Anda juga akan membuat subnet stack ganda (menggunakan pengalamatan ULA) untuk mendemonstrasikan cara DNS64 dan NAT64 tidak berlaku untuk VM stack ganda.

Kemudian, Anda akan mengonfigurasi DNS64 dan NAT64 serta menguji konektivitas ke tujuan IPv6 dan IPv4 di internet.

4. Langkah-langkah persiapan

Pertama, siapkan akun layanan, IAM, infrastruktur jaringan, dan instance yang diperlukan di project Google Cloud Anda.

Buat Akun Layanan dan Binding IAM

Kita mulai dengan membuat akun layanan baru agar instance dapat saling terhubung melalui SSH menggunakan gcloud. Kita akan memerlukan kemampuan ini karena kita tidak dapat menggunakan IAP untuk mengakses instance GUA khusus IPv6 dan cloudshell belum mengizinkan akses IPv6 langsung. Jalankan perintah berikut di 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

Membuat VPC dan mengaktifkan ULA

Buat jaringan VPC dengan mode subnet kustom dan IPv6 internal ULA diaktifkan dengan menjalankan perintah berikut di cloudshell.

gcloud compute networks create ipv6-only-vpc \
--project=$projectname \
--subnet-mode=custom \
--mtu=1500 --bgp-routing-mode=global \
--enable-ula-internal-ipv6

Membuat aturan firewall

Buat aturan firewall untuk mengizinkan akses SSH. Satu aturan mengizinkan SSH dari rentang ULA keseluruhan (fd20::/20). Dua aturan lainnya mengizinkan traffic dari rentang IPv6 dan IPv4 bawaan IAP (2600:2d00:1:7::/64, 35.235.240.0/20).

Jalankan perintah berikut di 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 

Membuat subnet

Buat subnet khusus v6 GUA, subnet khusus v6 ULA, dan subnet ULA stack ganda. Jalankan perintah berikut di 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 

Membuat instance

Buat instance di setiap subnet yang baru saja Anda buat. Instance ULA khusus IPv6 ditentukan dengan cloud-platform untuk memungkinkan kita menggunakannya sebagai jumpbox ke instance GUA khusus IPv6. Jalankan perintah berikut di 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

Akses dan Penyiapan Instance Awal

SSH ke instance ULA yang akan menggunakan IAP secara default. Gunakan perintah berikut di cloudshell untuk melakukan SSH ke instance ULA:

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

<username>@ula-instance:~$ 

Kita juga akan menggunakan instance ULA sebagai jumpbox untuk instance GUA (karena IAP tidak berfungsi dengan instance GUA dan VM Cloudshell tidak dapat mengakses tujuan IPv6).

Saat masih berada di dalam shell instance ULA. Coba SSH ke instance GUA menggunakan perintah gcloud berikut.

Saat pertama kali Anda menjalankan perintah SSH di dalam instance, Anda akan diminta untuk menyiapkan pasangan kunci SSH. Terus tekan enter hingga kunci dibuat dan perintah SSH dieksekusi; tindakan ini akan membuat pasangan kunci baru tanpa frasa sandi.

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]-----+

Jika berhasil, perintah SSH akan berhasil dan Anda akan berhasil melakukan SSH ke instance 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. Periksa instance khusus IPv6.

Mari kita periksa kedua instance khusus IPv6 dengan melakukan SSH ke instance tersebut dan memeriksa tabel peruteannya.

Memeriksa instance GUA

SSH ke "gua-instance" dengan melompat melalui instance "ula-instance" terlebih dahulu.

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

Mari kita lihat tabel perutean IPv6 instance menggunakan perintah berikut

<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

Kita melihat tiga entri dalam tabel perutean

  1. Rute /65 untuk subnet GUA tempat instance berada dengan next hop turunan menggunakan alamat link-lokal untuk gateway default. Ingat bahwa /65 atas dicadangkan untuk Load Balancer Jaringan Pass-Through IPv6
  2. Rute /64 bawaan untuk awalan unicast link-local fe80::/64
  3. Rute default yang mengarah ke alamat link-local untuk gateway default subnet.

Mari kita lihat tabel perutean IPv4 dengan mengeluarkan perintah ini

<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

Mengejutkan? Faktanya, kami memang mempertahankan tabel perutean IPv4 di instance khusus IPv6 hanya untuk mengizinkan akses ke server Metadata Compute (169.254.169.154) karena masih merupakan endpoint khusus IPv4.

Karena instance menggunakan IP 169.254.1.2 saat menjadi instance khusus IPv6. IP ini tidak dapat dirutekan ke mana pun kecuali ke server Metadata Compute, sehingga instance secara efektif diisolasi dari semua jaringan IPv4.

Pengujian Ikal

Mari kita uji konektivitas sebenarnya ke situs khusus v4 dan khusus v6 menggunakan curl.

<username>@gua-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app

Berikut adalah contoh output.

<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

Seperti yang diharapkan, tidak ada keterjangkauan ke endpoint internet IPv4 dari instance khusus IPv6. Tanpa menyediakan DNS64 dan NAT64, instance khusus IPv6 tidak memiliki jalur ke tujuan IPv4. Keterjangkauan ke tujuan IPv6 berfungsi normal karena instance memiliki alamat IPv6 GUA.

Memeriksa instance ULA

SSH ke instance "ula-instance" (menggunakan IAP secara default).

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

Mari kita lihat tabel perutean IPv6 instance menggunakan perintah berikut

<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

Kita melihat tiga entri dalam tabel perutean, serupa dengan instance GUA, kecuali mask-nya adalah /64, bukan /65. Selain itu, rute subnet termasuk dalam rentang ULA. (dalam gabungan fd20::/20)

Mari kita lihat tabel perutean IPv4 dengan mengeluarkan perintah ini

<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

Yang menunjukkan situasi serupa dengan instance GUA.

Pengujian Ikal

Mengulangi uji konektivitas ke situs khusus v4 dan khusus v6 menggunakan curl.

<username>@ula-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app

Berikut adalah contoh output.

<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

Dalam kasus instance ULA, tidak ada aksesibilitas ke kedua endpoint internet karena untuk endpoint IPv6, kita tidak dapat menggunakan alamat ULA untuk berkomunikasi keluar, dan instance tidak memiliki aksesibilitas ke IPv4 sebagai instance khusus IPv6.

6. Mengaktifkan NAT64 dan DNS64

Konfigurasi layanan DNS64 dan NAT64 terkelola untuk VPC Anda.

DNS64

Aktifkan kebijakan Server DNS64 untuk VPC Anda . Tindakan ini akan memberi tahu DNS resolver VPC untuk menyintesis data AAAA untuk respons khusus A. Jalankan perintah berikut di cloudshell:

gcloud beta dns policies create allow-dns64 \
    --description="Enable DNS64 Policy" \
    --networks=ipv6-only-vpc \
    --enable-dns64-all-queries \
    --project $projectname

NAT64

Buat Cloud Router, yang diperlukan untuk Cloud NAT . Kemudian, buat gateway Cloud NAT yang dikonfigurasi untuk NAT64, aktifkan untuk semua rentang IP subnet khusus IPv6, dan alokasikan IP eksternal secara otomatis. Jalankan perintah berikut di 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. Menguji NAT64 dan DNS64

Sekarang, mari kita uji konfigurasi NAT64 dan DNS64 Anda dari instance khusus IPv6, dimulai dengan instance GUA, lalu instance ULA.

Menguji DNS64/NAT64 dari instance GUA

SSH ke "gua-instance" dengan melompat melalui instance "ula-instance" terlebih dahulu.

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

Tes DNS

Uji resolusi DNS situs khusus IPv6 (misalnya, v6.ipv6test.app, tetapi situs khusus IPv6 mana pun akan memberikan hasil yang serupa).

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

Kami berharap hanya jawaban AAAA IPv6 yang akan ditampilkan.

Contoh output

<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

Uji resolusi DNS situs khusus IPv4 (misalnya, v4.ipv6test.app). Anda mengharapkan data A (IPv4 asli) dan data AAAA yang disintesis oleh DNS64 menggunakan awalan terkenal 64:ff9b::/96 .

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

Contoh output

<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

Dalam contoh di atas, alamat IPv4 (54.192.51.38) dalam desimal akan diterjemahkan menjadi (36 c0 33 26) dalam hex, sehingga kami mengharapkan jawaban untuk rekaman AAAA adalah (64:ff9b::36c0:3326) yang cocok dengan salah satu jawaban AAAA yang kami terima.

Pengujian Ikal

Mari kita uji konektivitas sebenarnya ke endpoint khusus v4 dan khusus v6 yang sama menggunakan curl melalui IPv6

<username>@gua-instance:~$ curl -vv -6 v6.ipv6test.app

<username>@gua-instance:~$ curl -vv -6 v4.ipv6test.app

Berikut adalah contoh output.

<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>
##

Kedua perintah curl berhasil. Perhatikan bagaimana koneksi ke situs khusus IPv4 melalui IPv6 dapat dilakukan karena NAT64 dan DNS64 bekerja bersama-sama untuk mengaktifkan konektivitas dengan berhasil.

Memeriksa IP Sumber

Mari kita gunakan layanan refleksi IP untuk memeriksa IP sumber yang diamati oleh tujuan .

<username>@gua-instance:~$ curl -6 v4.ipv6test.app

<username>@gua-instance:~$ curl -6 v6.ipv6test.app

Contoh output

<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::

Alamat IPv6 yang dilaporkan harus cocok dengan alamat IPv6 instance . Alamat ini harus cocok dengan output perintah "ip -6 address" di instance. Sebagai contoh

<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

Namun, alamat IPv4 yang dilaporkan harus cocok dengan alamat IP eksternal gateway Cloud NAT karena gateway tersebut melakukan fungsi NAT64 sebelum keluar ke internet. Hal ini dapat diverifikasi dengan menjalankan perintah gcloud ini di cloudshell

gcloud compute routers get-nat-ip-info \
       nat64-router \
       --region=$regionname

Contoh output

result:
- natIpInfoMappings:
  - mode: AUTO
    natIp: 34.47.60.91
    usage: IN_USE
  natName: nat64-natgw

Perhatikan bahwa "natIp" yang dilaporkan dalam output cocok dengan output yang diterima dari situs refleksi IP.

Menguji DNS64/NAT64 dari instance ULA

Pertama, SSH ke instance ULA "ula-instance"

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

<username>@ula-instance:~$

Tes DNS

Uji resolusi DNS situs khusus IPv6 (misalnya, v6.ipv6test.app, tetapi situs khusus IPv6 mana pun akan memberikan hasil yang serupa).

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

Kami berharap hanya jawaban AAAA IPv6 yang akan ditampilkan.

Contoh output

<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

Uji resolusi DNS situs khusus IPv4 (misalnya, v4.ipv6test.app). Anda mengharapkan data A (IPv4 asli) dan data AAAA yang disintesis oleh DNS64 menggunakan awalan terkenal 64:ff9b::/96 .

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

Contoh output

<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

Dalam contoh di atas, alamat IPv4 (54.192.51.38) dalam desimal akan diterjemahkan menjadi (36 c0 33 26) dalam hex, sehingga kami mengharapkan jawaban untuk rekaman AAAA adalah (64:ff9b::36c0:3326) yang cocok dengan salah satu jawaban AAAA yang kami terima.

Pengujian Ikal

Mari kita uji konektivitas sebenarnya ke endpoint khusus v4 dan khusus v6 yang sama menggunakan curl.

Sebagai titik awal, mari kita tunjukkan bahwa aksesibilitas melalui IPv4 tidak mungkin dilakukan karena instance adalah instance khusus 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

Meskipun kedua curl akan gagal. Kegagalan tersebut akan terjadi karena alasan yang berbeda. Berikut adalah contoh output.

<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 ke endpoint khusus IPv6 gagal karena resolusi DNS untuk data A gagal (seperti yang ditunjukkan selama pengujian DNS). Curl IPv4 ke endpoint khusus IPv4 gagal karena instance khusus IPv6 tidak memiliki akses ke alamat IPv4 mana pun dan kita akan mengalami waktu tunggu habis karena hal tersebut.

Sekarang, mari kita uji keterjangkauan melalui IPv6.

<username>@ula-instance:~$ curl -vv -6 v6.ipv6test.app

<username>@ula-instance:~$ curl -vv -6 v4.ipv6test.app

Berikut adalah contoh output.

<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>
##

Meskipun curl ke situs khusus IPv6 gagal karena subnet ULA tidak memiliki keterjangkauan langsung ke internet. Curl ke situs khusus IPv4 berhasil karena DNS64 dan NAT64 beroperasi dengan cara yang sama untuk instance GUA dan ULA; satu-satunya persyaratan adalah instance harus khusus IPv6.

Menguji DNS64/NAT64 dari instance ULA Stack Ganda

Pertama, lakukan SSH ke instance ULA Dual-Stack "dualstack-ula-instance". Kita perlu menggunakan flag "–tunnel-through-iap" untuk memaksa gcloud menggunakan alamat IPv4 untuk IAP.

gcloud compute ssh dualstack-ula-instance --project $projectname --zone $zonename --tunnel-through-iap 

<username>@dualstack-ula-instance:~$

Sekarang, mari kita uji DNS64 menggunakan utilitas "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

Perhatikan bagaimana situs khusus IPv4 hanya menampilkan alamat IPv4 sekarang dan bukan lagi jawaban DNS64 sintetis. Hal ini karena DNS64 hanya diterapkan ke instance khusus IPv6 dan tidak dievaluasi untuk instance dual-stack.

Untuk melewati kebutuhan akan DNS64, mari tambahkan entri ke file /etc/hosts untuk menguji apakah NAT64 berfungsi. Jalankan perintah berikut di dalam instance stack ganda:

<username>@dualstack-ula-instance:~$ echo '64:ff9b::36c0:3326 v4.ipv6test.app' | sudo tee -a /etc/hosts

Kemudian, gunakan curl untuk menguji akses ke situs ipv4 melalui IPv6

<username>@dualstack-ula-instance:~$ curl -vv -6 --connect-timeout 10 v4.ipv6test.app

Berikut adalah contoh output dari perintah di atas

<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 akan mengalami waktu tunggu karena seperti DNS64, NAT64 juga mengharuskan instance hanya menggunakan IPv6 agar dapat diterapkan.

Untuk mengonfirmasi bahwa NAT64 sebenarnya tidak berlaku untuk instance dual-stack, mari kita gunakan perintah "get-nat-mapping" untuk mencantumkan semua pemetaan port yang diterapkan gateway NAT. Jalankan perintah berikut di cloudshell:

gcloud compute routers get-nat-mapping-info \
      nat64-router --region $regionname \
      --project $projectname

Anda akan mendapatkan output yang mirip dengan cuplikan di bawah:

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

Output NAT menunjukkan bahwa gateway NAT64 hanya mengalokasikan port untuk instance GUA dan ULA khusus IPv6, tetapi tidak untuk instance dual-stack.

8. Pembersihan

Membersihkan Cloud Router

Di dalam Cloud Shell, lakukan hal berikut:

gcloud compute routers delete nat64-router \
      --region $regionname \
      --project $projectname --quiet

Lepaskan dan Bersihkan Kebijakan DNS

Di dalam Cloud Shell, lakukan hal berikut:

gcloud beta dns policies update allow-dns64 \
    --networks="" \
    --project $projectname
gcloud beta dns policies delete allow-dns64 \
    --project $projectname --quiet

Menghapus Instance

Di dalam Cloud Shell, lakukan hal berikut: (perhatikan, gcloud beta digunakan agar kita dapat menggunakan flag no-graceful-shutdown untuk operasi penghapusan instance yang lebih cepat)

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

Membersihkan subnet

Di dalam Cloud Shell, lakukan hal berikut:

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

Menghapus aturan firewall

Di dalam Cloud Shell, lakukan hal berikut:

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

Membersihkan VPC

Di dalam Cloud Shell, lakukan hal berikut:

gcloud compute networks delete ipv6-only-vpc \
       --project=$projectname \
       --quiet

Membersihkan izin IAM dan Akun Layanan

Di dalam Cloud Shell, lakukan hal berikut:

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

Anda telah berhasil menggunakan NAT64 dan DNS64 untuk mengizinkan instance khusus IPv6 menjangkau tujuan khusus IPv4 di internet.

Apa langkah selanjutnya?

Lihat beberapa codelab ini...

Bacaan lebih lanjut & Video

Dokumen referensi