1. Giriş
IPv6'ya geçişle ilgili temel zorluklardan biri, yalnızca IPv4'ü destekleyen uç noktalara ve ağlara erişilebilirliği korumaktır. Bu zorluğun üstesinden gelmek için kullanılan önde gelen teknolojilerden biri, istemciler için A kayıtlarını AAAA kayıtlarına çevirmek üzere DNS64 (RFC6147'de tanımlanmıştır) kullanımını birleştirmektir. Bu işlem daha sonra, özel olarak biçimlendirilmiş IPv6 adreslerini IPv4'e çevirmek için NAT64 (RFC6146'da tanımlanmıştır) ile birleştirilir. Burada IPv4 adresi, özel IPv6 adresine yerleştirilir. Bu kod laboratuvarı, kullanıcıya Google Cloud Platform (GCP) Sanal Özel Bulut (VPC) üzerinde her iki özelliği de yapılandırma konusunda rehberlik eder. GCP NAT64 ve DNS64 birlikte yapılandırıldığında yalnızca IPv6'yı destekleyen örneklerin internetteki yalnızca IPv4'ü destekleyen sunucularla iletişim kurmasına olanak tanır.
Bu laboratuvarda, farklı IPv6 alt ağ ve örnek türlerine sahip bir VPC oluşturacaksınız : yalnızca IPv6 GUA (Global Tek Yayın Adresi), yalnızca IPv6 ULA (Benzersiz Yerel Adres) ve çift yığınlı ULA. Ardından, yalnızca IPv4 destekli web sitelerine erişmek için Google Cloud'un yönetilen DNS64 ve NAT64 hizmetlerini yapılandırıp test edeceksiniz.
2. Neler öğreneceksiniz?
- Yalnızca IPv6 alt ağları ve örnekleri oluşturma
- Google Cloud'un yönetilen DNS64 hizmetini bir VPC için etkinleştirme
- NAT64 için yapılandırılmış bir Google Cloud NAT ağ geçidi oluşturma
- Yalnızca IPv6 örneklerinden yalnızca IPv4 hedeflerine DNS64 çözümlemesinin nasıl test edileceği.
- DNS64 ve NAT64 davranışının tek yığınlı ve çift yığınlı örnekler arasındaki farkı.
- NAT64 için NAT ağ geçidini yapılandırma
- Yalnızca IPv6 örneklerinden yalnızca IPv4 hedeflerine NAT64 bağlantısını test etme.
3. Başlamadan önce
Proje, codelab'i destekleyecek şekilde güncellenmelidir.
Bu Codelab'de, Cloud Shell'de gcloud yapılandırmasının uygulanmasına yardımcı olmak için $değişkenleri kullanılır.
Cloud Shell'de aşağıdakileri yapın:
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]
Genel Laboratuvar Mimarisi
NAT64 ve DNS64'ün farklı IPv6 alt ağ türleriyle nasıl etkileşimde bulunduğunu göstermek için hem GUA hem de ULA türlerinde IPv6 alt ağları olan tek bir VPC oluşturacaksınız. Ayrıca, DNS64 ve NAT64'ün çift yığınlı sanal makinelere nasıl uygulanmadığını göstermek için çift yığınlı bir alt ağ (ULA adresleme kullanarak) oluşturacaksınız.
Ardından DNS64 ve NAT64'ü yapılandıracak ve internetteki IPv6 ve IPv4 hedeflerine bağlantıyı test edeceksiniz.
4. Hazırlık adımları
Öncelikle Google Cloud projenizde gerekli hizmet hesabını, IAM'yi, ağ altyapısını ve örnekleri ayarlayın.
Hizmet hesabı ve IAM bağlamaları oluşturma
Örneklerin gcloud kullanarak birbirlerine SSH üzerinden bağlanmasına izin vermek için yeni bir hizmet hesabı oluşturarak başlıyoruz. GUA IPv6'ya özel örneğine erişmek için IAP'yi kullanamadığımız ve Cloud Shell'de henüz doğrudan IPv6 erişimine izin verilmediği için bu özelliğe ihtiyacımız var. Cloud Shell'de aşağıdaki komutları çalıştırın.
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 oluşturma ve ULA'yı etkinleştirme
Cloud Shell'de aşağıdaki komutları çalıştırarak özel alt ağ moduna ve ULA dahili IPv6'nın etkinleştirildiği bir VPC ağı oluşturun.
gcloud compute networks create ipv6-only-vpc \
--project=$projectname \
--subnet-mode=custom \
--mtu=1500 --bgp-routing-mode=global \
--enable-ula-internal-ipv6
Güvenlik duvarı kuralları oluşturma
SSH erişimine izin vermek için güvenlik duvarı kuralları oluşturun. Bir kural, genel ULA aralığından (fd20::/20) gelen SSH bağlantılarına izin verir. Diğer iki kural, IAP'nin önceden tanımlanmış IPv6 ve IPv4 aralıklarından (sırasıyla 2600:2d00:1:7::/64, 35.235.240.0/20) gelen trafiğe izin verir.
Cloud Shell'de aşağıdaki komutları çalıştırın:
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
Alt ağ oluşturma
Yalnızca GUA v6 alt ağı, yalnızca ULA v6 alt ağı ve çift yığınlı ULA alt ağı oluşturun. Cloud Shell'de aşağıdaki komutları çalıştırın:
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
Örnek oluşturma
Yeni oluşturduğunuz alt ağların her birinde örnekler oluşturun. Yalnızca IPv6'nın kullanıldığı ULA örneği, cloud-platform ile belirtilir. Böylece, GUA IPv6'nın kullanıldığı örneğe geçiş yapmak için bu örneği jumpbox olarak kullanabiliriz. Cloud Shell'de aşağıdaki komutları çalıştırın:
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
İlk Örnek Erişimi ve Kurulumu
Varsayılan olarak IAP'yi kullanacak ULA örneğine SSH ile bağlanın. ULA örneğine SSH ile bağlanmak için Cloud Shell'de aşağıdaki komutu kullanın:
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$
Ayrıca, GUA örneği için ULA örneğini jumpbox olarak kullanacağız (çünkü IAP, GUA örnekleriyle çalışmaz ve Cloud Shell sanal makineleri IPv6 hedeflerine erişemez).
Hâlâ ULA örneği kabuğunun içindeyken. Aşağıdaki gcloud komutunu kullanarak GUA örneğine SSH ile bağlanmayı deneyin.
Bir örnekte ilk kez SSH komutu çalıştırdığınızda SSH anahtar çifti oluşturmanız istenir. Anahtar oluşturulup SSH komutu yürütülene kadar Enter tuşuna basmaya devam edin. Bu işlem, parola içermeyen yeni bir anahtar çifti oluşturur.
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]-----+
Başarılı olursa SSH komutu başarılı olur ve GUA örneğine SSH ile başarıyla bağlanırsınız:
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. Yalnızca IPv6 örneklerini inceleyin.
Her iki IPv6'ya özel örneği de SSH ile bağlanarak ve yönlendirme tablolarını inceleyerek ele alalım.
GUA örneğini inceleme
Önce "ula-instance" örneğinden geçerek "gua-instance" örneğine SSH uygulayın.
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$ gcloud compute ssh gua-instance
Aşağıdaki komutu kullanarak örneğin IPv6 yönlendirme tablosuna bakalım.
<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
Yönlendirme tablosunda üç giriş olduğunu görüyoruz.
- Örneğin ait olduğu GUA alt ağı için, varsayılan ağ geçidi için bağlantı yerel adresi kullanılarak türetilmiş bir sonraki durakla birlikte /65 rotası. Üstteki /65'in IPv6 geçiş ağ yük dengeleyicileri için ayrıldığını unutmayın.
- Bağlantı yerel tek noktaya yayın öneki fe80::/64 için yerleşik bir /64 yolu
- Alt ağın varsayılan ağ geçidinin bağlantı yerel adresine işaret eden varsayılan bir rota.
Şu komutu vererek IPv4 yönlendirme tablosuna bakalım
<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
Şaşırtıcı mı? Aslında, yalnızca IPv4 uç noktası olmaya devam ettiği için Compute meta veri sunucusuna (169.254.169.154) erişime izin vermek amacıyla yalnızca IPv6 örneklerinde bir IPv4 yönlendirme tablosu tutuyoruz.
Örneğin, yalnızca IPv6 olan bir örnekte IP adresi 169.254.1.2 olur. Bu IP, Compute meta veri sunucusu dışında hiçbir yere yönlendirilemez. Bu nedenle, örnek tüm IPv4 ağlarından etkili bir şekilde yalıtılır.
Curl Testleri
curl kullanarak yalnızca v4 ve yalnızca v6 web sitelerine gerçek bağlantıyı test edelim.
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@gua-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
Aşağıda örnek bir çıkış verilmiştir.
<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
Beklendiği gibi, yalnızca IPv6 olan bir örnekten IPv4 internet uç noktasına erişilemiyor. DNS64 ve NAT64 sağlanmadığında yalnızca IPv6'nın kullanıldığı örnek, IPv4 hedefi için bir yola sahip olmaz. Örnekte GUA IPv6 adresi olduğundan IPv6 hedefiyle erişilebilirlik normal şekilde çalışır.
ULA örneğini inceleme
"ula-instance" örneğine SSH ile bağlanın (varsayılan olarak IAP kullanılır).
gcloud compute ssh ula-instance --project $projectname --zone $zonename
Aşağıdaki komutu kullanarak örneğin IPv6 yönlendirme tablosuna bakalım.
<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
Yönlendirme tablosunda, GUA örneğine benzer şekilde üç giriş olduğunu görüyoruz. Tek fark, maskenin /65 yerine /64 olmasıdır. Ayrıca alt ağ rotası, ULA aralığına ait olmalıdır. (fd20::/20 toplama alanı altında)
Şu komutu vererek IPv4 yönlendirme tablosuna bakalım
<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
Bu da GUA örneğine benzer bir durumu gösterir.
Curl Testleri
curl kullanarak yalnızca v4 ve yalnızca v6 web sitelerine yönelik bağlantı testlerini tekrarlama.
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv --connect-timeout 10 v4.ipv6test.app
Aşağıda örnek bir çıkış verilmiştir.
<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 örneği durumunda, IPv6 uç noktası için dışarıya iletişim kurmak üzere bir ULA adresi kullanamadığımızdan ve örnek, yalnızca IPv6 örneği olduğundan IPv4'e erişilemediğinden her iki internet uç noktasına da erişilemez.
6. NAT64 ve DNS64'ü etkinleştirme
VPC'niz için yönetilen DNS64 ve NAT64 hizmetlerini yapılandırın.
DNS64
VPC'niz için DNS64 sunucusu politikasını etkinleştirin . Bu, VPC'nin DNS çözümleyicisine yalnızca A yanıtları için AAAA kayıtları sentezleme talimatı verir. Cloud Shell'de aşağıdaki komutları çalıştırın:
gcloud beta dns policies create allow-dns64 \
--description="Enable DNS64 Policy" \
--networks=ipv6-only-vpc \
--enable-dns64-all-queries \
--project $projectname
NAT64
Cloud NAT için gerekli olan bir Cloud Router oluşturun . Ardından, NAT64 için yapılandırılmış bir Cloud NAT ağ geçidi oluşturun. Bu ağ geçidi, tüm IPv6'ya özel alt ağ IP aralıkları için etkinleştirilir ve harici IP'leri otomatik olarak ayırır. Cloud Shell'de aşağıdaki komutları çalıştırın:
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 ve DNS64'ü test etme
Şimdi de önce GUA örneği, ardından ULA örneğiyle başlayarak NAT64 ve DNS64 yapılandırmanızı yalnızca IPv6'nın kullanıldığı örneklerden test edelim.
GUA örneğinden DNS64/NAT64'ü test etme
Önce "ula-instance" örneğinden geçerek "gua-instance" örneğine SSH uygulayın.
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$ gcloud compute ssh gua-instance
DNS Testleri
Yalnızca IPv6 kullanan bir web sitesinin DNS çözümlemesini test edin (ör. v6.ipv6test.app (ancak yalnızca IPv6'yı destekleyen tüm web siteleri benzer bir sonuç vermelidir).
<username>@gua-instance:~$ host -t AAAA v6.ipv6test.app
<username>@gua-instance:~$ host -t A v6.ipv6test.app
Yalnızca IPv6 AAAA yanıtlarının döndürülmesini bekliyoruz.
Örnek çıkış
<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
Yalnızca IPv4'ü destekleyen bir web sitesinin (ör. v4.ipv6test.app) DNS çözümlemesini test edin. Hem A kaydı (orijinal IPv4) hem de DNS64 tarafından iyi bilinen 64:ff9b::/96 öneki kullanılarak sentezlenen bir AAAA kaydı bekliyorsunuz .
<username>@gua-instance:~$ host -t AAAA v4.ipv6test.app
<username>@gua-instance:~$ host -t A v4.ipv6test.app
Örnek çıkış
<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
Yukarıdaki örnekte, ondalık sistemdeki IPv4 adresi (54.192.51.38), onaltılık sistemde (36 c0 33 26) olarak çevrilir. Bu nedenle, AAAA kaydı için (64:ff9b::36c0:3326) yanıtını bekleriz. Bu yanıt, aldığımız AAAA yanıtlarından biriyle eşleşir.
Curl Testleri
IPv6 üzerinden curl kullanarak aynı yalnızca v4 ve yalnızca v6 uç noktalarına gerçek bağlantıyı test edelim.
<username>@gua-instance:~$ curl -vv -6 v6.ipv6test.app
<username>@gua-instance:~$ curl -vv -6 v4.ipv6test.app
Aşağıda örnek bir çıkış verilmiştir.
<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>
##
Her iki curl komutu da başarılı olur. NAT64 ve DNS64'ün bağlantıyı başarılı bir şekilde etkinleştirmek için birlikte çalışması sayesinde, IPv6 üzerinden yalnızca IPv4'ü destekleyen bir web sitesine bağlanmanın nasıl mümkün olduğuna dikkat edin.
Kaynak IP'leri kontrol etme
Hedef tarafından gözlemlenen kaynak IP'yi kontrol etmek için bir IP yansıtma hizmeti kullanalım .
<username>@gua-instance:~$ curl -6 v4.ipv6test.app
<username>@gua-instance:~$ curl -6 v6.ipv6test.app
Örnek çıkış
<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::
Bildirilen IPv6 adresi, örneğin IPv6 adresiyle eşleşmelidir . Bu adres, örnekteki "ip -6 address" komutunun çıktısıyla eşleşmelidir. Örneğin
<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
Ancak, internete çıkmadan önce NAT64 işlevini gerçekleştirdiği için bildirilen IPv4 adresi, Cloud NAT ağ geçidinin harici IP adresiyle eşleşmelidir. Bu, Cloud Shell'de aşağıdaki gcloud komutu çalıştırılarak doğrulanabilir.
gcloud compute routers get-nat-ip-info \
nat64-router \
--region=$regionname
Örnek çıkış
result:
- natIpInfoMappings:
- mode: AUTO
natIp: 34.47.60.91
usage: IN_USE
natName: nat64-natgw
Çıktıda bildirilen "natIp"nin, IP yansıtma web sitesinden alınan çıktıyla eşleştiğini unutmayın.
ULA örneğinden DNS64/NAT64'ü test etme
İlk olarak, "ula-instance" ULA örneğine SSH uygulayın.
gcloud compute ssh ula-instance --project $projectname --zone $zonename
<username>@ula-instance:~$
DNS Testleri
Yalnızca IPv6 kullanan bir web sitesinin DNS çözümlemesini test edin (ör. v6.ipv6test.app (ancak yalnızca IPv6'yı destekleyen tüm web siteleri benzer bir sonuç vermelidir).
<username>@ula-instance:~$ host -t AAAA v6.ipv6test.app
<username>@ula-instance:~$ host -t A v6.ipv6test.app
Yalnızca IPv6 AAAA yanıtlarının döndürülmesini bekliyoruz.
Örnek çıkış
<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
Yalnızca IPv4'ü destekleyen bir web sitesinin (ör. v4.ipv6test.app) DNS çözümlemesini test edin. Hem A kaydı (orijinal IPv4) hem de DNS64 tarafından iyi bilinen 64:ff9b::/96 öneki kullanılarak sentezlenen bir AAAA kaydı bekliyorsunuz .
<username>@ula-instance:~$ host -t AAAA v4.ipv6test.app
<username>@ula-instance:~$ host -t A v4.ipv6test.app
Örnek çıkış
<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
Yukarıdaki örnekte, ondalık sistemdeki IPv4 adresi (54.192.51.38), onaltılık sistemde (36 c0 33 26) olarak çevrilir. Bu nedenle, AAAA kaydı için (64:ff9b::36c0:3326) yanıtını bekleriz. Bu yanıt, aldığımız AAAA yanıtlarından biriyle eşleşir.
Curl Testleri
Aynı IPv4 ve IPv6 uç noktalarına curl kullanarak gerçek bağlantıyı test edelim.
Başlangıç noktası olarak, örneğin yalnızca IPv6 örneği olması nedeniyle IPv4 üzerinden erişilebilirliğin mümkün olmadığını gösterelim.
<username>@ula-instance:~$ curl -vv -4 --connect-timeout 10 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv -4 --connect-timeout 10 v4.ipv6test.app
Ancak her iki kıvrım da başarısız olur. Bu işlemler farklı nedenlerle başarısız olur. Aşağıda örnek bir çıkış verilmiştir.
<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
Yalnızca IPv6 uç noktasına yönelik IPv4 curl'ü, A kaydı için DNS çözümleme başarısız olduğundan (DNS testleri sırasında gösterildiği gibi) başarısız olur. Yalnızca IPv6 örneği, herhangi bir IPv4 adresine erişemediği için yalnızca IPv4 uç noktasına yönelik IPv4 curl işlemi başarısız olur ve bu nedenle zaman aşımı oluşur.
Şimdi IPv6 üzerinden erişilebilirliği test edelim.
<username>@ula-instance:~$ curl -vv -6 v6.ipv6test.app
<username>@ula-instance:~$ curl -vv -6 v4.ipv6test.app
Aşağıda örnek bir çıkış verilmiştir.
<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>
##
ULA alt ağlarının internete doğrudan erişimi olmadığından yalnızca IPv6 web sitesine yönelik curl işlemi başarısız olur. DNS64 ve NAT64, GUA ve ULA örnekleri için aynı şekilde çalıştığından yalnızca IPv4'ü destekleyen web sitesine yönelik curl işlemi başarılı olur. Tek koşul, örneğin yalnızca IPv6'yı desteklemesidir.
Çift yığınlı ULA örneğinden DNS64/NAT64'ü test etme
Öncelikle "dualstack-ula-instance" adlı çift yığınlı ULA örneğine SSH uygulayın. gcloud'un IAP için IPv4 adresini kullanmasını zorlamak üzere "–tunnel-through-iap" işaretini kullanmamız gerekir.
gcloud compute ssh dualstack-ula-instance --project $projectname --zone $zonename --tunnel-through-iap
<username>@dualstack-ula-instance:~$
Şimdi "host " yardımcı programını kullanarak DNS64'ü test edelim.
<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
Yalnızca IPv4 destekli web sitesinin artık yalnızca IPv4 adresleri döndürdüğünü ve yapay DNS64 yanıtlarını döndürmediğini unutmayın. Bunun nedeni, DNS64'ün yalnızca IPv6'ya özel örneklerde uygulanması ve çift yığınlı örneklerde değerlendirilmemesidir.
DNS64'e gerek kalmaması için NAT64'ün çalışıp çalışmadığını test etmek üzere /etc/hosts dosyasına bir giriş ekleyelim. Çift yığınlı örnekte aşağıdaki komutu çalıştırın:
<username>@dualstack-ula-instance:~$ echo '64:ff9b::36c0:3326 v4.ipv6test.app' | sudo tee -a /etc/hosts
Ardından, IPv6 üzerinden IPv4 web sitesine erişimi test etmek için curl'ü kullanalım.
<username>@dualstack-ula-instance:~$ curl -vv -6 --connect-timeout 10 v4.ipv6test.app
Yukarıdaki komutun örnek çıkışını aşağıda bulabilirsiniz.
<username>@dualstack-ula-instance:~$ curl -vv -6 --connect-timeout 10 v4.ipv6test.app
* Trying [64:ff9b::36c0:3326]:80...
* ipv6 connect timeout after 10000ms, move on!
* Failed to connect to v4.ipv6test.app port 80 after 10001 ms: Timeout was reached
* Closing connection 0
curl: (28) Failed to connect to v4.ipv6test.app port 80 after 10001 ms: Timeout was reached
DNS64 gibi NAT64 de uygulanabilmek için örneğin yalnızca IPv6 olması gerektiğinden curl'un zaman aşımına uğraması gerekir.
NAT64'ün aslında çift yığınlı örneğe uygulanmadığını doğrulamak için NAT ağ geçidinin uyguladığı tüm bağlantı noktası eşlemelerini listelemek üzere "get-nat-mapping" komutunu kullanalım. Cloud Shell'de aşağıdaki komutları çalıştırın:
gcloud compute routers get-nat-mapping-info \
nat64-router --region $regionname \
--project $projectname
Aşağıdaki snippet'e benzer bir çıkış alırsınız:
---
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 çıkışı, NAT64 ağ geçidinin yalnızca IPv6'ya özel GUA ve ULA örnekleri için bağlantı noktaları ayırdığını ancak çift yığınlı örnek için ayırmadığını gösteriyor.
8. Temizleme
Cloud Router'ı temizleme
Cloud Shell'de aşağıdakileri yapın:
gcloud compute routers delete nat64-router \
--region $regionname \
--project $projectname --quiet
DNS politikasının bağlantısını kaldırma ve temizleme
Cloud Shell'de aşağıdakileri yapın:
gcloud beta dns policies update allow-dns64 \
--networks="" \
--project $projectname
gcloud beta dns policies delete allow-dns64 \
--project $projectname --quiet
Örnekleri temizleme
Cloud Shell'de aşağıdakileri yapın: (Daha hızlı bir örnek silme işlemi için no-graceful-shutdown işaretini kullanabilmemizi sağlamak amacıyla gcloud beta'nın kullanıldığını unutmayın.)
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
Alt ağları temizleme
Cloud Shell'de aşağıdakileri yapın:
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
Güvenlik duvarı kurallarını temizleme
Cloud Shell'de aşağıdakileri yapın:
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'yi temizleme
Cloud Shell'de aşağıdakileri yapın:
gcloud compute networks delete ipv6-only-vpc \
--project=$projectname \
--quiet
IAM izinlerini ve hizmet hesabını temizleme
Cloud Shell'de aşağıdakileri yapın:
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. Tebrikler
Yalnızca IPv6'yı destekleyen örneklerin internette yalnızca IPv4'ü destekleyen hedeflere ulaşmasına izin vermek için NAT64 ve DNS64'ü başarıyla kullandınız.
Sırada ne var?
Aşağıdaki codelab'lere göz atın:
- IPv6 adreslerini kullanarak şirket içi ana makinelerden Google API'lerine erişme
- IP adresleme seçenekleri IPv4 ve IPv6
- IPv6 statik rotalarında sonraki durak örneği, sonraki durak adresi ve sonraki durak ağ geçidini kullanma