Codelab למסלולים מבוססי מדיניות (PBR)

1. מבוא

מסלולים שמבוססים על מדיניות

מסלולים שמבוססים על מדיניות מאפשרים לכם לבחור את הצעד הבא על סמך יותר מכתובת ה-IP של היעד של החבילה. תוכלו להתאים את התנועה גם לפי פרוטוקול וכתובת IP של המקור. תעבורת נתונים תואמת מופנית אוטומטית למאזן עומסים פנימי ברשת. הדבר יכול לעזור לך להוסיף מכשירים כמו חומות אש לנתיב של תעבורת נתונים ברשת.

כשיוצרים מסלול מבוסס-מדיניות, אפשר לבחור באילו משאבים המערכת תעבד את תעבורת הנתונים של המסלול. המסלול יכול לחול על:

  • כל הרשת: כל המכונות הווירטואליות (VM), שערי ה-VPN והחיבורים בין מחשבים
  • שימוש בתגי רשת: בחירת מכונות VM ב-VPC
  • אזור חיבור: כלל התנועה שנכנסת לרשת ה-VPC דרך קובצי VLAN מצורפים לאזור

השלב הבא במסלול מבוסס-מדיניות צריך להיות מאזן עומסים פנימי של הרשת הפנימית – שנמצא באותה רשת VPC כמו המסלול מבוסס המדיניות.

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

למסלולים שמבוססים על מדיניות יש עדיפות גבוהה יותר מסוגי נתיבים אחרים, מלבד נתיבי החזרה מיוחדים.

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

אפשר ליצור כלל יחיד לתנועה חד-כיוונית או מספר כללים כדי לטפל בתנועה דו-כיוונית.

כדי להשתמש במסלולים מבוססי-מדיניות עם Cloud Interconnect, צריך להחיל את המסלול על כל החיבורים ל-Cloud Interconnect באזור שלם. לא ניתן להחיל נתיבים מבוססי מדיניות על חיבור יחיד של Cloud Interconnect בלבד.

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

שיקולים עם PBR

יש צורך בהגדרות מיוחדות כדי להשתמש במסלולים שמבוססים על מדיניות בדרכים הבאות.

לדוגמה, שימוש ב-PBR עם GKE, PSC או PGA/PSA.

פרטים נוספים על PBR עם GKE זמינים כאן וקטע על המגבלות הכלליות על PBR כאן.

מה תלמדו

  • איך להגדיר מסלולים שמבוססים על מדיניות

למה תזדקק?

  • ידע בפריסת מכונות ובהגדרת רכיבי רשת
  • ידע בהגדרת חומת אש של VPC

2. סביבת בדיקה

ה-Codelab הזה ישתמש ברשת VPC יחידה. בסביבה הזו יהיו שני משאבי מחשוב, clienta ו-clientb, שישלחו חבילות למשאב שרת אחר. באמצעות PBR ומסננים אפשר לאלץ תנועה מ-Clienta דרך משאב מחשוב אחר לצורך אכיפה של חומת האש, בזמן שתעבורת הנתונים מסוג clientb מגיעה ישירות לשרת. התרשים הבא מדגים את הנתיב.

bff32b01ada8e9ad.png

מבחינה טכנית בתרשים שלמעלה, צריך להיות ILB (מאזן עומסים פנימי של הרשת) לנתיבי PBR. המדד הזה הושמט בגלל הפשטות של הדיאגרמה.

3. לפני שמתחילים

ב-Codelab צריך להשתמש בפרויקט אחד.

מ-cloudshell:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

4. הפעלת ממשקי API

אם עדיין לא עשית זאת, יש לאפשר לממשקי ה-API להשתמש במוצרים

מ-cloudshell:

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com

5. יצירת רשת VPC ורשת משנה

רשת VPC

יצירת Codelab-pbr-vpc VPC:

מ-cloudshell:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

רשת משנה

יוצרים את רשתות המשנה המתאימות באזור שנבחר:

מ-cloudshell:

gcloud compute networks subnets create $prefix-vpc-subnet \
   --range=10.10.10.0/24 --network=$prefix-vpc --region=${region}

6. יצירת כללי חומת אש

כדי לאפשר ל-IAP להתחבר למכונות הווירטואליות, יוצרים כלל של חומת אש:

  • המדיניות חלה על כל מכונות וירטואליות שרוצים לגשת אליהן באמצעות IAP.
  • תעבורת נתונים נכנסת (ingress) מטווח ה-IP 35.235.240.0/20. הטווח הזה מכיל את כל כתובות ה-IP שמשמשות להעברת TCP באמצעות IAP.

מ-cloudshell:

gcloud compute firewall-rules create $prefix-allow-iap-proxy \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20

כדי לאפשר לשרת את יציאת ה-HTTP הרגילה (TCP 80) ופרוטוקול ICMP:

  • חלה על משאבים עם תג הרשת 'server'
  • תעבורת נתונים נכנסת (ingress) מכל המקורות

מ-cloudshell:

gcloud compute firewall-rules create $prefix-allow-http-icmp \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80,icmp \
--source-ranges=0.0.0.0/0 \
--target-tags=server

כדי לאפשר ל-FW לקבל חבילות, צריך לאפשר תעבורת נתונים נכנסת (ingress) בכל הפרוטוקולים והיציאות.

  • חלה על משאבים עם תג הרשת 'fw'
  • תעבורת נתונים נכנסת (ingress) ממקורות 10.10.10.0/24

מ-cloudshell:

gcloud compute firewall-rules create $prefix-fw-allow-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=all \
--source-ranges=10.10.10.0/24 \
--target-tags=fw

כדי לאשר את בדיקות התקינות

  • חלה על משאבים עם תג הרשת 'fw'
  • תעבורת נתונים נכנסת (ingress) מטווחים של בדיקות תקינות

מ-cloudshell:

gcloud compute firewall-rules create $prefix-allow-hc-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=fw

7. יצירת Cloud Router & Cloud NAT

מטרת הקטע הזה היא לאפשר למכונות הווירטואליות הפרטיות להוריד את חבילות התוכנה המתאימות מהאינטרנט.

יצירת Cloud Router

מ-cloudshell:

gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc

יצירת שער Cloud NAT

מ-cloudshell:

gcloud compute routers nats create ${prefix}-nat-gw-${region} \
--router=${prefix}-cr \
--router-region=${region} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges

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

יוצרים את מכונות המחשוב ClientA, ClientB, FW ו-Server:

מ-cloudshell:

gcloud compute instances create clienta \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.10 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

מ-cloudshell:

gcloud compute instances create clientb \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.11 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

מ-cloudshell:

gcloud compute instances create server \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.200 \
   --zone $zone \
   --tags server \
   --metadata startup-script='#! /bin/bash
sudo su
apt-get update
apt-get -y install tcpdump
apt-get -y install nginx
cat > /var/www/html/index.html << EOF
<html><body><p>Server</p></body></html>
EOF'

מ-cloudshell:

gcloud compute instances create fw \
   --subnet=$prefix-vpc-subnet \
   --can-ip-forward \
   --no-address \
   --private-network-ip=10.10.10.75 \
   --zone $zone \
   --tags fw \
   --metadata startup-script='#! /bin/bash
apt-get update
sudo apt-get -y install tcpdump
sudo apt-get -y install nginx
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -I FORWARD -d 10.10.10.200 -j REJECT'

9. בדיקת הקישוריות ללא PBR

כניסה ל-SSH במכונות וירטואליות של מחשוב הלקוח שיצרנו לאחרונה, ואימות הקישוריות משני הלקוחות לשרת.

מכניסה ל-cloudshell1 אל clienta:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

מריצים את הפקודות הבאות:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

הפינגים ובקשות ה-curl אמורים להצליח.

פלט:

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clienta:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

פותחים כרטיסייה נוספת ב-cloudshell על ידי לחיצה על הסמל +.

