שימוש בכללי Cloud NAT

1. סקירה כללית

Cloud NAT הוא כלי עוצמתי: איתו, עומסי העבודה של Compute Engine ו-Google Kubernetes Engine (GKE) יכולים לגשת למשאבי אינטרנט באופן ניתן להתאמה ומאובטחת, בלי לחשוף את עומסי העבודה שרצים עליהם לגישה חיצונית באמצעות כתובות IP חיצוניות.

Cloud NAT כולל עיצוב ללא שרת proxy, שמטמיע את NAT ישירות בשכבת SDN של Andromeda. לכן אין השפעה על הביצועים של עומס העבודה, והוא מותאם בקלות למכונות וירטואליות, לאזורים ולרשתות VPC רבות.

כללי NAT הם הרחבה ל-Cloud NAT. התכונה 'כללי NAT' ב-Cloud NAT מאפשרת ליצור כללי גישה שמגדירים את אופן השימוש ב-Cloud NAT כדי להתחבר לאינטרנט. נכון לעכשיו, כללי NAT תומכים בבחירה של כתובת NAT על סמך כתובת היעד.

בלי כללי NAT, מכונה וירטואלית שמופעלת בה Cloud NAT משתמשת באותה קבוצה של כתובות IP של NAT כדי להגיע לכל כתובות האינטרנט.

לפעמים, תרחיש לדוגמה של NAT קורא ל-Cloud NAT להשתמש בכתובות IP של מקורות שונים ליעדים ספציפיים. כלל NAT מגדיר התאמה ופעולה תואמת. אחרי שמגדירים כללי NAT, החבילה מותאמת לכל כלל NAT. אם כלל מתקיימת התאמה, אז הפעולה שתואמת לכלל הזה מתקיימת.

למידע נוסף עיינו בקטע תיעוד בנושא כללי NAT .

מה תלמדו

  • איך להגדיר שער Cloud NAT כהכנה לכללי NAT.
  • איך לעצב כללי NAT באמצעות Common Expression Language (CEL).
  • איך ליצור כללי NAT ולצרף אותם לשער NAT.
  • איך בודקים כללי NAT במכונה.
  • איך לעדכן את הכללים של NAT Gateway.
  • איך למחוק כללי NAT ולחזור להתנהגות ברירת המחדל של Cloud NAT.

למה תזדקק?

  • ידע בסיסי ב-Google Compute Engine
  • ידע בסיסי בנושא רישות ו-TCP/IP
  • ידע בסיסי בשורת הפקודה Unix/Linux
  • מומלץ להשלים סיור ברשתות ב-GCP, כמו שיעור ה-Lab Networking in Google Cloud.
  • הבנה של העקרונות הבסיסיים של Cloud NAT.

2. שימוש במסוף Google Cloud וב-Cloud Shell

כדי לקיים אינטראקציה עם GCP, נשתמש גם ב-Google Cloud Console וגם ב-Cloud Shell בשיעור ה-Lab הזה.

מסוף Google Cloud

אפשר להגיע אל Cloud Console בכתובת https://console.cloud.google.com.

75eef5f6fd6d7e41.png

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Project Name (שם הפרויקט) הוא המזהה האישי שלכם לפרויקט הזה. כל עוד אתם פועלים בהתאם למוסכמות של מתן השמות, תוכלו להשתמש בכל מה שתרצו ולעדכן אותו בכל שלב.
  • Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-PROJECT_ID), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור פרויקט אקראי אחר או לנסות בעצמכם ולבדוק אם הוא זמין. ואז המכשיר 'קפוא' לאחר יצירת הפרויקט.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.

מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הפעלת Cloud Shell

אומנם אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה משתמשים ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

ממסוף GCP, לוחצים על הסמל של Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:

bce75f34b2c53987.png

נדרשים רק כמה דקות כדי להקצות את הסביבה ולהתחבר אליה. בסיום התהליך, אתם אמורים לראות משהו כזה:

f6ef2b5f13479f3a.png

למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כל העבודה בשיעור ה-Lab הזה יכולה להתבצע באמצעות דפדפן בלבד.

