Menggunakan Alokasi Port Dinamis Cloud NAT

1. Ringkasan

Alokasi Port Dinamis (DPA) adalah fitur baru di Cloud NAT. Dengan mengaktifkan DPA, Cloud NAT akan meningkatkan/mengurangi skala alokasi port untuk instance secara dinamis sesuai kebutuhan. DPA dikonfigurasi dengan batas port minimum dan maksimum sehingga tidak pernah memperkecil skala port di bawah minimum, atau meningkatkan skala melebihi maksimum. Dengan cara ini, beberapa instance di belakang gateway NAT dapat meningkatkan jumlah koneksinya secara dinamis tanpa harus mengalokasikan lebih banyak port ke semua instance di balik Cloud NAT.

Tanpa DPA, semua instance di balik Cloud NAT dialokasikan jumlah port yang sama terlepas dari penggunaannya, seperti yang ditentukan oleh parameter minPortsPerVm .

Untuk mengetahui informasi selengkapnya, tinjau bagian Dokumentasi tentang DPA NAT .

Yang akan Anda pelajari

  • Cara menyiapkan gateway Cloud NAT sebagai persiapan untuk DPA.
  • Cara memeriksa alokasi port tanpa DPA.
  • Cara mengaktifkan dan mengonfigurasi DPA untuk gateway NAT.
  • Cara mengamati efek DPA dengan menjalankan koneksi keluar paralel.
  • Cara menambahkan aturan NAT ke Gateway NAT dengan DPA diaktifkan.
  • Cara melihat perilaku DPA dengan Aturan dengan menjalankan koneksi keluar ke beberapa tujuan.

Yang Anda butuhkan

  • Pengetahuan dasar tentang Google Compute Engine
  • Pengetahuan dasar tentang networking dan TCP/IP
  • Pengetahuan dasar mengenai command line Unix/Linux
  • Ada baiknya Anda menyelesaikan tur networking di Google Cloud seperti lab Networking in Google Cloud.
  • Project Google Cloud dengan ‘Alpha Access' mengaktifkan pembuatan versi.
  • Pemahaman tentang dasar-dasar Cloud NAT.

2. Menggunakan Google Cloud Console dan Cloud Shell

Untuk berinteraksi dengan GCP, kami akan menggunakan Konsol Google Cloud dan Cloud Shell di seluruh lab ini.

Konsol Google Cloud

Konsol Cloud dapat diakses di https://console.cloud.google.com.

75eef5f6fd6d7e41.pngS

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:

bce75f34b2c53987.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

f6ef2b5f13479f3a.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser.

3. Penyiapan Lab

Untuk lab ini, Anda akan menggunakan sebuah Project, dan masing-masing akan membuat dua VPC dengan satu subnet. Anda akan mencadangkan alamat IP eksternal lalu membuat dan mengonfigurasi gateway Cloud NAT (dengan Cloud Router), dua instance produsen serta dua instance konsumen. Setelah memvalidasi perilaku Cloud NAT default, Anda akan mengaktifkan Alokasi Port Dinamis dan memvalidasi perilakunya. Terakhir, Anda juga akan mengkonfigurasi aturan NAT dan mengamati interaksi antara DPA dan Aturan NAT.

Ringkasan arsitektur jaringan:

a21caa6c333909d8.png

4. Pesan Alamat IP Eksternal

Mari cadangkan semua alamat IP eksternal untuk digunakan di lab ini. Hal ini akan membantu Anda menulis semua aturan NAT dan firewall yang relevan di VPC konsumen dan produsen.

Dari Cloud Shell:

gcloud compute addresses  create nat-address-1 nat-address-2 \
 producer-address-1 producer-address-2 --region us-east4

Output:

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

Isi alamat IP yang dicadangkan sebagai variabel lingkungan.

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)"`

