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

۱. مرور کلی

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

Cloud NAT دارای طراحی بدون پروکسی است و NAT را مستقیماً در لایه Andromeda SDN پیاده‌سازی می‌کند. به این ترتیب، هیچ تأثیر عملکردی بر حجم کار شما ندارد و به راحتی با بسیاری از ماشین‌های مجازی، مناطق و 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 را بررسی کنید.

آنچه یاد خواهید گرفت

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

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

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

۲. استفاده از کنسول ابری گوگل و کلود شل

برای تعامل با GCP، در طول این آزمایش از هر دو کنسول ابری گوگل و پوسته ابری استفاده خواهیم کرد.

کنسول ابری گوگل

کنسول ابری از طریق آدرس https://console.cloud.google.com قابل دسترسی است.

75eef5f6fd6d7e41.png

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز شماست. این ماشین یک دایرکتوری خانگی دائمی ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه را می‌توان به سادگی با یک مرورگر انجام داد.

۳. چیدمان آزمایشگاه

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

مروری بر معماری شبکه:

815147de3de0bd19.png

۴. رزرو آدرس‌های IP خارجی

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

از کلود شل:

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>

۵. تنظیمات 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 بتوانند به نمونه‌های تولیدکننده روی پورت ۸۰۸۰ دسترسی پیدا کنند.

برای قانون اول، از 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 echo را در یک کانتینر داکر موجود در Docker Hub اجرا می‌کنند (کد منبع در مخزن GitHub نویسنده سرویس موجود است).

برای آماده‌سازی سریع نمونه‌ها با تمام نرم‌افزارهای مورد نیاز، از ویژگی استقرار کانتینر روی موتور محاسباتی (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

۶. راه‌اندازی VPC مصرف‌کننده، Cloud NAT و Instance

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

پس از ایجاد 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 اجازه دهد تا به نمونه‌های مصرف‌کننده در پورت ۲۲ دسترسی پیدا کنند.

برای اولین قانون فایروال، دستور زیر را از 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

۷. رفتار پیش‌فرض 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"`

سپس سعی کنید به هر دو نمونه تولیدکننده curl کنید و آدرس 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" است.

به طور مشابه، یک curl برای هر سرویس بازتابنده 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 متصل خواهیم شد.

۸. ایجاد قوانین NAT ابری

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

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

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

از کلود شل:

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 gateway موجود خود را با استفاده از این فایل قانون به‌روزرسانی کنیم. از 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 را اضافه می‌کنیم تا جزئیات کامل قانون را ببینیم.

از کلود شل:

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

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

در این مرحله، نمونه مصرف‌کننده باید از Cloud NAT Rule ایجاد شده برای استفاده از 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"`

سپس سعی کنید به هر دو نمونه تولیدکننده curl کنید و آدرس 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" باشد.

یک curl به هر سرویس بازتابنده 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 متصل خواهیم شد.

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

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

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

از کلود شل:

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 gateway موجود خود را با استفاده از این فایل قانون به‌روزرسانی کنیم. از 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 از دروازه Cloud NAT خود و بازگشت به رفتار پیش‌فرض، می‌توانید از دستور 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، بخش "rules:" وجود ندارد که نشان می‌دهد هیچ قانون NAT پیکربندی نشده است.

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

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

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

از کلود شل:

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

۱۲. تبریک می‌گویم!

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

آنچه را که پوشش دادید

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

مراحل بعدی

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

©شرکت گوگل یا شرکت‌های وابسته به آن. تمامی حقوق محفوظ است. توزیع نکنید.