1. Genel Bakış
Dinamik bağlantı noktası ayırma (DPA), Cloud NAT'teki yeni bir özelliktir. DPA etkinleştirildiğinde Cloud NAT, ihtiyaçlarına bağlı olarak örnekler için bağlantı noktası ayırmalarını dinamik olarak ölçeklendirir. DPA, bağlantı noktalarını hiçbir zaman minimum değerin altına düşürmeyecek veya maksimum değerin üzerine çıkarmayacak şekilde minimum ve maksimum bağlantı noktası sınırlarıyla yapılandırılır. Bu sayede, NAT ağ geçitlerinin arkasındaki bazı örnekler, Cloud NAT'in arkasındaki tüm örneklere daha fazla bağlantı noktası ayırmak zorunda kalmadan bağlantı sayılarını dinamik olarak ölçeği artırabilir.
DPA olmadan, Cloud NAT'ın arkasındaki tüm örnekler, minPortsPerVm parametresinde tanımlandığı gibi kullanımdan bağımsız olarak aynı sayıda bağlantı noktasıyla tahsis edilir .
Daha fazla bilgi için lütfen NAT DPA ile ilgili dokümanlar bölümünü inceleyin.
Neler öğreneceksiniz?
- DPA'ya hazırlanmak için Cloud NAT ağ geçidi nasıl ayarlanır?
- DPA olmadan bağlantı noktası ayırmalarını inceleme
- NAT ağ geçidi için DPA'yı etkinleştirme ve yapılandırma
- Paralel çıkış bağlantıları çalıştırarak DPA'nın etkilerini gözlemleme
- DPA'nın etkin olduğu bir NAT ağ geçidine NAT kuralları ekleme
- Çıkış bağlantılarını birden fazla hedefe çalıştırarak Veri Koruma Yasası'nın kurallarla birlikte davranışını görme
İhtiyacınız olanlar
- Google Compute Engine hakkında temel düzeyde bilgi sahibi olma
- Temel ağ iletişimi ve TCP/IP bilgisi
- Temel düzeyde Unix/Linux komut satırı bilgisi
- Google Cloud'da ağ iletişimiyle ilgili bir turu (ör. Google Cloud'da Ağ İletişimi laboratuvarı) tamamlamış olmanız faydalıdır.
- "Alfa erişimi"nin etkin olduğu bir Google Cloud projesi.
- Cloud NAT'nin temel özelliklerini anlama
2. Google Cloud Console ve Cloud Shell'i kullanma
GCP ile etkileşim kurmak için bu laboratuvar boyunca hem Google Cloud Console hem de Cloud Shell'i kullanacağız.
Google Cloud Console
Cloud Console'a https://console.cloud.google.com adresinden ulaşabilirsiniz.

Yönlendirmesiz ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizisidir ve istediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Bu nedenle, beğenmezseniz başka bir rastgele kimlik oluşturabilir veya kendi kimliğinizi deneyip kullanılabilir olup olmadığını görebilirsiniz. Proje oluşturulduktan sonra bu değer "dondurulur". - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere codelab'in sonunda bulunan "temizleme" talimatlarını uygulayın. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
GCP Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

Ortamın temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu laboratuvardaki çalışmalarınızın tamamını yalnızca bir tarayıcı kullanarak yapabilirsiniz.
3. Laboratuvar Kurulumu
Bu laboratuvarda bir proje kullanacak ve her birinde alt ağ bulunan iki VPC oluşturacaksınız. Öncelikle harici IP adresleri ayıracak, ardından bir Cloud NAT ağ geçidi (Cloud Router ile), iki üretici örneği ve iki tüketici örneği oluşturup yapılandıracaksınız. Varsayılan Cloud NAT davranışını doğruladıktan sonra dinamik bağlantı noktası ayırmayı etkinleştirip davranışını doğrulayacaksınız. Son olarak, NAT kurallarını da yapılandıracak ve DPA ile NAT kuralları arasındaki etkileşimi gözlemleyeceksiniz.
Ağ mimarisine genel bakış:

