استفاده از قوانین Cloud NAT NAT

1. بررسی اجمالی

Cloud NAT یک ابزار قدرتمند است: با استفاده از آن، Compute Engine و Google Kubernetes Engine (GKE) می‌توانند به منابع اینترنتی به روشی مقیاس‌پذیر و امن دسترسی داشته باشند، بدون اینکه بارهای کاری در حال اجرا بر روی آنها را در معرض دسترسی خارجی با استفاده از IPهای خارجی قرار دهند.

Cloud NAT دارای طراحی بدون پروکسی است که NAT را مستقیماً در لایه Andromeda SDN پیاده سازی می کند. به این ترتیب، هیچ تأثیری بر عملکرد شما بر حجم کاری شما نمی‌گذارد و بدون دردسر به بسیاری از VMها، مناطق و VPCها تقسیم می‌شود.

قوانین NAT یک فرمت برای Cloud NAT هستند. ویژگی NAT Rules در Cloud NAT به شما امکان می دهد قوانین دسترسی ایجاد کنید که نحوه استفاده از Cloud NAT برای اتصال به اینترنت را مشخص می کند. در حال حاضر قوانین NAT از انتخاب آدرس منبع NAT بر اساس آدرس مقصد پشتیبانی می کنند.

بدون قوانین NAT، ماشین مجازی با Cloud NAT فعال از همان مجموعه آدرس‌های IP NAT برای دسترسی به تمام آدرس‌های اینترنتی استفاده می‌کند.

گاهی اوقات، یک مورد استفاده NAT از Cloud NAT می‌خواهد تا از آدرس‌های IP منبع مختلف برای مقصدهای خاص استفاده کند. یک قانون NAT یک تطابق و یک عمل مربوطه را تعریف می کند. هنگامی که قوانین NAT را مشخص کردید، بسته با هر قانون NAT مطابقت داده می شود. اگر یک قانون مطابقت داشته باشد، عمل مربوط به آن مطابقت انجام می شود.

برای اطلاعات بیشتر لطفاً بخش مستندات در مورد قوانین NAT را بررسی کنید.

چیزی که یاد خواهید گرفت

  • نحوه راه اندازی یک دروازه NAT ابری برای آماده سازی قوانین NAT.
  • نحوه طراحی قوانین NAT با استفاده از زبان Common Expression (CEL).
  • نحوه ایجاد قوانین NAT و پیوست کردن آنها به دروازه NAT.
  • چگونه قوانین NAT را از یک نمونه آزمایش کنیم.
  • چگونه قوانین یک NAT Gateway را به روز کنیم.
  • چگونه قوانین NAT را حذف کنیم و به رفتار پیش‌فرض Cloud NAT برگردیم.

آنچه شما نیاز دارید

  • دانش اولیه موتور محاسباتی گوگل
  • دانش پایه شبکه و TCP/IP
  • دانش اولیه خط فرمان یونیکس/لینوکس
  • انجام یک تور شبکه در GCP مانند آزمایشگاه شبکه در Google Cloud مفید است.
  • آشنایی با اصول Cloud NAT

2. استفاده از Google Cloud Console و Cloud Shell

برای تعامل با GCP، از Google Cloud Console و Cloud Shell در سراسر این آزمایشگاه استفاده خواهیم کرد.

Google Cloud Console

در https://console.cloud.google.com می‌توانید به کنسول Cloud دسترسی پیدا کنید.

75eef5f6fd6d7e41.png

