Codelab مسیرهای مبتنی بر سیاست (PBR).

۱. مقدمه

مسیرهای مبتنی بر سیاست

مسیرهای مبتنی بر سیاست به شما امکان می‌دهند گام بعدی را بر اساس چیزی بیش از آدرس 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 مستقیماً به سرور می‌رود. نمودار زیر مسیر را نشان می‌دهد.

bff32b01ada8e9ad.png

در نمودار بالا، از نظر فنی باید یک 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 دیگر باز کنید.

۳۷۲۲d۸۵۷۴c۳۸۱۲b۱.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>

حالا از ترمینال ماشین مجازی خارج شوید و به 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 دیگر باز کنید.

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

از کلاینت (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

۱۸. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.

آنچه ما پوشش داده‌ایم

  • مسیرهای مبتنی بر سیاست