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

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

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

ל-Cloud NAT יש עיצוב ללא שרת proxy, והוא מטמיע NAT ישירות בשכבת Andromeda SDN. לכן, אין השפעה על הביצועים של עומס העבודה, והוא ניתן להרחבה בקלות למכונות וירטואליות, לאזורים ולרשתות 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.
  • איך מוחקים כללי NAT וחוזרים להתנהגות ברירת המחדל של Cloud NAT.

הדרישות

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

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

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

Google Cloud Console

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

75eef5f6fd6d7e41.png

הגדרת סביבה בקצב אישי

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

מפעילים את Cloud Shell

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

‫3. הגדרת מעבדה

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

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

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. הגדרה של 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 של מחבר השירות).

כדי להקצות במהירות את המכונות עם כל התוכנות הנדרשות, נשתמש בתכונה פריסת קונטיינרים ב-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 ואת תת-הרשת, מוסיפים כלל פשוט של חומת אש לתעבורת נתונים נכנסת כדי לאפשר ל-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 ב-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 של המופע בינתיים, ונחזור ל-SSH אחרי שנסיים להגדיר את כללי ה-NAT.

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

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

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

פעולת 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 של המופע, ונחזור אליו כדי לבדוק את ניקוי הכתובות.

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 למצב drained (ריקון). מוסיפים את 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 עברה למצב drained (ריקון). כדי לוודא שחיבורים חדשים מ-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, נשתמש בפקודה describe של שער 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

שימו לב שאין קטע rules:‎ ב-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. מעולה!

השלמת את שיעור ה-Lab בנושא כללי Cloud NAT.

מה כיסיתם

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

השלבים הבאים

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

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