4. Harici IP adreslerini ayırtma
Bu laboratuvarda kullanılacak tüm harici IP adreslerini ayıralım. Bu, hem tüketici hem de üretici VPC'sinde ilgili tüm NAT ve güvenlik duvarı kurallarını yazmanıza yardımcı olur.
Cloud Shell'den:
gcloud compute addresses create nat-address-1 nat-address-2 \ producer-address-1 producer-address-2 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
Ayrılmış IP adreslerini ortam değişkenleri olarak doldurun.
export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"` export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"` export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"` export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`
Çıkış beklenmez ancak adreslerin doğru şekilde doldurulduğu onaylanır. Tüm ortam değişkenlerinin değerlerini çıkış olarak verelim.
env | egrep '^(nat|producer)ip[1-3]'
Çıkış:
producerip1=<Actual Producer IP 1> producerip2=<Actual Producer IP 2> natip1=<NAT IP 1> natip2=<NAT IP 2>
5. Üretici VPC'si ve örnek kurulumu.
Şimdi yapımcı kaynakları için kaynakları oluşturacağız. Üretici VPC'sinde çalışan örnekler, "producer-address-1" ve "producer-address-2" olmak üzere iki genel IP kullanarak internete yönelik hizmet sunar.
Öncelikle VPC'yi oluşturalım. Cloud Shell'den:
gcloud compute networks create producer-vpc --subnet-mode custom
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 producer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
Ardından, us-east4 bölgesinde alt ağı oluşturalım. Cloud Shell'den:
gcloud compute networks subnets create prod-net-e4 \ --network producer-vpc --range 10.0.0.0/24 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4]. NAME REGION NETWORK RANGE STACK_TYPE IPV6_ACCESS_TYPE IPV6_CIDR_RANGE EXTERNAL_IPV6_CIDR_RANGE prod-net-e4 us-east4 producer-vpc 10.0.0.0/24 IPV4_ONLY
Ardından, NAT IP adreslerinin 8080 numaralı bağlantı noktasında üretici örneklerine ulaşmasına izin vermek için VPC güvenlik duvarı kuralları oluşturalım.
İlk kural için Cloud Shell'den:
gcloud compute firewall-rules create producer-allow-80 \ --network producer-vpc --allow tcp:80 \ --source-ranges $natip1,$natip2
Çıkış:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED producer-allow-80 producer-vpc INGRESS 1000 tcp:80 False
Bir sonraki adım, iki üretici örneği oluşturmaktır.
Üretici örnekleri, basit bir nginx proxy dağıtımı çalıştırır.
Örnekleri gerekli tüm yazılımlarla hızlıca sağlamak için Debian APT paket yöneticisini kullanarak nginx'i yükleyen bir başlangıç komut dosyasıyla örnekler oluşturacağız.
NAT kuralları yazabilmek için her örneği farklı bir ayrılmış IP adresiyle sağlayacağız.
İlk örneği oluşturun. Cloud Shell'den:
gcloud compute instances create producer-instance-1 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=prod-net-e4 \ --metadata startup-script="#! /bin/bash sudo apt update sudo apt install -y nginx mkdir /var/www/html/nginx/ cat <<EOF > /var/www/html/nginx/index.html <html><body><h1>This is producer instance 1</h1> </body></html> EOF"
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-1 us-east4-a e2-medium 10.0.0.2 <Producer IP1> RUNNING
Ardından ikinci örneği oluşturun. Cloud Shell'den:
gcloud compute instances create producer-instance-2 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=prod-net-e4 \ --metadata startup-script="#! /bin/bash sudo apt update sudo apt install -y nginx mkdir /var/www/html/nginx/ cat <<EOF > /var/www/html/nginx/index.html <html><body><h1>This is producer instance 2</h1> </body></html> EOF"
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-2 us-east4-a e2-medium 10.0.0.3 <Producer IP2> RUNNING
6. Tüketici VPC'si, Cloud NAT ve örneklerini ayarlama
Üretici hizmetini oluşturduğunuza göre artık tüketici VPC'sini ve Cloud NAT ağ geçidini oluşturabilirsiniz.
VPC ve alt ağ oluşturulduktan sonra, TCP kaynak IP aralıkları için IAP'ye izin veren basit bir giriş güvenlik duvarı kuralı ekleyeceğiz. Bu sayede, gcloud'u kullanarak doğrudan tüketici örneklerine SSH üzerinden bağlanabiliriz.
Ardından, manuel ayırma modunda basit bir Cloud NAT ağ geçidi ve bununla ilişkili "nat-address-1" ayrılmış adresini oluştururuz. Bu codelab'in sonraki bölümlerinde, dinamik bağlantı noktası ayırmayı etkinleştirmek için ağ geçidinin yapılandırmasını güncelleyeceğiz ve daha sonra özel kurallar ekleyeceğiz.
Öncelikle VPC'yi oluşturalım. Cloud Shell'den:
gcloud compute networks create consumer-vpc --subnet-mode custom
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 consumer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp:22,tcp:3389,icmp
Ardından, us-east4'te bir alt ağ oluşturalım. Cloud Shell'den:
gcloud compute networks subnets create cons-net-e4 \ --network consumer-vpc --range 10.0.0.0/24 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4]. NAME REGION NETWORK RANGE STACK_TYPE IPV6_ACCESS_TYPE IPV6_CIDR_RANGE EXTERNAL_IPV6_CIDR_RANGE cons-net-e4 us-east4 consumer-vpc 10.0.0.0/24 IPV4_ONLY
Ardından, IAP aralık adreslerinin 22 numaralı bağlantı noktasında tüketici örneklerine ulaşmasına izin vermek için bir VPC güvenlik duvarı kuralı oluşturalım.
İlk güvenlik duvarı kuralı için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud compute firewall-rules create consumer-allow-iap \ --network consumer-vpc --allow tcp:22 \ --source-ranges 35.235.240.0/20
Çıkış:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED consumer-allow-iap consumer-vpc INGRESS 1000 tcp:22 False
NAT ağ geçidi oluşturmadan önce bir Cloud Router örneği oluşturmamız gerekir (özel bir ASN numarası kullanırız ancak bu laboratuvarın etkinlikleri için bu numara önemli değildir). Cloud Shell'den:
gcloud compute routers create consumer-cr \ --region=us-east4 --network=consumer-vpc \ --asn=65501
Çıkış:
Creating router [consumer-cr]...done. NAME REGION NETWORK consumer-cr us-east4 consumer-vpc
Ardından NAT ağ geçidi örneğini oluşturun. Cloud Shell'den:
gcloud compute routers nats create consumer-nat-gw \
--router=consumer-cr \
--router-region=us-east4 \
--nat-all-subnet-ip-ranges \
--nat-external-ip-pool=nat-address-1
Çıkış:
Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.
Varsayılan olarak, Cloud NAT ağ geçidinin minPortsPerVm değeri 64 olacak şekilde oluşturulduğunu unutmayın.
Tüketici test örneklerini oluşturun. Daha sonra örnek içinde bunlara başvurabilmek için ayrılmış üretici IP'lerini burada doldururuz. Cloud Shell'den:
gcloud compute instances create consumer-instance-1 --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2 gcloud compute instances create consumer-instance-2 --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance-1 us-east4-a e2-medium 10.0.0.2 RUNNING Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance-2 us-east4-a e2-medium 10.0.0.3 RUNNING
7. Varsayılan Cloud NAT davranışını doğrulama
Bu noktada, tüketici örnekleri tüm harici adreslerle iletişim kurmak için aynı ayrılmış IP olan "nat-address-1"i kullanan varsayılan Cloud NAT davranışını kullanır. Cloud NAT'te de henüz Veri İşlenmesine İlişkin Değişiklik etkinleştirilmemiştir.
Aşağıdaki komutu çalıştırarak Cloud NAT'in tüketici örneklerimize hangi bağlantı noktalarını ayırdığını doğrulayalım.
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Örnek çıktı
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Consumer IP1>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Consumer IP1>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 --- instanceName: consumer-instance-2 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 - natIpPortRanges: - <NAT Address IP1>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3
Yukarıdaki çıkıştan da görebileceğiniz gibi, Cloud NAT aynı harici IP'den örnek başına 64 bağlantı noktası ayırmıştır. nat-address-1
DPA'yı etkinleştirmeden önce kaç bağlantıyı paralel olarak açabileceğimizi doğrulayalım.
İlk tüketici örneğine SSH uygulayın. Cloud Shell'den:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Şimdi örnek kabuğunda olmalısınız.
Örnek Çıkış (kısa olması için tam çıkış kırpılmıştır)
External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance-1:~$
Tüketici örneği içinden önce her iki üretici IP'sini de getirelim ve bunları çevre değişkenleri olarak dolduralım.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Ardından, başarılı bir şekilde ulaşabildiğimizden emin olmak için her iki üretici örneğine de curl komutu göndermeyi deneyin.
<username>@consumer-instance-1:~$ curl http://$producerip1/nginx/ <html><body><h1>This is producer instance 1</h1> </body></html> <username>@consumer-instance-1:~$ curl http://$producerip2/nginx/ <html><body><h1>This is producer instance 2</h1> </body></html>
Şimdi de bir döngü aracılığıyla curl komutunu çalıştırarak üretici örneklerinden birine paralel olarak çok sayıda bağlantı oluşturmayı deneyelim. Cloud NAT'in kapalı soketlerin 2 dakika boyunca yeniden kullanılmasına izin vermediğini hatırlatırız. Bu nedenle, tüm bağlantı denemelerini 2 dakika içinde tekrarlayabildiğimiz sürece paralel bağlantıları bu şekilde simüle edebiliriz.
Örnek SSH oturumunda aşağıdaki komutu çalıştırın:
while true; do for i in {1..64}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
64 paralel bağlantıyı başarıyla açabilmeniz ve komut dosyasının aşağıdakileri yazdırması beklenir.
Connection # 64 successful Loop Done, Sleeping for 150s Connection # 64 successful Loop Done, Sleeping for 150s
64 paralel bağlantının ötesine geçemediğimizi görmek için öncelikle tüm eski soketlerin temizlenmesi amacıyla 2 dakika bekleyin. Ardından aynı tek satırlık kodu aşağıdaki gibi değiştirip tekrar çalıştırın.
while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şimdi aşağıdaki çıkışı görmeyi beklersiniz.
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 67 failed Connection # 68 failed Connection # 69 failed Connection # 70 failed Loop Done, Sleeping for 150s
Bu, ilk 64 bağlantının başarılı olduğunu ancak kalan 6 bağlantının bağlantı noktalarının kullanılamaması nedeniyle başarısız olduğunu gösterir.
O zaman bu konuda bir şeyler yapalım. SSH kabuğundan çıkın ve aşağıdaki bölümde DPA'yı etkinleştirelim.
8. DPA'yı etkinleştirme ve davranışını doğrulama
Aşağıdaki gcloud komutunu çalıştırın. Bu komut, DPA'yı etkinleştirir, sanal makine başına minimum bağlantı noktası ayırma sayısını 64'e ve maksimum bağlantı noktası ayırma sayısını 1024'e ayarlar.
gcloud alpha compute routers nats update consumer-nat-gw --router=consumer-cr \ --region=us-east4 --min-ports-per-vm=64 --max-ports-per-vm=1024 \ --enable-dynamic-port-allocation
Aşağıdakileri çıkaran
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
Şimdi, her iki örnekte de yalnızca 64 bağlantı noktası ayrıldığını doğrulamak için get-nat-mapping-info komutunu tekrar çalıştıralım.
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Örnek çıkış (kısa olması için kısaltılmıştır)
--- instanceName: consumer-instance-1 ... - <NAT Consumer IP1>:1024-1055 numTotalNatPorts: 32 ... - natIpPortRanges: - <NAT Consumer IP1>:32768-32799 numTotalNatPorts: 32 ... --- instanceName: consumer-instance-2 ... - <NAT Address IP1>:1056-1087 numTotalNatPorts: 32 ... - <NAT Address IP1>:32800-32831 numTotalNatPorts: 32 ...
Örnek henüz herhangi bir bağlantı noktasını etkin olarak kullanmadığından bağlantı noktası tahsisleri açısından pek bir değişiklik olmadı.
Örneğe tekrar SSH uygulayalım:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Üretici IP ortam değişkenlerini yeniden dışa aktarın.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Ayrıca, paralel bağlantıları simüle etmek için önceki döngüyü yeniden çalıştırın:
while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şimdi aşağıdaki çıkışı görmemiz gerekir.
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 70 successful Loop Done, Sleeping for 150s
Peki burada ne oldu? Cloud NAT, bağlantı noktası kullanımındaki artışa göre bağlantı noktası ayırmayı artırır ancak bu işlemin ağ katmanında programlanması biraz zaman alır. Bu nedenle, bağlantı denemelerinin geri kalanını başarıyla tamamlamadan önce 1-3 bağlantı zaman aşımı görüyoruz.
Curl için agresif bir zaman aşımı (5 saniye) belirledik ancak DPA bağlantı noktası ayırmalarını artırırken daha uzun zaman aşımlarına sahip uygulamalar bağlantıları başarıyla tamamlayabilir.
Bu artış davranışı, döngüyü aşağıdaki gibi 1.024 bağlantı denemesi için çalıştırdığımızda daha net görülebilir.
while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şimdi aşağıdaki çıkışı görmeyi bekliyoruz.
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 129 successful Connection # 130 failed Connection # 131 failed Connection # 258 successful Connection # 259 failed Connection # 260 failed Connection # 515 successful Connection # 516 failed Connection # 1024 successful Loop Done, Sleeping for 150s
Cloud NAT, bağlantı noktalarını 2'nin katları şeklinde ayırdığı için her adımda ayırmaları iki katına çıkarır. Bu nedenle, 64 ile 1024 arasındaki 2'nin katları civarında bağlantı zaman aşımlarının vurgulandığını görüyoruz.
maxPortsPerVM değerini 1024 olarak ayarladığımız için 1024'ten fazla bağlantı kuramayız. Bunu, eski bağlantı noktalarının sıfırlanması için 2 dakika bekledikten sonra 1024'ten daha yüksek bir sayıyla curl döngüsünü yeniden çalıştırarak test edebiliriz.
while true; do for i in {1..1035}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Beklendiği gibi, çıkışta 1.024'ten fazla bağlantının başarısız olmaya başladığı gösteriliyor.
<truncated output> ... Connection # 1028 successful Connection # 1029 failed Connection # 1030 failed Connection # 1031 failed Connection # 1032 failed Connection # 1033 failed Connection # 1034 failed Connection # 1035 failed ... Loop Done, Sleeping for 150s
maxPortsPerVM değerini 1024 olarak ayarlayarak Cloud NAT'e bağlantı noktası ayırmalarını hiçbir zaman VM başına 1024'ün üzerine çıkarmaması talimatını vermiş oluruz.
SSH oturumundan çıkıp get-nat-mapping-info komutunu yeterince hızlı bir şekilde yeniden çalıştırırsak ayrılan ek bağlantı noktalarını görebiliriz.
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Aşağıdaki çıkışı gözlemleyin.
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1024-1055 - <NAT Address IP1>1088-1119 -<NAT Address IP1>:1152-1215 - <NAT Address IP1>:1280-1407 - <NAT Address IP1>:1536-1791 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Address IP1>:32768-32799 - <NAT Address IP1>:32832-32863 - <NAT Address IP1>:32896-32959 - <NAT Address IP1>:33024-33151 - <NAT Address IP1>:33536-33791 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 --- instanceName: consumer-instance-2 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 - natIpPortRanges: - <NAT Address IP1>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3
consumer-instance-1 için 1.024 bağlantı noktası ayrılırken consumer-instance-2 için yalnızca 64 bağlantı noktası ayrıldığına dikkat edin. Bu, Veri İşlenmesine İlişkin Değişiklik'ten önce kolayca mümkün değildi ve Cloud NAT için Veri İşlenmesine İlişkin Değişiklik'in gücünü tam olarak vurguluyor.
get-nat-mapping-info komutunu yeniden çalıştırmadan önce 2 dakika beklerseniz consumer-instance-1 değerinin, yalnızca 64 bağlantı noktası ayrılmış minimum değerine döndüğünü görürsünüz. Yalnızca DPA'nın bağlantı noktası ayırmalarını artırma yeteneğini değil, aynı zamanda kullanılmadığında aynı NAT ağ geçidinin arkasındaki diğer örnekler tarafından kullanılabilmesi için bunları serbest bırakma yeteneğini de gösterir.
9. Cloud NAT kurallarını DPA ile test etme
Ayrıca, kısa süre önce Cloud NAT için NAT kuralları işlevini kullanıma sunduk. Bu işlev, müşterilerin belirli harici hedefler için belirli NAT IP'lerini kullanan kurallar yazmasına olanak tanır. Daha fazla bilgi için lütfen NAT Kuralları belge sayfasına bakın.
Bu alıştırmada, DPA ile NAT kuralları arasındaki etkileşimi gözlemliyoruz. producer-address-2 adresine erişirken nat-address-2 kullanmak için önce bir NAT kuralı tanımlayalım.
Aşağıdaki gcloud komutunu çalıştırın. Bu komut, NAT kuralını oluşturmak için
gcloud alpha compute routers nats rules create 100 \ --match='destination.ip == "'$producerip2'"' \ --source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
Aşağıdaki çıkışı alırsınız:
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
Yeni NAT kuralının etkisini görmek için get-nat-mapping-info komutunu tekrar çalıştıralım.
gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4
Bu komut aşağıdaki çıkışı vermelidir:
---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
- <NAT Address IP1>:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
- <NAT Address IP1>:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
Artık ruleMappings hiyerarşisi altında nat-address-2 için özel olarak ayrılmış ek bağlantı noktalarımız (belirtilen minimum değer olan 64'te) olduğunu unutmayın.
Peki bir örnek, NAT kuralıyla belirtilen hedefle çok sayıda bağlantı açarsa ne olur? Haydi öğrenelim.
Örneğe tekrar SSH uygulayalım:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Üretici IP ortam değişkenlerini yeniden dışa aktarın.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Şimdi curl döngüsünü bu kez producerip2 ile tekrar çalıştıralım.
while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip2/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Aşağıdakine benzer bir çıkış alırsınız:
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 129 successful Connection # 130 failed Connection # 131 failed Connection # 258 successful Connection # 259 failed Connection # 260 failed Connection # 515 successful Connection # 516 failed Connection # 1024 successful Loop Done, Sleeping for 150s
Temel olarak önceki testin yansıtılması. Örneğin SSH oturumundan çıkıp NAT eşlemelerine tekrar bakalım.
gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4
Bu komut aşağıdaki çıkışı vermelidir:
---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
- <NAT Address IP1>:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:1024-1055
- <NAT Address IP2>:1088-1119
- <NAT Address IP2>:1152-1215
- <NAT Address IP2>:1280-1407
- <NAT Address IP2>:1536-1791
numTotalDrainNatPorts: 0
numTotalNatPorts: 512
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
- <NAT Address IP1>:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:32768-32799
- <NAT Address IP2>:32832-32863
- <NAT Address IP2>:32896-32959
- <NAT Address IP2>:33024-33151
- <NAT Address IP2>:33280-33535
numTotalDrainNatPorts: 0
numTotalNatPorts: 512
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
---
instanceName: consumer-instance-2
interfaceNatMappings:
- natIpPortRanges:
- <NAT Address IP1>:1056-1087
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:1056-1087
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.3
- natIpPortRanges:
- <NAT Address IP1>:32800-32831
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:32800-32831
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.3
---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
- <NAT Address IP1>:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:1024-1055
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
- <NAT Address IP1>:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleMappings:
- natIpPortRanges:
- <NAT Address IP2>:32768-32799
numTotalDrainNatPorts: 0
numTotalNatPorts: 32
ruleNumber: 100
sourceAliasIpRange: ''
sourceVirtualIp: 10.0.0.2
Yukarıda görebileceğiniz gibi, consumer-instance-1'nın varsayılan NAT IP'sinde ( nat-address-1 için IP) yalnızca 64 bağlantı noktası ayrılmışken NAT kuralının IP'sinde (nat-address-2 için IP) 1.024 bağlantı noktası ayrılmıştır. Bu süre zarfında consumer-instance-2, tüm NAT IP'leri için varsayılan 64 bağlantı noktası tahsisini korudu.
Alıştırma olarak ters durumu test edebilirsiniz. Cloud NAT'in tüm ek bağlantı noktalarını serbest bırakmasına izin verin, ardından producerip1 üzerinde curl döngüsünü çalıştırın ve get-nat-mapping-info çıktısındaki etkileri gözlemleyin.
10. Temizleme adımları
Tekrarlanan ödemelerden kaçınmak için bu codelab ile ilişkili tüm kaynakları silmeniz gerekir.
Önce tüm örnekleri silin.
Cloud Shell'den:
gcloud compute instances delete consumer-instance-1 consumer-instance-2 \ producer-instance-1 producer-instance-2 \ --zone us-east4-a --quiet
Beklenen çıktı :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].
Ardından, Cloud Router'ı silin. Cloud Shell'den:
gcloud compute routers delete consumer-cr \ --region us-east4 --quiet
Aşağıdaki çıkışı alırsınız :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].
Tüm harici IP adreslerini serbest bırakın. Cloud Shell'den:
gcloud compute addresses delete nat-address-1 \ nat-address-2 producer-address-1 \ producer-address-2 --region us-east4 --quiet
Aşağıdaki çıkışı alırsınız :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
VPC güvenlik duvarı kurallarını silin. Cloud Shell'den:
gcloud compute firewall-rules delete consumer-allow-iap \ producer-allow-80 --quiet
Aşağıdaki çıkışı alırsınız :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80].
Alt ağları silin. Cloud Shell'den:
gcloud compute networks subnets delete cons-net-e4 \ prod-net-e4 --region=us-east4 --quiet
Aşağıdaki çıkışı alırsınız :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4].
Son olarak, VPC'leri silelim. Cloud Shell'den:
gcloud compute networks delete consumer-vpc \ producer-vpc --quiet
Aşağıdaki çıkışı alırsınız :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].
11. Tebrikler!
Cloud NAT DPA Lab'ı tamamladınız.
Kapsamınız
- DPA'ya hazırlanmak için Cloud NAT ağ geçidi nasıl ayarlanır?
- DPA olmadan bağlantı noktası ayırmalarını inceleme
- NAT ağ geçidi için DPA'yı etkinleştirme ve yapılandırma
- Paralel çıkış bağlantıları çalıştırarak DPA'nın etkilerini gözlemleme
- DPA'nın etkin olduğu bir NAT ağ geçidine NAT kuralları ekleme
- Çıkış bağlantılarını birden fazla hedefe çalıştırarak Veri Koruma Yasası'nın kurallarla birlikte davranışını görme
Sonraki Adımlar
- Dinamik bağlantı noktası ayırma doküman sayfamıza göz atın.
- Uygulamanızla NAT zaman aşımlarını ve bağlantı noktası ayırma değerlerini ayarlamayı deneyin.
- Google Cloud Platform'da ağ iletişimi hakkında daha fazla bilgi
©Google, Inc. veya bağlı kuruluşları. Tüm hakları saklıdır. Dağıtmayın.