Cloud NAT Dinamik Bağlantı Noktası Ayırma'nı Kullanma

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.

75eef5f6fd6d7e41.png

Yönlendirmesiz ortam kurulumu

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 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_ID olarak 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.
  1. 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:

bce75f34b2c53987.png

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:

f6ef2b5f13479f3a.png

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

a21caa6c333909d8.png

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

©Google, Inc. veya bağlı kuruluşları. Tüm hakları saklıdır. Dağıtmayın.