Tidak ada output yang diharapkan, tetapi untuk mengonfirmasi bahwa alamat telah diisi dengan benar. Mari kita buat output nilai semua variabel lingkungan.

env | egrep '^(nat|producer)ip[1-3]'

Output:

producerip1=<Actual Producer IP 1>
producerip2=<Actual Producer IP 2>
natip1=<NAT IP 1>
natip2=<NAT IP 2>

5. VPC Produsen dan Penyiapan Instance.

Sekarang kita akan membuat resource untuk resource produser. Instance yang berjalan di VPC produsen akan menawarkan layanan yang terhubung ke internet menggunakan dua IP publik "produsen-address-1" dan "produsen-address-2" kami.

Pertama, mari kita buat VPC. Dari Cloud Shell:

gcloud compute networks create producer-vpc --subnet-mode custom

Output:

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

Selanjutnya, mari kita buat subnet di us-east4. Dari Cloud Shell:

gcloud compute networks subnets create prod-net-e4 \
   --network producer-vpc --range 10.0.0.0/24 --region us-east4

Output:

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

Selanjutnya, mari kita buat aturan firewall VPC untuk mengizinkan alamat IP NAT menjangkau instance produsen pada port 8080.

Untuk aturan pertama, dari Cloud Shell:

gcloud compute firewall-rules create producer-allow-80 \
  --network producer-vpc --allow tcp:80 \
  --source-ranges $natip1,$natip2

Output:

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

Langkah selanjutnya adalah membuat dua instance produser.

Instance produser akan menjalankan deployment proxy nginx sederhana.

Untuk menyediakan instance dengan semua software yang diperlukan secara cepat, kita akan membuat instance dengan skrip start-up yang menginstal nginx menggunakan pengelola paket APT Debian.

Agar dapat menulis aturan NAT, kita akan menyediakan setiap instance dengan alamat IP yang dicadangkan yang berbeda.

Buat instance pertama. Dari Cloud Shell:

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"

Output:

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

Kemudian buat instance kedua. Dari Cloud Shell:

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"

Output:

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. Menyiapkan VPC Konsumen, Cloud NAT, dan Instance

Setelah membuat layanan produsen, kini saatnya membuat VPC konsumen dan gateway Cloud NAT-nya.

Setelah membuat VPC dan subnet, kita akan menambahkan aturan firewall masuk sederhana guna mengizinkan IAP untuk rentang IP sumber TCP. Dengan begitu, kita dapat melakukan SSH ke instance konsumen secara langsung menggunakan gcloud.

Kemudian, kita akan membuat gateway Cloud NAT sederhana dalam mode alokasi manual dan alamat yang dicadangkan "nat-address-1" yang terkait dengannya. Di bagian codelab berikutnya, kita akan memperbarui konfigurasi gateway untuk mengaktifkan Alokasi Port Dinamis dan, setelahnya, menambahkan aturan kustom.

Pertama, mari kita buat VPC. Dari Cloud Shell:

gcloud compute networks create consumer-vpc --subnet-mode custom

Output:

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

Selanjutnya, mari kita buat subnet di us-east4. Dari Cloud Shell:

gcloud compute networks subnets create cons-net-e4 \
   --network consumer-vpc --range 10.0.0.0/24 --region us-east4

Output:

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

Selanjutnya, mari kita buat aturan firewall VPC untuk mengizinkan alamat rentang IAP menjangkau instance konsumen pada port 22.

Untuk aturan firewall pertama, jalankan perintah berikut dari Cloud Shell:

gcloud compute firewall-rules create consumer-allow-iap \
  --network consumer-vpc --allow tcp:22 \
  --source-ranges 35.235.240.0/20

Output:

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

Sebelum membuat gateway NAT, kita perlu membuat instance Cloud Router terlebih dahulu (kita menggunakan nomor ASN pribadi, tetapi tidak relevan untuk aktivitas lab ini). Dari Cloud Shell:

gcloud compute routers create consumer-cr \
--region=us-east4 --network=consumer-vpc \
 --asn=65501

Output:

Creating router [consumer-cr]...done.
NAME         REGION       NETWORK
consumer-cr  us-east4  consumer-vpc

Kemudian, buat instance gateway NAT. Dari Cloud Shell:

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

Output:

Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.

Perlu diperhatikan bahwa, secara default, gateway Cloud NAT dibuat dengan minPortsPerVm ditetapkan ke 64

Membuat instance pengujian konsumen. Di sini kita mengisi IP produsen yang dicadangkan agar dapat merujuk ke instance tersebut dalam instance nanti. Dari Cloud Shell:

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

Output:

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. Memverifikasi perilaku Cloud NAT default

Pada tahap ini, instance konsumen menggunakan perilaku Cloud NAT default, yang menggunakan IP "nat-address-1" yang dicadangkan sama untuk berkomunikasi dengan semua alamat eksternal. Cloud NAT juga belum mengaktifkan DPA.

Mari kita validasi port mana yang telah diberi alokasi instance konsumen oleh Cloud NAT dengan menjalankan perintah berikut

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

Contoh output

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

Seperti yang dapat Anda lihat dari output di atas, Cloud NAT telah mengalokasikan 64 port per instance dari IP eksternal yang sama (nat-address-1)

Mari kita validasi berapa banyak koneksi yang dapat kita buka secara paralel sebelum mengaktifkan DPA.

SSH ke instance konsumen pertama. Dari Cloud Shell:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

Anda sekarang akan berada di shell instance.

Contoh Output (output penuh terpotong agar lebih singkat)

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

Dari dalam instance konsumen, pertama-tama mari kita ambil kedua IP produsen dan isi sebagai variabel lingkungan

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"`

Kemudian, coba lakukan curl ke kedua instance produser untuk memastikan kita dapat menjangkaunya dengan sukses.

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

Sekarang, mari kita coba dan buat banyak koneksi paralel ke salah satu instance produser dengan menjalankan curl melalui loop. Ingat bahwa Cloud NAT tidak mengizinkan penggunaan kembali soket tertutup selama 2 menit. Oleh karena itu, selama kita dapat melakukan loop pada semua upaya koneksi dalam waktu 2 menit, kita dapat menyimulasikan koneksi paralel dengan cara ini.

Jalankan perintah berikut di sesi SSH instance

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

Anda akan berhasil membuka 64 koneksi paralel dan skrip akan mencetak hal berikut

Connection # 64 successful

Loop Done, Sleeping for 150s
Connection # 64 successful

Loop Done, Sleeping for 150s

Untuk melihat bahwa kita tidak dapat melampaui 64 koneksi paralel, pertama-tama tunggu 2 menit untuk mengosongkan semua soket lama. Kemudian, sesuaikan satu baris yang sama dengan baris berikutnya dan jalankan kembali.

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

Anda akan memperkirakan output berikut

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

Hal ini menunjukkan bahwa meskipun 64 koneksi pertama berhasil, 6 koneksi lainnya gagal karena tidak tersedianya port.

Mari kita lakukan sesuatu, keluar dari SSH shell, dan mari kita aktifkan DPA di bagian berikut.

8. Mengaktifkan DPA dan memvalidasi perilakunya

Jalankan perintah gcloud berikut, yang mengaktifkan DPA, menetapkan alokasi port minimum per VM ke 64, dan alokasi port maksimum ke 1024.

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

Yang menghasilkan

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

Sekarang, mari kita jalankan kembali get-nat-mapping-info untuk mengonfirmasi bahwa kedua instance masih hanya memiliki 64 port yang dialokasikan

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

Output sampel (dipotong agar singkat)

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

Tidak banyak yang berubah dalam hal alokasi port karena instance belum menggunakan port apa pun secara aktif.

Mari kita lakukan SSH kembali ke instance:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

