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