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

1. مقدمه

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

مسیرهای مبتنی بر خط مشی به شما این امکان را می دهند که یک جهش بعدی را بر اساس بیش از آدرس IP مقصد بسته انتخاب کنید. همچنین می توانید ترافیک را با پروتکل و آدرس IP منبع مطابقت دهید. ترافیک منطبق به یک متعادل کننده بار شبکه داخلی هدایت می شود. این می تواند به شما کمک کند وسایلی مانند فایروال را در مسیر ترافیک شبکه قرار دهید.

هنگامی که یک مسیر مبتنی بر خط مشی ایجاد می کنید، انتخاب می کنید که کدام منابع می توانند ترافیک خود را توسط مسیر پردازش کنند. مسیر می تواند برای موارد زیر اعمال شود:

  • کل شبکه: تمام نمونه‌های ماشین مجازی (VM)، دروازه‌های VPN و اتصالات
  • استفاده از برچسب های شبکه: نمونه های VM را در VPC انتخاب کنید
  • منطقه Interconnect: تمام ترافیک ورودی به شبکه VPC از طریق پیوست های VLAN برای منطقه

پرش بعدی یک مسیر مبتنی بر سیاست باید یک متعادل کننده بار شبکه داخلی معتبر باشد که در همان شبکه VPC با مسیر مبتنی بر خط مشی باشد.

متعادل‌کننده‌های بار داخلی شبکه به‌طور پیش‌فرض از هش متقارن استفاده می‌کنند، بنابراین ترافیک می‌تواند بدون پیکربندی NAT منبع، به دستگاه مشابهی در مسیرهای خروجی و بازگشتی برسد.

مسیرهای مبتنی بر خط مشی از اولویت بالاتری نسبت به سایر انواع مسیرها به جز مسیرهای بازگشت ویژه برخوردارند.

اگر دو مسیر مبتنی بر خط‌مشی اولویت یکسانی داشته باشند، Google Cloud از یک الگوریتم قطعی و داخلی برای انتخاب یک مسیر مبتنی بر خط‌مشی استفاده می‌کند و مسیرهای دیگر با همان اولویت را نادیده می‌گیرد. مسیرهای مبتنی بر خط مشی از تطبیق طولانی‌ترین پیشوند استفاده نمی‌کنند و فقط مسیر با اولویت را انتخاب می‌کنند.

می توانید یک قانون واحد برای ترافیک یک طرفه یا چندین قانون برای مدیریت ترافیک دو طرفه ایجاد کنید.

برای استفاده از مسیرهای مبتنی بر سیاست با Cloud Interconnect ، مسیر باید برای همه اتصالات Cloud Interconnect در کل منطقه اعمال شود. مسیرهای مبتنی بر خط مشی را نمی‌توان تنها برای یک اتصال Cloud Interconnect منفرد اعمال کرد.

نمونه های VM که ترافیک را از یک مسیر مبتنی بر خط مشی دریافت می کنند، باید انتقال IP را فعال کنند.

ملاحظات مربوط به PBR

برای استفاده از مسیرهای مبتنی بر سیاست به روش های زیر، پیکربندی خاصی لازم است.

به عنوان مثال استفاده از PBR با GKE، PSC، یا با PGA/PSA.

جزئیات بیشتر در مورد PBR با GKE را می‌توانید در اینجا و بخش کلی محدودیت‌های PBR را در اینجا بیابید.

چیزی که یاد خواهید گرفت

  • نحوه پیکربندی مسیرهای مبتنی بر سیاست

آنچه شما نیاز دارید

  • دانش استقرار نمونه ها و پیکربندی اجزای شبکه
  • دانش پیکربندی فایروال VPC

2. محیط تست

این Codelab از یک VPC استفاده می کند. دو منبع محاسباتی Clienta و Clientb در این محیط وجود خواهد داشت که بسته ها را به منبع سرور دیگری ارسال می کند. با استفاده از PBR و فیلترها، ترافیک مشتری را از طریق یک منبع محاسباتی دیگر برای اجرای فایروال مجبور می کنیم در حالی که ترافیک کلاینت بی مستقیماً به سرور می رود. نمودار زیر مسیر را نشان می دهد.

