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 ומסננים, נכריח את התעבורה מלקוח א' לעבור דרך משאב מחשוב אחר כדי לאכוף את חומת האש, בזמן שהתעבורה מלקוח ב' תעבור ישירות לשרת. התרשים הבא מדגים את הנתיב.

בתרשים שלמעלה, אמור להיות באופן טכני 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.

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

מ-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.
מה נכלל
- ניתוב מבוסס מדיניות