تنظیم محیط خود به خود

  1. به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • نام پروژه شناسه شخصی شما برای این پروژه است. تا زمانی که از قراردادهای نامگذاری آن پیروی کنید، می توانید از هر چیزی که می خواهید استفاده کنید و می توانید آن را در هر زمان به روز کنید.
  • شناسه پروژه باید در تمام پروژه‌های Google Cloud منحصربه‌فرد باشد و تغییرناپذیر باشد (پس از تنظیم نمی‌توان آن را تغییر داد). کنسول Cloud به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (و معمولاً به عنوان PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک نمونه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه پروژه را امتحان کنید و ببینید در دسترس است. سپس پس از ایجاد پروژه "یخ زده" می شود.
  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در Cloud Console فعال کنید .

اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعمل‌های موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه می‌کند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورت‌حساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

bce75f34b2c53987.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

f6ef2b5f13479f3a.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این آزمایشگاه به سادگی با یک مرورگر قابل انجام است.

3. راه اندازی آزمایشگاه

برای این آزمایشگاه، شما از یک پروژه استفاده خواهید کرد و دو VPC با یک زیر شبکه در هر کدام ایجاد خواهید کرد. شما آدرس های IP خارجی را رزرو می کنید و سپس یک دروازه NAT Cloud (با یک Cloud Router)، دو نمونه تولید کننده و همچنین یک نمونه مصرف کننده ایجاد و پیکربندی می کنید. پس از تأیید رفتار پیش‌فرض Cloud NAT، قوانین سفارشی Cloud NAT را ایجاد کرده و رفتار آنها را تأیید می‌کنید.

نمای کلی معماری شبکه:

815147de3de0bd19.png

4. آدرس های IP خارجی را رزرو کنید

بیایید تمام آدرس های IP خارجی را برای استفاده در این آزمایشگاه رزرو کنیم. این به شما کمک می کند تا همه قوانین NAT و فایروال مرتبط را در VPC مصرف کننده و تولید کننده بنویسید.

از Cloud Shell:

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

خروجی:

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/nat-address-3].
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].

آدرس های IP را که به عنوان متغیرهای محیطی رزرو شده اند پر کنید.

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 natip3=`gcloud compute addresses list --filter name:nat-address-3 --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)"`

هیچ خروجی انتظار نمی رود، اما برای تأیید اینکه آدرس ها به درستی پر شده اند. بیایید مقادیر همه متغیرهای محیط را خروجی بگیریم.

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

خروجی:

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

5. VPC تولید کننده و راه اندازی نمونه ها.

اکنون منابع را برای منابع تولیدکننده ایجاد خواهیم کرد. نمونه‌هایی که در VPC تولیدکننده اجرا می‌شوند، سرویس اینترنت رو با استفاده از دو IP عمومی "producer-address-1" و "producer-address-2" ارائه می‌کنند.

ابتدا اجازه دهید VPC را ایجاد کنیم. از Cloud Shell:

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

خروجی:

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

بعد، بیایید زیر شبکه را در us-east4 ایجاد کنیم. از Cloud Shell:

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

خروجی:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/producer-e4].
NAME              REGION       NETWORK       RANGE
producer-e4       us-east4  producer-vpc  10.0.0.0/24

در مرحله بعد، بیایید قوانین فایروال VPC را ایجاد کنیم تا آدرس های IP NAT به نمونه های تولید کننده در پورت 8080 برسند.

برای قانون اول، از Cloud Shell:

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

خروجی:

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/producer-allow-8080].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
producer-allow-8080  producer-vpc  INGRESS    1000      tcp:8080        False

مرحله بعدی ایجاد دو نمونه تولید کننده است.

نمونه‌های تولیدکننده یک سرویس اکو IP را در یک محفظه docker موجود در Docker Hub اجرا می‌کنند (کد منبع در مخزن GitHub نویسنده سرویس موجود است.

برای تهیه سریع نمونه‌ها با همه نرم‌افزارهای مورد نیاز، از ویژگی Container Deployment on Compute Engine استفاده می‌کنیم.

برای اینکه بتوانیم قوانین NAT بنویسیم، هر نمونه را با یک آدرس IP رزرو شده متفاوت ارائه می کنیم.

اولین نمونه را ایجاد کنید. از Cloud Shell:

gcloud compute instances create-with-container producer-instance-1 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

خروجی:

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 IP 1>  RUNNING

سپس نمونه دوم را ایجاد کنید. از Cloud Shell:

gcloud compute instances create-with-container producer-instance-2 \
 --zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

خروجی:

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 IP 2>  RUNNING

6. Consumer VPC، Cloud NAT و Instance را راه اندازی کنید

اکنون که سرویس تولید کننده را ایجاد کرده اید، اکنون زمان ایجاد VPC مصرف کننده و دروازه NAT Cloud آن است.

پس از ایجاد VPC و زیرشبکه، یک قانون فایروال ورودی ساده اضافه می کنیم تا به IAP برای محدوده IP منبع TCP اجازه دهیم. این به ما امکان می دهد مستقیماً با استفاده از gcloud به نمونه های مصرف کننده SSH کنیم.

سپس یک دروازه ساده Cloud NAT در حالت تخصیص دستی و آدرس رزرو شده "nat-address-1" مرتبط با آن ایجاد می کنیم. در بخش‌های بعدی Codelab، پیکربندی دروازه را برای اضافه کردن قوانین سفارشی به‌روزرسانی می‌کنیم. .

ابتدا اجازه دهید VPC را ایجاد کنیم. از Cloud Shell:

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

خروجی:

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 producer-vpc --allow tcp:22,tcp:3389,icmp

بعد، بیایید یک زیر شبکه در us-east4 ایجاد کنیم. از Cloud Shell:

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

خروجی:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/consumer-e4].
NAME              REGION       NETWORK       RANGE
consumer-e4       us-east4  consumer-vpc  10.0.0.0/24