3722d8574c3812b1.png

מ-cloudshell2 מגדירים משתנים לשימוש:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

מ-cloudshell2 SSH ל-Clientb:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

מריצים את הפקודות הבאות:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

הפינגים ובקשות ה-curl אמורים להצליח.

פלט:

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clientb:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

עכשיו יוצאים מטרמינל ה-VM וחוזרים אל cloudshell.

10. יצירה של קבוצת מכונות

יוצרים קבוצת מופעי מכונה לא מנוהלים ל-fw VM.

מ-cloudshell:

gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone

מוסיפים את המכונה של fw לקבוצת המכונות הלא מנוהלות.

מ-cloudshell:

gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone

11. יצירה של בדיקת תקינות

יצירת בדיקת תקינות לשירות לקצה העורפי. אנחנו נבצע בדיקת תקינות פשוטה של יציאת TCP 80.

מ-cloudshell:

gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80

12. יצירת שירות לקצה העורפי

יצירת שירות לקצה העורפי לצירוף לכלל ההעברה.

מ-cloudshell:

gcloud compute backend-services create be-pbr --load-balancing-scheme=internal --protocol=tcp --region=$region --health-checks=$prefix-hc-tcp-80 --health-checks-region=$region

עכשיו מוסיפים את קבוצת המכונות לשירות לקצה העורפי.

מ-cloudshell:

gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone

13. יצירת כלל העברה

מ-cloudshell:

gcloud compute forwarding-rules create fr-pbr --region=$region --load-balancing-scheme=internal --network=$prefix-vpc --subnet=$prefix-vpc-subnet --ip-protocol=TCP --ports=ALL --backend-service=be-pbr --backend-service-region=$region --address=10.10.10.25 --network-tier=PREMIUM

14. יצירת כלל PBR

כלל PBR זה חל על לקוחות. היא תנתב את כל התנועה של IPv4 לכלל ההעברה 10.10.10.25 אם כתובת ה-IP של המקור היא 10.10.10.10/32 (כתובת הלקוח) וכתובת ה-IP של היעד היא 10.10.10.0/24.

כלומר, clienta יתאים ל-PBR ולא ל-Clientb.

מ-cloudshell:

gcloud network-connectivity policy-based-routes create pbr-client \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.10/32 \
   --destination-range=10.10.10.0/24 \
   --protocol-version=IPv4 \
   --priority=1000 \
   --tags=client

כלל PBR הזה חל על השרת. היא תנתב את כל התנועה של IPv4 לכלל ההעברה 10.10.10.25 אם כתובת ה-IP של המקור היא 10.10.10.200/32 וכתובת ה-IP של היעד היא 10.10.10.10/32.

מ-cloudshell:

gcloud network-connectivity policy-based-routes create pbr-server \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.200/32 \
   --destination-range=10.10.10.10/32 \
   --protocol-version=IPv4 \
   --priority=2000 \
   --tags=server

15. בדיקת הקישוריות עם PBR

עכשיו נאמת את הפונקציונליות של PBR. "Fw" המכונה מוגדרת עם מכשירי iptable כדי לדחות בקשות שמיועדות לשרת. אם PBR פועל, הבקשות שעבדו קודם על Clienta ייכשלו אבל clientb עדיין יצליח.

SSH ל-clienta מחשוב VM והרצת אותן בדיקות.

מ-cloudshell1:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

מריצים את הפקודות הבאות:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

פלט:

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
From 10.10.10.75 icmp_seq=1 Destination Port Unreachable
From 10.10.10.75 icmp_seq=2 Destination Port Unreachable
From 10.10.10.75 icmp_seq=3 Destination Port Unreachable
From 10.10.10.75 icmp_seq=4 Destination Port Unreachable
From 10.10.10.75 icmp_seq=5 Destination Port Unreachable
root@clienta:~$ curl 10.10.10.200/index.html
curl: (7) Failed to connect to 10.10.10.200 port 80: Connection refused

