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

1. Genel Bakış

Dinamik Bağlantı Noktası Ayırma (DPA), Cloud NAT'deki yeni bir özelliktir. DPA etkin olduğunda Cloud NAT, örnekler için bağlantı noktası ayırmalarını ihtiyaca göre dinamik olarak ölçeklendirir. DPA, minimum ve maksimum bağlantı noktası sınırlarıyla yapılandırılır. Bu yüzden, bağlantı noktalarını hiçbir zaman minimum değerin altına düşürmez veya maksimum değeri aşan ölçekleme yapmaz. Bu sayede NAT ağ geçitlerinin arkasındaki bazı örnekler, Cloud NAT'nin arkasındaki tüm örneklere daha fazla bağlantı noktası tahsis etmek zorunda kalmadan bağlantı sayılarını dinamik olarak ölçeklendirebilir.

DPA kullanılmadığında, Cloud NAT'nin arkasındaki tüm örneklere, minPortsPerVm parametresiyle tanımlanan şekilde kullanım dikkate alınmaksızın aynı sayıda bağlantı noktası ayrılır .

Daha fazla bilgi için lütfen NAT DPA ile ilgili belgeler bölümünü inceleyin.

Neler öğreneceksiniz?

  • DPA hazırlığı için Cloud NAT ağ geçidi ayarlama.
  • 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 etkin durumdayken NAT Ağ Geçidi'ne NAT kuralları ekleme.
  • Birden fazla hedefe çıkış bağlantıları çalıştırarak DPA davranışını Kurallar ile görme.

Gerekenler

  • Google Compute Engine ile ilgili temel bilgiler
  • Temel ağ iletişimi ve TCP/IP bilgisi
  • Temel Unix/Linux komut satırı bilgisi
  • Networking in Google Cloud (Google Cloud'da Ağ İletişimi) laboratuvarı gibi Google Cloud'da bir ağ iletişimi turunu tamamlamış olmanız faydalı olacaktır.
  • "Alfa Erişimi"ne sahip bir Google Cloud projesi etkin.
  • Cloud NAT temellerini anlama

2. Google Cloud Console ve Cloud Shell'i kullanma

GCP ile etkileşime geçmek 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 erişilebilir.

75eef5f6fd6d7e41.png

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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 dizesidir ve bunu istediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de, Proje Kimliğine referans vermeniz gerekir (ve bu kimlik genellikle PROJECT_ID olarak tanımlanır). Beğenmezseniz başka bir rastgele kod oluşturun ya da kendi proje kimliğinizi deneyip mevcut olup olmadığına bakın. Sıcaklık "soğudu" takip etmeniz gerekir.
  • Bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü 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 çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmayla karşılaşmamak için kaynakları kapatmak istiyorsanız tüm "temizleme" işlemlerini uygulayın buradaki talimatları uygulayın. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de 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 yer alan Cloud Shell simgesini tıklayın:

bce75f34b2c53987.png

Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:

f6ef2b5f13479f3a.png

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu laboratuvardaki tüm çalışmalarınızı yalnızca bir tarayıcıyla yapabilirsiniz.

3. Laboratuvar Kurulumu

Bu laboratuvar için bir Proje kullanacak ve her birinde alt ağ bulunan iki VPC oluşturacaksınız. Harici IP adreslerini ayıracak, ardından bir Cloud NAT ağ geçidi (Cloud Yönlendiricisi 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ırma'yı etkinleştirip davranışını doğrulayabilirsiniz. Son olarak, NAT kurallarını yapılandıracak ve DPA ile NAT kuralları arasındaki etkileşimi gözlemleyeceksiniz.

Ağ iletişimi mimarisine genel bakış:

a21caa6c333909d8.png

4. Harici IP Adreslerini Ayırt

Tüm harici IP adreslerini bu laboratuvarda kullanılacak şekilde 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].

Ortam değişkeni olarak ayrılmış IP adreslerini 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)"`

Herhangi bir çıkış beklenmiyor ancak adreslerin doğru şekilde doldurulduğundan emin olmak gerekiyor. Tüm ortam değişkenlerinin değerlerinin çıktısını oluşturalım.

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, internete yönelik hizmeti iki genel IP "üretici-adresi-1" kullanarak sunar. ve "Generative-address-2" ,

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

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

Şimdi, NAT IP adreslerinin 8080 bağlantı noktası üzerindeki üretici örneklerine ulaşmasına izin vermek için VPC güvenlik duvarı kuralları oluşturalım.

Cloud Shell'den ilk kural için:

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

Sonraki adım, iki üretici örneğini oluşturmaktır.

Üretici örnekleri basit bir nginx proxy dağıtımı çalıştırır.

Örnekleri tüm gerekli yazılımlarla birlikte hızlıca sağlamak için Debian APT paket yöneticisini kullanarak nginx yükleyen bir başlangıç komut dosyasıyla örnekler oluşturacağız.

NAT kuralları yazabilmek için her bir örneğin farklı bir ayrılmış IP adresi sağlanır.

İ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 Örnekleri Oluşturma