در مرحله بعد، بیایید یک قوانین فایروال VPC ایجاد کنیم تا به آدرس های محدوده IAP اجازه دسترسی به نمونه های مصرف کننده در پورت 22 را بدهد.

برای اولین قانون فایروال، موارد زیر را از Cloud Shell اجرا کنید:

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

خروجی:

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، ابتدا باید یک نمونه Cloud Router ایجاد کنیم (از یک شماره ASN خصوصی استفاده می کنیم اما برای فعالیت های این آزمایشگاه بی ربط است). از Cloud Shell:

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

خروجی:

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

سپس نمونه دروازه NAT را ایجاد کنید. از 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

خروجی:

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

نمونه آزمایش مصرف کننده را ایجاد کنید. ما IPهای تولیدکننده رزرو شده را در اینجا پر می کنیم تا بتوانیم بعداً در نمونه به آنها مراجعه کنیم. از Cloud Shell:

gcloud compute instances create consumer-instance --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=consumer-e4,no-address \
--metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2

خروجی:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/consumer-instance].
NAME               ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance  us-east4-a  e2-medium                  10.0.0.2                  RUNNING

7. بررسی رفتار پیش فرض Cloud NAT

در این مرحله، نمونه مصرف‌کننده از رفتار پیش‌فرض Cloud NAT استفاده می‌کند که از همان IP رزرو شده "nat-address-1" برای برقراری ارتباط با تمام آدرس‌های خارجی استفاده می‌کند.

اجازه دهید قبل از استفاده از ویژگی جدید NAT Rules در Cloud NAT ابتدا این رفتار را تأیید کنیم.

SSH به نمونه مصرف کننده. از Cloud Shell:

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

اکنون باید در پوسته نمونه باشید.

خروجی نمونه (خروجی کامل برای اختصار کوتاه شده است)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

از داخل نمونه مصرف کننده، اجازه دهید ابتدا هر دو IP تولید کننده را واکشی کنیم و آنها را به عنوان متغیرهای محیطی پر کنیم.

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

سپس سعی کنید به هر دو نمونه تولیدکننده بپیچید و آدرس IP منبع برگشتی را مشاهده کنید.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.136.8.83

شما باید آدرس IP یکسانی را برای هر دو نقطه پایانی مشاهده کنید که برابر با مقدار IP رزرو شده خارجی "nat-address-1" است.

به طور مشابه، یک حلقه به هر سرویس بازتاب دهنده IP خارجی باید همان IP را نشان دهد، به عنوان مثال:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

فعلاً از جلسه SSH نمونه خارج شوید، پس از اینکه قوانین NAT را پیکربندی کردیم، SSH را برمی‌گردانیم.

8. قوانین Cloud NAT ایجاد کنید

قوانین NAT با استفاده از دستور زبان Common Expression نوشته می شوند. برای اطلاعات بیشتر در مورد زبان بیان قوانین، زبان بیان قوانین را ببینید.

همچنین می‌توانید با استفاده از دستورات gcloud، یک قانون NAT به دروازه NAT موجود اضافه کنید. ما هر دو گزینه را برای ایجاد قوانین Cloud NAT بررسی خواهیم کرد.

ابتدا اجازه دهید یک فایل YAML قانون NAT ایجاد کنیم.

از Cloud Shell:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
EOF

سپس بیایید دروازه NAT موجود خود را با استفاده از این فایل قانون به روز کنیم. از Cloud Shell:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

باید انتظار خروجی زیر را داشته باشید:

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