bff32b01ada8e9ad.png

در نمودار بالا، از نظر فنی باید یک ILB (تعادل کننده بار داخلی شبکه) برای مسیرهای PBR وجود داشته باشد. این برای سادگی نمودار حذف شده است.

3. قبل از شروع

Codelab به یک پروژه واحد نیاز دارد.

از پوسته ابری:

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ها را فعال کنید تا از محصولات استفاده کنند

از پوسته ابری:

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

5. شبکه و زیرشبکه VPC ایجاد کنید

شبکه VPC

ایجاد codelab-pbr-vpc VPC:

از پوسته ابری:

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

زیر شبکه

زیر شبکه های مربوطه را در منطقه انتخاب شده ایجاد کنید:

از پوسته ابری:

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

6. قوانین فایروال را ایجاد کنید

برای اینکه به IAP اجازه دهید به نمونه های VM شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه های VM که می خواهید با استفاده از IAP در دسترس باشند، اعمال می شود.
  • به ترافیک ورودی از محدوده IP 35.235.240.0/20 اجازه می دهد. این محدوده شامل تمام آدرس های IP است که IAP برای ارسال TCP استفاده می کند.

از پوسته ابری:

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 به سرور:

  • برای منابع با برچسب شبکه "سرور" اعمال می شود
  • اجازه ورود از همه منابع را می دهد

از پوسته ابری:

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 را می دهد

از پوسته ابری:

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" اعمال می شود
  • اجازه ورود از محدوده های بررسی سلامت را می دهد

از پوسته ابری:

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

از پوسته ابری:

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

Cloud NAT Gateway را ایجاد کنید

از پوسته ابری:

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 را ایجاد کنید:

از پوسته ابری:

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'

از پوسته ابری:

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'

از پوسته ابری:

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'

از پوسته ابری:

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 به کلاینت وارد شوید:

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.
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 اضافی باز کنید.

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

درخواست های پینگ و کرل باید موفقیت آمیز باشد.

خروجی:

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 خود ایجاد کنید.

از پوسته ابری:

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

نمونه fw را به گروه نمونه مدیریت نشده اضافه کنید.

از پوسته ابری:

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

11. یک چک سلامت ایجاد کنید

یک بررسی سلامت برای خدمات باطن ایجاد کنید. ما یک بررسی سلامت پورت TCP 80 ساده انجام خواهیم داد.

از پوسته ابری:

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

12. یک سرویس Backend ایجاد کنید

یک سرویس پشتیبان برای پیوست کردن به قانون حمل و نقل ایجاد کنید.

از پوسته ابری:

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 اضافه کنید.

از پوسته ابری:

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

13. یک قانون حمل و نقل ایجاد کنید

از پوسته ابری:

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 برای مشتریان اعمال می شود. اگر IP مبدأ 10.10.10.10/32 (آدرس مشتری) و IP مقصد 10.10.10.0/24 باشد، تمام ترافیک IPv4 را به قانون ارسال 10.10.10.25 هدایت می کند.

این بدان معناست که کلاینت با PBR مطابقت دارد و نه با کلاینتb.

از پوسته ابری:

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 هدایت می کند.

از پوسته ابری:

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 کاربردی باشد، درخواست‌هایی که قبلاً روی کلاینتا کار می‌کردند، اکنون با شکست مواجه می‌شوند، در حالی که کلاینتb هنوز موفق است.

SSH در 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 به طور فعال ترافیک مشتری را به نمونه 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>

همانطور که می بینید، درخواست از clientb به سرور موفقیت آمیز است. این به این دلیل است که درخواست ها با یک قانون PBR برای IP منبع مطابقت ندارند.

16. [اختیاری] اعتبارسنجی با ضبط در فایروال

در این بخش اختیاری، شما این فرصت را دارید که PBR را با گرفتن بسته های ضبط شده در فایروال VM تأیید کنید.

همچنان باید یک اتصال 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

از 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 قابل اجرا نیست.

برای پاکسازی منابع، دوباره به 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. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم.

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

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