3. הגדרה של שיעור Lab

בשיעור ה-Lab הזה תשתמשו בפרויקט ותיצרו שתי רשתות VPC שבכל אחת מהן יש רשת משנה. צריך לשמור כתובות IP חיצוניות, ואז ליצור ולהגדיר שער של Cloud NAT (עם Cloud Router), שתי מכונות של יצרן וגם מכונה של לקוח. לאחר אימות התנהגות ברירת המחדל של Cloud NAT, תיצרו כללים מותאמים אישית של Cloud NAT ותאמתו את ההתנהגות שלהם.

סקירה כללית של ארכיטקטורת Networking:

815147de3de0bd19.png

4. שמירת כתובות IP חיצוניות

נשמור את כל כתובות ה-IP החיצוניות לשימוש בשיעור ה-Lab הזה. הפעולה הזו תעזור לכם לכתוב את כל כללי ה-NAT וחומת האש הרלוונטיים, גם ב-VPC וגם ב-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. Producer 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 (קוד המקור זמין במאגר GitHub של מחבר השירות.

כדי להקצות במהירות את המכונות עם כל התוכנות הנדרשות, נשתמש בתכונה Container Deploy ב-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. הגדרת VPC של הצרכן, Cloud NAT ומכונה

עכשיו, אחרי שיצרתם את שירות היצרן, זה הזמן ליצור את ה-VPC לצרכנים ואת שער Cloud NAT.

אחרי שניצור את ה-VPC ואת רשת המשנה, נוסיף כלל פשוט של חומת אש לתעבורת נתונים נכנסת (ingress) כדי לאפשר את ה-IAP עבור טווחי IP של מקורות TCP. כך נוכל לבצע SSH למכונות לצרכנים ישירות באמצעות gcloud.

לאחר מכן ניצור שער 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 פרטי אבל הוא לא רלוונטי לפעילויות של שיעור ה-Lab הזה). מ-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' ב-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'.

באופן דומה, כתובת URL של 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 אחרי שנגדיר כללי NAT.

8. יצירת כללי Cloud NAT

כללי NAT נכתבים בתחביר Common Expression Language. מידע נוסף על השפה של ביטוי הכללים זמין במאמר השפה של ביטוי הכללים.

אפשר גם להוסיף כלל NAT לשער NAT קיים באמצעות פקודות gcloud. נבחן את שתי האפשרויות ליצירת כללי 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"`

לאחר מכן מנסים לבצע 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-address-2" אחרי ההוספה של כלל NAT החדש.

כתובת URL של 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 כדי לבדוק את התרוקנות הכתובות.

10. עדכון & מחיקת כללי Cloud NAT

אפשר לעדכן כללי Cloud NAT קיימים. לדוגמה, תוכלו לשייך כתובות IP חדשות ולרוקן את כתובות ה-IP הקיימות שמשויכות לכללים קיימים.

נעדכן את קובץ כללי NAT באופן הבא

מ-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 משער 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

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. שלבים לניקוי

כדי להימנע מחיובים חוזרים, כדאי למחוק את כל המשאבים שמשויכים ל-Codelab הזה.

קודם צריך למחוק את כל המופעים.

מ-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 Rules Lab!

מה נכלל?

  • איך להגדיר שער Cloud NAT כהכנה לכללי NAT.
  • איך לעצב כללי NAT באמצעות Common Expression Language (CEL).
  • איך ליצור כללי NAT ולצרף אותם לשער NAT.
  • איך בודקים כללי NAT במכונה.
  • איך לעדכן את הכללים של NAT Gateway.
  • איך למחוק כללי NAT ולחזור להתנהגות ברירת המחדל של Cloud NAT.

השלבים הבאים

  • נסו ליצור כללי NAT מורכבים יותר, כמו הדוגמה הזו
  • בדיקה של התרוקנות כתובות ה-IP של NAT ובדיקת ההשפעה של החיבור.
  • מידע נוסף על Networking ב-Google Cloud Platform

©Google, Inc. או השותפים העצמאיים שלה. כל הזכויות שמורות. אסור להפיץ.