۱. مقدمه
مسیرهای مبتنی بر سیاست
مسیرهای مبتنی بر سیاست به شما امکان میدهند گام بعدی را بر اساس چیزی بیش از آدرس IP مقصد بسته انتخاب کنید. میتوانید ترافیک را بر اساس پروتکل و آدرس IP منبع نیز تطبیق دهید. ترافیک تطبیق یافته به یک متعادلکننده بار شبکه داخلی هدایت میشود. این میتواند به شما کمک کند تا دستگاههایی مانند فایروالها را در مسیر ترافیک شبکه قرار دهید.
وقتی یک مسیر مبتنی بر سیاست ایجاد میکنید، انتخاب میکنید که کدام منابع میتوانند ترافیک خود را توسط مسیر پردازش کنند. این مسیر میتواند برای موارد زیر اعمال شود:
- کل شبکه: تمام نمونههای ماشین مجازی (VM)، دروازههای VPN و اتصالات داخلی
- استفاده از تگهای شبکه: انتخاب نمونههای ماشین مجازی در VPC
- منطقه اتصال متقابل: تمام ترافیکی که از طریق پیوستهای VLAN برای منطقه وارد شبکه VPC میشود
گام بعدی یک مسیر مبتنی بر سیاست باید یک متعادلکننده بار شبکه داخلی معتبر باشد که در همان شبکه VPC مسیر مبتنی بر سیاست قرار دارد.
متعادلکنندههای بار شبکه داخلی به طور پیشفرض از هش متقارن استفاده میکنند، بنابراین ترافیک میتواند بدون پیکربندی NAT منبع، در مسیرهای خروجی و برگشتی به دستگاه یکسانی برسد.
مسیرهای مبتنی بر سیاست، به جز مسیرهای بازگشت ویژه، اولویت بالاتری نسبت به سایر انواع مسیرها دارند.
اگر دو مسیر مبتنی بر سیاست اولویت یکسانی داشته باشند، گوگل کلود از یک الگوریتم قطعی و داخلی برای انتخاب یک مسیر مبتنی بر سیاست واحد استفاده میکند و سایر مسیرهای با اولویت یکسان را نادیده میگیرد. مسیرهای مبتنی بر سیاست از تطبیق طولانیترین پیشوند استفاده نمیکنند و فقط مسیری با بالاترین اولویت را انتخاب میکنند.
شما میتوانید یک قانون واحد برای ترافیک یکطرفه یا چندین قانون برای مدیریت ترافیک دوطرفه ایجاد کنید.
برای استفاده از مسیرهای مبتنی بر سیاست با Cloud Interconnect ، مسیر باید به تمام اتصالات Cloud Interconnect در کل یک منطقه اعمال شود. مسیرهای مبتنی بر سیاست را نمیتوان فقط به یک اتصال Cloud Interconnect منفرد اعمال کرد.
نمونههای ماشین مجازی که از یک مسیر مبتنی بر سیاست ترافیک دریافت میکنند، باید قابلیت IP Forwarding را فعال داشته باشند.
ملاحظات مربوط به PBR
برای استفاده از مسیرهای مبتنی بر سیاست به روشهای زیر، پیکربندی خاصی لازم است.
برای مثال استفاده از PBR به همراه GKE، PSC یا به همراه PGA/PSA.
جزئیات بیشتر در مورد PBR با GKE را میتوانید اینجا و بخش محدودیتهای کلی PBR را اینجا بیابید.
آنچه یاد خواهید گرفت
- نحوه پیکربندی مسیرهای مبتنی بر سیاست
آنچه نیاز دارید
- آشنایی با پیادهسازی نمونهها و پیکربندی اجزای شبکه
- دانش پیکربندی فایروال VPC
۲. محیط آزمایش
این Codelab از یک VPC واحد استفاده خواهد کرد. در این محیط دو منبع محاسباتی، clienta و clientb، وجود خواهد داشت که بستهها را به منبع سرور دیگری ارسال میکنند. با استفاده از PBR و فیلترها، ترافیک clienta را برای اجرای فایروال از طریق منبع محاسباتی دیگری هدایت میکنیم در حالی که ترافیک clientb مستقیماً به سرور میرود. نمودار زیر مسیر را نشان میدهد.

