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 مباشرةً إلى الخادم. يوضّح الرسم البياني أدناه المسار.

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

من 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 إضافية من خلال النقر على علامة الجمع (+).

من 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 تهانينا!
تهانينا على إكمال هذا الدرس العملي.
المواضيع التي تناولناها
- المسارات المستندة إلى السياسات