تأیید کنید که قانون با موفقیت پیکربندی شده است. از Cloud Shell:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4

باید انتظار خروجی زیر را داشته باشید:

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

بیایید سعی کنیم همان قانون را فقط با استفاده از دستورات gcloud دوباره ایجاد کنیم. ابتدا قانون موجود را حذف کنید. از Cloud Shell:

gcloud alpha compute routers nats rules delete 100 \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --quiet

باید انتظار خروجی زیر را داشته باشید:

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

سپس با استفاده از این دستور gcloud دوباره قانون را ایجاد کنید. از Cloud Shell:

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

باید انتظار خروجی زیر را داشته باشید:

Creating Rule [100] in NAT [consumer-nat-gw]...done.

دوباره برای تأیید اینکه قانون با موفقیت ایجاد شده است، دستور قبلی را تکرار کنید. این بار سوئیچ قالب بندی YAML را اضافه می کنیم تا جزئیات کامل قانون را مشاهده کنیم.

از Cloud Shell:

gcloud alpha compute routers nats rules list\
 --nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4  --format=yaml

باید انتظار خروجی زیر را داشته باشید:

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2
match: destination.ip == <actual IP for producer-IP 2>
ruleNumber: 100

در نهایت، توجه داشته باشید که اکنون هر دو آدرس خارجی "nat-address1" و "nat-address-2" به عنوان "IN_USE" نشان داده می شوند. برای مشاهده آن، این دستور را از Cloud Shell اجرا کنید:

$ gcloud compute addresses list

باید انتظار خروجی زیر را داشته باشید (آدرس های IP واقعی باید با آدرس هایی که رزرو کرده اید مطابقت داشته باشد):

NAME                ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION       SUBNET  STATUS
nat-address-1       34.136.8.83     EXTERNAL                    us-east4          IN_USE
nat-address-2       34.70.137.35    EXTERNAL                    us-east4          IN_USE
nat-address-3       34.135.103.88   EXTERNAL                    us-east4          RESERVED
producer-address-1  34.66.0.105     EXTERNAL                    us-east4          IN_USE
producer-address-2  35.192.142.134  EXTERNAL                    us-east4          IN_USE

9. بررسی رفتار قوانین Cloud NAT

در این مرحله، نمونه مصرف کننده باید از قانون Cloud NAT ایجاد شده برای استفاده از nat-address-2 برای برقراری ارتباط با producer-address-2 استفاده کند.

بیایید این رفتار را تأیید کنیم. SSH به نمونه مصرف کننده. از Cloud Shell:

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

اکنون باید در پوسته نمونه باشید.

خروجی نمونه (خروجی کامل برای اختصار کوتاه شده است)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

از داخل نمونه مصرف کننده، اجازه دهید ابتدا هر دو IP تولید کننده را واکشی کنیم و آنها را به عنوان متغیرهای محیطی پر کنیم.

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

سپس سعی کنید به هر دو نمونه تولیدکننده بپیچید و آدرس IP منبع برگشتی را مشاهده کنید.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.70.137.35

اکنون باید ببینید که یک آدرس IP متفاوت برای هر دو نقطه پایانی بازگردانده شده است، اولین آدرس IP باید همان رفتار پیش فرض باشد. آدرس IP دوم باید پس از اضافه شدن قانون جدید NAT برابر با "nat-address-2" باشد.

یک حلقه به هر سرویس بازتاب دهنده IP خارجی باید همچنان همان IP را به عنوان رفتار پیش فرض نشان دهد، به عنوان مثال:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

فعلاً از جلسه SSH نمونه خارج شوید، ما SSH را برای آزمایش تخلیه آدرس بازمی‌گردانیم.

10. به روز رسانی و حذف قوانین Cloud NAT

می توانید قوانین Cloud NAT موجود را به روز کنید. برای مثال، می‌توانید آدرس‌های IP جدید را مرتبط کنید و آدرس‌های IP موجود مرتبط با قوانین موجود را تخلیه کنید.

بیایید فایل NAT Rules را به صورت زیر به روز کنیم

از Cloud Shell:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatDrainIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-3
EOF