Mengekspor ulang variabel lingkungan IP produsen.

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"`

Kemudian, jalankan kembali loop sebelumnya untuk menyimulasikan koneksi paralel:

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

Sekarang kita akan melihat output berikut

Connection # 64 successful
Connection # 65 failed

Connection # 66 failed
Connection # 70 successful
Loop Done, Sleeping for 150s

Jadi apa yang terjadi di sini? Cloud NAT meningkatkan alokasi port pada peningkatan penggunaan port, tetapi hal ini membutuhkan waktu untuk diprogram di seluruh lapisan jaringan. Oleh karena itu, kita melihat 1-3 waktu tunggu koneksi sebelum kita berhasil menyelesaikan upaya koneksi lainnya.

Kami telah menentukan waktu tunggu yang agresif untuk curl (5 detik), tetapi aplikasi dengan waktu tunggu yang lebih lama seharusnya dapat menyelesaikan koneksi dengan sukses sementara DPA meningkatkan alokasi port.

Perilaku peningkatan ini dapat dilihat dengan lebih jelas saat kita menjalankan loop untuk upaya koneksi sebanyak 1024 kali seperti itu

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

Sekarang kita akan melihat output berikut

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

Karena Cloud NAT mengalokasikan port dalam pangkat 2, yang pada dasarnya menggandakan alokasi di setiap langkah, kita melihat waktu tunggu koneksi disorot di sekitar pangkat 2 antara 64 dan 1024.

Karena kita telah menetapkan maxPortsPerVM ke 1024, kita tidak akan bisa menjangkau lebih dari 1.024 koneksi. Kita dapat mengujinya dengan menjalankan kembali loop curl dengan jumlah yang lebih tinggi dari 1024 (setelah menunggu 2 menit untuk mereset port yang sudah tidak berlaku).

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

Dan seperti yang diharapkan, output menunjukkan koneksi di luar 1024 mulai gagal

<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

Dengan menetapkan maxPortsPerVM ke 1024, kami menginstruksikan Cloud NAT agar tidak menskalakan alokasi port di atas 1024 per VM.

Jika kita keluar dari sesi SSH dan menjalankan kembali get-nat-mapping-info dengan cukup cepat, kita dapat melihat port tambahan yang dialokasikan

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

Dan amati output berikut

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

Perhatikan bahwa consumer-instance-1 memiliki 1.024 port yang dialokasikan, tetapi consumer-instance-2 hanya memiliki 64 port yang dialokasikan. Hal ini tidak mudah dilakukan sebelum DPA dan ini jelas menyoroti kekuatan DPA untuk Cloud NAT.

Jika menunggu selama 2 menit sebelum menjalankan kembali perintah get-nat-mapping-info, Anda akan melihat bahwa consumer-instance-1 kembali ke nilai minimumnya, yaitu hanya 64 port yang dialokasikan. Menggambarkan tidak hanya kemampuan DPA untuk meningkatkan alokasi port, tetapi juga melepaskannya saat tidak digunakan untuk potensi penggunaan oleh instance lain di balik NAT Gateway yang sama.

9. Menguji Aturan Cloud NAT dengan DPA

Kami baru-baru ini juga merilis fungsi aturan NAT untuk Cloud NAT, yang memungkinkan pelanggan menulis aturan yang menggunakan IP NAT tertentu untuk tujuan eksternal tertentu. Untuk mengetahui informasi selengkapnya, lihat halaman dokumentasi Aturan NAT.

Dalam latihan ini, kami mengamati interaksi antara Aturan DPA dan NAT. Pertama-tama, mari kita tentukan aturan NAT untuk menggunakan nat-address-2 saat mengakses producer-address-2.

Jalankan perintah gcloud berikut, yang membuat aturan NAT menggunakan

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

Output Anda akan terlihat seperti berikut

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

Sekarang, mari kita jalankan kembali get-nat-mapping-info untuk melihat efek aturan NAT baru.

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

