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

1. מבוא

ניתוב מבוסס מדיניות

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

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

  • הרשת כולה: כל המכונות הווירטואליות (VM), שערי ה-VPN והחיבורים ל-Interconnect
  • שימוש בתגי רשת: בחירת מכונות וירטואליות ב-VPC
  • אזור Interconnect: כל התעבורה שנכנסת לרשת ה-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 ומסננים, נכריח את התעבורה מלקוח א' לעבור דרך משאב מחשוב אחר כדי לאכוף את חומת האש, בזמן שהתעבורה מלקוח ב' תעבור ישירות לשרת. התרשים הבא מדגים את הנתיב.

bff32b01ada8e9ad.png

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

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

ב-Codelab נדרש פרויקט אחד.

מ-Cloud Shell:

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 כדי להשתמש במוצרים

מ-Cloud Shell:

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

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

רשת VPC

יוצרים רשת VPC בשם codelab-pbr-vpc:

מ-Cloud Shell:

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

Subnet

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

מ-Cloud Shell:

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

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

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

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

מ-Cloud Shell:

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
  • מאפשר תעבורה נכנסת מכל המקורות

מ-Cloud Shell:

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
  • מאפשר תעבורה נכנסת ממקורות 10.10.10.0/24

מ-Cloud Shell:

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

כדי לאפשר את בדיקות התקינות (probes)

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

מ-Cloud Shell:

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

מ-Cloud Shell:

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

יצירת שער Cloud NAT

מ-Cloud Shell:

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:

מ-Cloud Shell:

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'

מ-Cloud Shell:

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'

מ-Cloud Shell:

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'

מ-Cloud Shell:

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

פקודות ה-ping ובקשות ה-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>

לוחצים על הסמל + כדי לפתוח כרטיסייה נוספת של Cloud Shell.

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

פקודות ה-ping ובקשות ה-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>

עכשיו יוצאים מהטרמינל של המכונה הווירטואלית וחוזרים אל Cloud Shell.

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

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

מ-Cloud Shell:

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

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

מ-Cloud Shell:

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

11. יצירת בדיקת תקינות

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

מ-Cloud Shell:

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

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

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

מ-Cloud Shell:

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

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

מ-Cloud Shell:

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

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

מ-Cloud Shell:

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 (הכתובת של clienta) וכתובת ה-IP של היעד היא 10.10.10.0/24.

המשמעות היא שהערך clienta יתאים ל-PBR ולא ל-clientb.

מ-Cloud Shell:

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 הזה חל על השרת. התנועה תנותב לכלל ההעברה 10.10.10.25 אם כתובת ה-IP של המקור היא 10.10.10.200/32 וכתובת ה-IP של היעד היא 10.10.10.10/32.

מ-Cloud Shell:

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 מוגדר עם iptables לדחיית בקשות שמיועדות לשרת. אם PBR פועל, הבקשות שפעלו קודם בלקוח א' ייכשלו עכשיו, אבל הבקשות בלקוח ב' עדיין יצליחו.

מתחברים באמצעות SSH למכונה וירטואלית של Compute של clienta ומריצים את אותן בדיקות.

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

מבצעים 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>

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

16. [אופציונלי] אימות באמצעות לכידות בחומת האש

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

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

לוחצים על הסמל + כדי לפתוח כרטיסייה נוספת של Cloud Shell.

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 into fw:

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

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

sudo tcpdump -i any icmp -nn

מ-clienta ‏ (cloudshell1) מריצים את בדיקת הפינג:

ping 10.10.10.200 -c 5

מ-clientb ‏ (cloudshell2) מריצים את בדיקת הפינג:

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 לא רלוונטי.

יוצאים בחזרה אל Cloud Shell כדי לנקות את המשאבים.

17. שלבי הניקוי

מ-Cloud Shell, מסירים את כלל ה-PBR, כלל ההעברה, שירות הקצה העורפי, בדיקת התקינות, קבוצת המופעים, מופעי ה-Compute, ה-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.

מה נכלל

  • ניתוב מבוסס מדיניות