الدرس التطبيقي حول ترميز المسارات المستنِدة إلى السياسات (PBR)

1. مقدمة

المسارات المستندة إلى السياسات

تتيح لك المسارات المستندة إلى السياسات اختيار الخطوة التالية استنادًا إلى أكثر من عنوان IP للوجهة. يمكنك أيضًا مطابقة الزيارات حسب البروتوكول وعنوان IP المصدر. تتم إعادة توجيه الزيارات المطابقة إلى جهاز موازنة حمل في الشبكة الداخلية. يمكن أن يساعدك ذلك في إدراج أجهزة، مثل جدران الحماية، في مسار حركة بيانات الشبكة.

عند إنشاء مسار مستند إلى سياسة، يمكنك اختيار الموارد التي يمكن للمسار معالجة زياراتها. يمكن أن ينطبق المسار على ما يلي:

  • الشبكة بأكملها: جميع مثيلات الأجهزة الافتراضية وبوابات الشبكة الافتراضية الخاصة وعمليات الربط البيني
  • استخدام علامات الشبكة: اختَر مثيلات الأجهزة الافتراضية في شبكة 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. بيئة الاختبار

سيستفيد هذا الدرس التطبيقي حول الترميز من سحابة VPC واحدة. سيتوفّر موردان للحوسبة، clienta وclientb، في هذه البيئة، وسيرسلان حِزمًا إلى مورد خادم آخر. باستخدام PBR والفلاتر، سنفرض توجيه حركة البيانات من clienta عبر مورد حوسبة آخر لفرض جدار الحماية، بينما يتم توجيه حركة البيانات من clientb مباشرةً إلى الخادم. يوضّح الرسم البياني أدناه المسار.

bff32b01ada8e9ad.png

في المخطّط البياني أعلاه، من المفترض أن يكون هناك جهاز موازنة حمل داخلي (موازن حمل داخلي للشبكة) لمسارات 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. تفعيل واجهات برمجة التطبيقات

إذا لم يسبق لك إجراء ذلك، فعِّل واجهات برمجة التطبيقات لاستخدام المنتجات.

من cloudshell:

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

5- إنشاء شبكة VPC وشبكة فرعية

شبكة السحابة الخاصة الافتراضية (VPC)

أنشئ شبكة VPC باسم codelab-pbr-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. إنشاء قواعد جدار الحماية

للسماح لميزة "الوصول إلى الأجهزة الافتراضية عبر الإنترنت" بالاتصال بأجهزة VM الافتراضية، أنشئ قاعدة جدار حماية تتضمّن ما يلي:

  • ينطبق على جميع مثيلات الأجهزة الافتراضية التي تريد إتاحتها باستخدام 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"
  • يسمح بالدخول من مصادر 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

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. إنشاء آلات افتراضية في Compute

أنشئ مثيلات الحوسبة 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>

افتح علامة تبويب Cloud Shell إضافية من خلال النقر على علامة الجمع (+).

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

يجب أن تنجح طلبات 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. إنشاء مجموعة مثيلات

أنشِئ مجموعة مثيلات غير مُدارة لجهازك الافتراضي الذي يعمل كجدار حماية.

من cloudshell:

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

أضِف الجهاز الظاهري لجدار الحماية إلى مجموعة الأجهزة الافتراضية غير المُدارة.

من 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 (عنوان clienta) وكان عنوان 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" باستخدام iptables لرفض الطلبات المتّجهة إلى الخادم. إذا كانت ميزة PBR تعمل، ستفشل الطلبات التي كانت تعمل سابقًا على clienta، بينما ستظل clientb ناجحة.

افتح SSH في آلة افتراضية (VM) تابعة لحساب clienta على Compute Engine ونفِّذ الاختبارات نفسها.

من 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. [اختياري] التحقّق من صحة عمليات الالتقاط على جدار الحماية

في هذا القسم الاختياري، لديك الفرصة للتحقق من صحة توجيه الحِزم المستند إلى السياسات من خلال التقاط حِزم البيانات على الجهاز الظاهري لجدار الحماية.

سيظلّ بإمكانك إجراء اتصال SSH في cloudshell1 وcloudshell2 مع clienta وclientb.

افتح علامة تبويب Cloud Shell إضافية من خلال النقر على علامة الجمع (+).

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:

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 غير منطبق.

اخرج من Cloud Shell لتنظيف الموارد.

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 تهانينا!

تهانينا على إكمال هذا الدرس العملي.

المواضيع التي تناولناها

  • المسارات المستندة إلى السياسات