کاری که این فایل جدید انجام می دهد این است که اکنون "nat-address-2" را در حالت تخلیه قرار می دهد. و "nat-address-3" را در حالت فعال اضافه کنید. این باید به اتصالات موجود با استفاده از nat-address-2 اجازه دهد تا به خوبی خاتمه یابد، در حالی که اتصالات جدید فقط با استفاده از nat-address-3 ایجاد شود.

سپس بیایید دروازه NAT موجود خود را با استفاده از این فایل قانون به روز کنیم. از Cloud Shell:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

باید انتظار خروجی زیر را داشته باشید:

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

تأیید کنید که قانون با موفقیت پیکربندی شده است. از Cloud Shell:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --format=yaml

باید انتظار خروجی زیر را داشته باشید:

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3
  sourceNatDrainIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2
match: destination.ip == '35.192.142.134'
ruleNumber: 100

توجه کنید که چگونه "nat-address-2" اکنون در حالت تخلیه قرار گرفته است. ما آن را به عنوان تمرینی برای تأیید اعتبار اینکه اتصالات جدید از VPC مصرف کننده اکنون از IP های صحیح NAT استفاده می کنند، به شما واگذار می کنیم.

در نهایت، قوانین NAT را از دروازه NAT Cloud خود حذف کنید و به رفتار پیش فرض برگردید. می توانید از دستور gcloud زیر استفاده کنید. از Cloud Shell:

gcloud alpha compute routers nats rules delete 100 \
 --nat=consumer-nat-gw --router=consumer-cr \
 --router-region=us-east4 --quiet

باید انتظار خروجی زیر را داشته باشید:

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

برای بررسی اینکه هیچ قانون NAT دیگری وجود ندارد، اجازه دهید از دستور NAT gateway describe استفاده کنیم

gcloud alpha compute routers nats describe consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

باید انتظار خروجی زیر را داشته باشید:

enableEndpointIndependentMapping: false
name: consumer-nat-gw
natIpAllocateOption: MANUAL_ONLY
natIps:
- https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1
sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES

توجه کنید که چگونه یک بخش "قوانین:" در خروجی YAML وجود ندارد. نشان می دهد که هیچ قانون NAT پیکربندی نشده است.

11. مراحل پاکسازی

برای جلوگیری از شارژ مجدد، باید تمام منابع مرتبط با این کد لبه را حذف کنید.

ابتدا تمام نمونه ها را حذف کنید.

از Cloud Shell:

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

خروجی مورد انتظار:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance].
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].

بعد، Cloud Router را حذف کنید. از Cloud Shell:

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

باید انتظار خروجی زیر را داشته باشید:

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

تمام آدرس های IP خارجی را آزاد کنید. از Cloud Shell:

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

باید انتظار خروجی زیر را داشته باشید:

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 را حذف کنید. از Cloud Shell:

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

باید انتظار خروجی زیر را داشته باشید:

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

حذف زیرشبکه ها از Cloud Shell:

gcloud compute networks subnets delete consumer-e4 \
producer-e4 --region=us-east4 --quiet

باید انتظار خروجی زیر را داشته باشید:

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

در نهایت اجازه دهید VPC ها را حذف کنیم. از Cloud Shell:

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

باید انتظار خروجی زیر را داشته باشید:

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

12. تبریک می گویم!

شما آزمایشگاه قوانین Cloud NAT را تکمیل کرده اید!

آنچه شما پوشش داده اید

  • نحوه راه اندازی یک دروازه NAT Cloud در آماده سازی برای قوانین NAT.
  • نحوه طراحی قوانین NAT با استفاده از زبان Common Expression (CEL).
  • نحوه ایجاد قوانین NAT و پیوست کردن آنها به دروازه NAT.
  • چگونه قوانین NAT را از یک نمونه آزمایش کنیم.
  • چگونه قوانین یک NAT Gateway را به روز کنیم.
  • چگونه قوانین NAT را حذف کنیم و به رفتار پیش‌فرض Cloud NAT برگردیم.

مراحل بعدی

  • با ایجاد قوانین پیچیده NAT مانند این مثال، آزمایش کنید
  • تخلیه آدرس IP NAT را کاوش کنید و تأثیر اتصال را مشاهده کنید.
  • درباره شبکه در Google Cloud Platform بیشتر بیاموزید

©Google، Inc. یا شرکت های وابسته به آن. تمامی حقوق محفوظ است. توزیع نکنید.