Yang akan menghasilkan output berikut

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

Perhatikan bahwa sekarang kita memiliki port tambahan yang dialokasikan (juga pada 64, nilai minimum yang ditentukan) khusus untuk nat-address-2 berdasarkan hierarki ruleMappings.

Jadi apa yang terjadi jika sebuah instance membuka banyak koneksi ke tujuan yang ditentukan oleh aturan NAT? Let's find out.

Mari kita lakukan SSH kembali ke instance:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

Mengekspor ulang variabel lingkungan IP produsen.

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"`

Sekarang, mari kita jalankan ulang loop curl terhadap producerip2 kali ini

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

Anda akan mendapatkan output yang mirip dengan berikut ini

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

Pada dasarnya mencerminkan pengujian sebelumnya. Mari kita keluar dari sesi SSH instance dan lihat kembali pemetaan nat.

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

Yang akan menghasilkan output berikut

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

Seperti yang dapat Anda amati di atas, IP NAT default consumer-instance-1 ( IP untuk nat-address-1) masih hanya memiliki 64 port yang dialokasikan, tetapi IP aturan NAT (IP untuk nat-address-2) memiliki 1.024 port yang dialokasikan. Selama itu, consumer-instance-2 mempertahankan alokasi defaultnya sebanyak 64 port untuk semua IP NAT.

Sebagai latihan, Anda dapat menguji kasus sebaliknya. Biarkan Cloud NAT membatalkan alokasi semua port tambahan, lalu jalankan curl loop terhadap producerip1 dan amati efeknya pada output get-nat-mapping-info

10. Langkah-Langkah Pembersihan

Untuk menghindari tagihan berulang, Anda harus menghapus semua resource yang terkait dengan codelab ini.

Hapus semua instance terlebih dahulu.

Dari Cloud Shell:

gcloud compute instances delete consumer-instance-1 consumer-instance-2 \
 producer-instance-1 producer-instance-2 \
 --zone us-east4-a --quiet

Output yang diharapkan :

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

Selanjutnya, hapus Cloud Router. Dari Cloud Shell:

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

Output Anda akan terlihat seperti berikut :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].

Melepaskan semua alamat IP eksternal. Dari Cloud Shell:

gcloud compute addresses delete nat-address-1 \
 nat-address-2 producer-address-1 \
 producer-address-2 --region us-east4 --quiet

Output Anda akan terlihat seperti berikut :

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

Menghapus aturan firewall VPC. Dari Cloud Shell:

gcloud compute firewall-rules delete consumer-allow-iap \
 producer-allow-80 --quiet

Output Anda akan terlihat seperti berikut :

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

Menghapus subnet. Dari Cloud Shell:

gcloud compute networks subnets delete cons-net-e4 \
 prod-net-e4 --region=us-east4 --quiet

Output Anda akan terlihat seperti berikut :

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

Terakhir, mari kita hapus VPC. Dari Cloud Shell:

gcloud compute networks delete consumer-vpc \
 producer-vpc --quiet

Output Anda akan terlihat seperti berikut :

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. Selamat!

Anda telah menyelesaikan Lab DPA Cloud NAT!

Yang telah Anda bahas

  • Cara menyiapkan gateway Cloud NAT sebagai persiapan untuk DPA.
  • Cara memeriksa alokasi port tanpa DPA.
  • Cara mengaktifkan dan mengonfigurasi DPA untuk gateway NAT.
  • Cara mengamati efek DPA dengan menjalankan koneksi keluar paralel.
  • Cara menambahkan aturan NAT ke Gateway NAT dengan DPA diaktifkan.
  • Cara melihat perilaku DPA dengan Aturan dengan menjalankan koneksi keluar ke beberapa tujuan.

Langkah Berikutnya

©Google, Inc. atau afiliasinya. Semua hak dilindungi undang-undang. Jangan disebarluaskan.