Üretici hizmetini oluşturduğunuza göre şimdi sıra tüketici VPC'sini ve Cloud NAT ağ geçidini oluşturmaya geldi.

VPC'yi ve alt ağı oluşturduktan sonra, TCP kaynak IP aralıkları için IAP'ye izin vermek amacıyla basit bir giriş güvenlik duvarı kuralı ekleyeceğiz. Bu sayede gcloud'u kullanarak doğrudan tüketici örneklerine SSH uygulayabiliyoruz.

Ardından, manuel ayırma modunda basit bir Cloud NAT ağ geçidi ve ayrılmış "nat-address-1" adresini oluşturacağız görüntülenebilir. Codelab'in sonraki bölümlerinde, ağ geçidinin yapılandırmasını Dinamik Bağlantı Noktası Ayırma'yı etkinleştirecek ve daha sonra özel kurallar ekleyecek şekilde güncelleyeceğiz.

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

Sonra, us-east4 bölgesinde 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

Şimdi, IAP aralık adreslerinin 22 numaralı bağlantı noktasındaki tüketici örneklerine ulaşmasına izin vermek için VPC güvenlik duvarı kuralları oluşturalım.

İlk güvenlik duvarı kuralı için Cloud Shell'den 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, önce bir Cloud Router örneği oluşturmamız gerekir (özel bir ASN numarası kullanırız ancak bu numara bu laboratuvarın etkinlikleriyle ilgili 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.

Cloud NAT ağ geçidinin varsayılan olarak minPortsPerVm değeri 64 olacak şekilde oluşturulduğunu unutmayın

Tüketici testi örneklerini oluşturma Daha sonra örnek içinde referans verebilmek 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, aynı ayrılmış IP "nat-address-1"i kullanan varsayılan Cloud NAT davranışını kullanır harici adreslerle iletişim kurmanızı sağlar. Ayrıca, Cloud NAT'de DPA henüz etkinleştirilmemiştir.

Aşağıdaki komutu çalıştırarak Cloud NAT'nin tüketici örneklerimizi hangi bağlantı noktalarını ayırdığını doğrulayalım

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

Örnek çıkış

---
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 görebileceğiniz gibi Cloud NAT, aynı harici IP'den (nat-address-1) örnek başına 64 bağlantı noktası ayırmıştır.

DPA'yı etkinleştirmeden önce paralel olarak kaç bağlantı açabileceğimizi doğrulayalım.

Birinci 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ış (tam çıkış kısa olması için kısaltıldı)

External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance-1:~$

Tüketici örneğinden önce her iki üretici IP'sini de alıp ortam 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"`

Daha sonra, başarılı bir şekilde ulaşabileceğimizden emin olmak için her iki üretici örneğine kıvrılmaya çalışın.

<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, curl'ü bir döngü üzerinden çalıştırarak, üretici örneklerinden biriyle birçok paralel bağlantı oluşturmayı deneyelim. Cloud NAT'nin, kapalı yuvaların 2 dakika boyunca yeniden kullanılmasına izin vermediğini unutmayın. Bu nedenle, tüm bağlantı denemelerini 2 dakika içinde tekrar gözden geçirebildiğ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çmanız beklenir. Komut dosyası aşağıdakini yazdırmalıdır:

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, önce tüm eski yuvaların boşaltılması için 2 dakika bekleyin. Sonra aynı tek satırlık ifadeyi aşağıdaki şekilde ayarlayın ve 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

Bu aşamada aşağıdaki çıkışı 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ı olurken kalan 6 bağlantının, bağlantı noktalarının kullanılamaması nedeniyle başarısız olduğunu gösterir.

Şimdi SSH kabuğundan çıkıp aşağıdaki bölümde DPA'yı etkinleştirelim.

8. DPA'yı etkinleştirin ve davranışını doğrulayın

DPA'yı etkinleştiren, sanal makine başına minimum bağlantı noktası tahsisini 64 ve maksimum bağlantı noktası ayırmayı 1024 olarak ayarlayan aşağıdaki gcloud komutunu çalıştırın.

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

Şunun çıktısını verir:

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

Şimdi, her iki örneğin hâlâ yalnızca 64 bağlantı noktası ayrılmış olduğunu onaylamak için get-nat-mapping-info aracını yeniden çalıştıralım

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