מאחר שהבקשות נכשלו, אנחנו יכולים לאשר ש-PBR מנתב באופן פעיל את תעבורת הנתונים של clienta למכונה מסוג fw שהוגדרה לחסום את התנועה הזו.

SSH ל-Clientb ומריצים את אותה בדיקת קישוריות.

מ-cloudshell2:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

מריצים את הפקודות הבאות:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

פלט:

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=63 time=0.361 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=63 time=0.475 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=63 time=0.379 ms
root@clientb:~$ curl 10.10.10.200
<html><body><p>Server</p></body></html>

כמו שאפשר לראות, הבקשות מלקוח לשרת מצליחות. הסיבה לכך היא שהבקשות לא תואמות לכלל PBR לגבי כתובת ה-IP של המקור.

16. [אופציונלי] אימות באמצעות צילומי מסך בחומת אש

בקטע האופציונלי הזה תהיה לכם הזדמנות לאמת PBR על-ידי תיעוד חבילות במכונה הווירטואלית של חומת האש.

עדיין צריך להיות לכם חיבור SSH ב-cloudshell1 ו-cloudshell2 אל clienta ו-clientb.

פותחים כרטיסייה נוספת ב-cloudshell על ידי לחיצה על הסמל +.

5eb3a9956f7e41a2.png

מ-cloudshell3, מגדירים את המשתנים:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

SSH ל-fw:

gcloud compute ssh fw --zone=$zone --tunnel-through-iap

מריצים את הפקודה הבאה ב-fw (cloudshell3):

sudo tcpdump -i any icmp -nn

מ-Clienta (cloudshell1) מריצים את בדיקת ה-ping:

ping 10.10.10.200 -c 5

מ-Clientb (cloudshell2) מריצים את בדיקת ה-ping:

ping 10.10.10.200 -c 5

פלט ב-fw (cloudshell 3):

root@fw:~$ sudo tcpdump -i any icmp -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
17:07:42.215297 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 1, length 64
17:07:42.215338 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 51064 unreachable, length 92
17:07:43.216122 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 2, length 64
17:07:43.216158 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 30835 unreachable, length 92
17:07:44.219064 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 3, length 64
17:07:44.219101 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 2407 unreachable, length 92

לא יופיעו חבילות ב-tcpdump מ-Clientb (10.10.10.11) מאחר ש-PBR לא רלוונטי.

חוזרים ל-cloudshell כדי לנקות משאבים.

17. שלבי ניקוי

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

gcloud -q network-connectivity policy-based-routes delete pbr-client

gcloud -q network-connectivity policy-based-routes delete pbr-server

gcloud -q compute forwarding-rules delete fr-pbr --region=$region

gcloud -q compute backend-services delete be-pbr --region=$region

gcloud -q compute health-checks delete $prefix-hc-tcp-80 --region=$region

gcloud -q compute instance-groups unmanaged delete pbr-uig --zone=$zone

gcloud -q compute instances delete clienta --zone=$zone
gcloud -q compute instances delete clientb --zone=$zone
gcloud -q compute instances delete server --zone=$zone
gcloud -q compute instances delete fw --zone=$zone


gcloud -q compute routers nats delete ${prefix}-nat-gw-${region} \
--router=$prefix-cr --router-region=$region

gcloud -q compute routers delete $prefix-cr --region=$region

gcloud -q compute firewall-rules delete $prefix-allow-iap-proxy
gcloud -q compute firewall-rules delete $prefix-allow-http-icmp
gcloud -q compute firewall-rules delete $prefix-fw-allow-ingress
gcloud -q compute firewall-rules delete $prefix-allow-hc-ingress

מסירים את רשת המשנה ואת רשתות ה-VPC:

gcloud -q compute networks subnets delete $prefix-vpc-subnet \
    --region $region

gcloud -q compute networks delete $prefix-vpc

18. מעולה!

ברכות על השלמת ה-Codelab.

הנושאים שטיפלנו בהם

  • מסלולים שמבוססים על מדיניות