در نمودار بالا، از نظر فنی باید یک ILB (متعادلکننده بار داخلی شبکه) برای مسیرهای PBR وجود داشته باشد. این مورد برای سادگی نمودار حذف شده است.
۳. قبل از شروع
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
۴. فعال کردن APIها
اگر قبلاً این کار را نکردهاید، APIها را برای استفاده از محصولات فعال کنید.
از cloudshell:
gcloud services enable compute.googleapis.com gcloud services enable networkconnectivity.googleapis.com
۵. ایجاد شبکه و زیرشبکه 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}
۶. ایجاد قوانین فایروال
برای اینکه به IAP اجازه دهید به ماشینهای مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:
- برای تمام نمونههای ماشین مجازی که میخواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال میشود.
- اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را میدهد. این محدوده شامل تمام آدرسهای IP است که IAP برای ارسال TCP استفاده میکند.
از 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" اعمال میشود.
- اجازه ورود از همه منابع را میدهد
از 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 اجازه دریافت بستهها را بدهید، اجازه ورود به همه پروتکلها و پورتها را بدهید.
- برای منابعی با برچسب شبکه "fw" اعمال میشود.
- اجازه ورود از منابع 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" اعمال میشود.
- اجازه ورود از محدودههای بررسی سلامت را میدهد
از 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
۷. ایجاد روتر ابری و NAT ابری
هدف از این بخش این است که ماشینهای مجازی خصوصی بتوانند بستههای نرمافزاری مناسب را از اینترنت دانلود کنند.
ایجاد روتر ابری
از cloudshell:
gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc
ایجاد دروازه 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
۸. ایجاد نمونههای محاسباتی
نمونههای محاسباتی 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'
۹. تست اتصال بدون 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>
حالا از ترمینال ماشین مجازی خارج شوید و به cloudshell برگردید.
۱۰. ایجاد یک گروه نمونه
یک گروه نمونه مدیریت نشده برای ماشین مجازی fw خود ایجاد کنید.
از 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
۱۱. یک بررسی سلامت ایجاد کنید
یک بررسی سلامت برای سرویس backend ایجاد کنید. ما یک بررسی سلامت ساده پورت TCP 80 انجام خواهیم داد.
از cloudshell:
gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80
۱۲. یک سرویس backend ایجاد کنید
یک سرویس backend برای اتصال به قانون forwarding ایجاد کنید.
از 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
حالا گروه نمونه را به سرویس backend اضافه کنید.
از cloudshell:
gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone
۱۳. یک قانون ارسال ایجاد کنید
از 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
۱۴. ایجاد قانون PBR
این قانون PBR برای کلاینتها اعمال میشود. اگر IP مبدا 10.10.10.10/32 (آدرس کلاینت) و IP مقصد 10.10.10.0/24 باشد، تمام ترافیک IPv4 را به قانون ارسال 10.10.10.25 هدایت میکند.
این یعنی 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 روی سرور اعمال میشود. اگر IP منبع 10.10.10.200/32 و IP مقصد 10.10.10.10/32 باشد، تمام ترافیک IPv4 را به قانون ارسال 10.10.10.25 هدایت میکند.
از 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
۱۵. تست اتصال با PBR
اکنون عملکرد PBR را بررسی خواهیم کرد. نمونه "fw" با iptables پیکربندی شده است تا درخواستهای مقصد سرور را رد کند. اگر PBR فعال باشد، درخواستهایی که قبلاً روی clienta کار میکردند، اکنون با شکست مواجه میشوند، در حالی که clientb هنوز موفق است.
به ماشین مجازی کلاینت از طریق SSH متصل شوید و همان تستها را اجرا کنید.
از 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 به طور فعال ترافیک کلاینت را به نمونهی fw که برای مسدود کردن این ترافیک پیکربندی شده بود، هدایت میکند.
به clientb از طریق SSH متصل شوید و همان تست اتصال را اجرا کنید.
از 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 منبع مطابقت ندارند.
۱۶. [اختیاری] اعتبارسنجی با ضبط در فایروال
در این بخش اختیاری، شما این فرصت را دارید که با گرفتن ضبط بستهها در ماشین مجازی فایروال، 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
از کلاینت (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
از آنجایی که PBR قابل اجرا نیست، هیچ بستهای از clientb (10.10.10.11) در tcpdump مشاهده نخواهید کرد.
برای پاکسازی منابع، به cloudshell برگردید.
۱۷. مراحل پاکسازی
از Cloud Shell، قانون PBR، قانون ارسال، سرویس backend، بررسی سلامت، گروه نمونه، نمونههای محاسباتی، 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
۱۸. تبریک میگویم!
تبریک میگویم که آزمایشگاه کد را تمام کردی.
آنچه ما پوشش دادهایم
- مسیرهای مبتنی بر سیاست