Örnek çıktı (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ı tahsisi açısından çok fazla değişiklik olmadı.

Örneğe 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"`

Paralel bağlantıları simüle etmek için önceki döngüyü 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ö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ında bağlantı noktası tahsisini hızlandırır ancak bunun ağ katmanı genelinde programlanması biraz zaman alır. Bu nedenle, geri kalan bağlantı denemelerini başarıyla tamamlamadan önce 1-3 bağlantı zaman aşımıyla karşılaşıyoruz.

Curl için agresif bir zaman aşımı (5 saniye) belirttik, ancak DPA, bağlantı noktası tahsislerini artırırken daha uzun zaman aşımlarına sahip uygulamaların bağlantıları başarıyla tamamlayabilmesi gerekir.

Bu tür 1024 bağlantı denemeleri için döngü çalıştırıldığında bu yükseliş davranışı 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 üssüyle atadığından, her adımda ayırmaları iki katına çıkarır. Bu nedenle, 64 ile 1024 arasındaki 2'nin üsleri etrafında bağlantı zaman aşımlarının vurgulandığını görüyoruz.

maxPortsPerVM değerini 1024 olarak ayarladığımızdan, 1024'ten fazla bağlantıya geçebileceğimizi düşünmüyoruz. Bunu, curl döngüsünü 1024'ten daha yüksek bir sayıyla yeniden çalıştırarak (eski bağlantı noktalarını sıfırlamak için 2 dakika bekledikten sonra) 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ış 1024'ten sonraki bağlantıların başarısız olduğunu gösteriyor

<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'ye, bağlantı noktası ayırmalarını sanal makine başına 1024'ten fazla ölçeklendirmemesi talimatını verdik.

SSH oturumundan çıkıp get-nat-mapping-info uygulamasını yeterince hızlı bir şekilde yeniden çalıştırırsak ayrılmış fazladan bağlantı noktalarını görebiliriz

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

Aşağıdaki çıkışı inceleyin

---
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 ayrılmış 1024 bağlantı noktası bulunurken consumer-instance-2 için yalnızca 64 bağlantı noktası ayrılmış. DPA'dan önce kolay mümkün olmayan bu yöntem, Cloud NAT için DPA'nın gücünü tam olarak öne çıkarıyordu.

get-nat-mapping-info komutunu yeniden çalıştırmadan önce 2 dakika beklerseniz consumer-instance-1 ürününün, yalnızca 64 bağlantı noktası ayrılmış olan minimum değerine geri döndüğünü görürsünüz. DPA'nın sadece bağlantı noktası tahsislerini artırma becerisini değil, aynı NAT Ağ Geçidi'nin arkasındaki diğer örneklerin potansiyel kullanımı için kullanılmadığında da serbest bırakma özelliğini gösterir.

9. Cloud NAT Kurallarını DPA ile test etme

Ayrıca kısa süre önce, müşterilerin belirli harici hedefler için belirli NAT IP'leri kullanan kurallar yazmasına olanak tanıyan Cloud NAT için NAT kuralları işlevini de kullanıma sunduk. Daha fazla bilgi için lütfen NAT Kuralları belgeleri sayfasına göz atın.

Bu alıştırmada DPA ve NAT kuralları arasındaki etkileşimi gözlemleyeceğiz. Öncelikle, producer-address-2 ürününe erişirken nat-address-2 kullanılacak bir NAT kuralı tanımlayalım.

Şu gcloud komutunu çalıştırın: Bu komut,

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 çıktıyı almanız gerekir

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

Şimdi yeni NAT kuralının etkisini görmek için get-nat-mapping-info uygulamasını yeniden çalıştıralım.

gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4

Hangisi şu sonucu verir:

---
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şisinde özellikle nat-address-2 için ayrılmış ek bağlantı noktalarımız olduğuna dikkat edin (belirtilen minimum değer 64'tür).

Peki bir örnek, NAT kuralı tarafından belirtilen hedefe çok sayıda bağlantı açarsa ne olur? Haydi öğrenelim.

Örneğe 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 karşısında 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

Şuna 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 teste benzer. Ö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

Hangisi şu sonucu verir:

---
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özlemleyebileceğiniz gibi consumer-instance-1 ürününün varsayılan NAT IP'sine ( nat-address-1 için IP) hâlâ yalnızca 64 bağlantı noktası ayrılmış ancak NAT kuralının IP'sine (nat-address-2 için IP) 1024 bağlantı noktası ayrılmış. Bu sırada consumer-instance-2 tüm NAT IP'leri için 64 bağlantı noktasının varsayılan ayırmalarını korudu.

Alıştırma olarak, tersi test edebilirsiniz. Cloud NAT'nin tüm ek bağlantı noktalarını ayırmasına izin verin, ardından curl döngüsünü producerip1 doğrultusunda çalıştırın ve get-nat-mapping-info çıkışı üzerindeki etkilerini gözlemleyin.

10. Temizleme Adımları

Yinelenen ö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 çıkış :

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 Yönlendirici'yi silin. Cloud Shell'den:

gcloud compute routers delete consumer-cr \
 --region us-east4 --quiet

Aşağıdaki çıktıyı almanız gerekir :

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 çıktıyı almanız gerekir :

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 çıktıyı almanız gerekir :

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 çıktıyı almanız gerekir :

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 çıktıyı almanız gerekir :

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'ini tamamladınız.

İşlediğiniz konular

  • DPA hazırlığı için Cloud NAT ağ geçidi ayarlama.
  • 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 etkin durumdayken NAT Ağ Geçidi'ne NAT kuralları ekleme.
  • Birden fazla hedefe çıkış bağlantıları çalıştırarak DPA davranışını Kurallar ile görme.

Sonraki Adımlar

©Google, Inc. veya satış ortakları. Tüm hakları saklıdır. Bu içeriği dağıtmayın.