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
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
- 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
- Rute /64 bawaan untuk awalan unicast link-local fe80::/64
- 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...
- Mengakses Google API dari host lokal menggunakan alamat IPv6
- Opsi pengalamatan IP IPv4 dan IPv6
- Menggunakan instance next hop, alamat next hop, dan gateway next hop Rute Statis IPv6