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.
Penyiapan lingkungan mandiri
- 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.
- 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.
- 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:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
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:
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
- Jelajahi halaman dokumentasi Alokasi Port Dinamis kami
- Bereksperimenlah dengan mengubah waktu tunggu NAT, dan nilai alokasi port dengan aplikasi Anda.
- Pelajari lebih lanjut Jaringan di Google Cloud Platform
©Google, Inc. atau afiliasinya. Semua hak dilindungi undang-undang. Jangan disebarluaskan.