1. مقدمة
يتم نشر ميزة موازنة الحمل في Google Cloud على أطراف شبكة Google في نقاط التواجد (POP) التابعة لـ Google حول العالم. تنتقل زيارات المستخدمين الموجّهة إلى موازن تحميل TCP Proxy إلى نقطة التواجد الأقرب إلى المستخدم، ثم تتم موازنة التحميل على شبكة Google العالمية إلى الخلفية الأقرب التي تتوفّر فيها سعة كافية.
Cloud Armor هو نظام رصد الهجمات الموزَّعة لحجب الخدمة وجدار حماية تطبيقات الويب (WAF) من Google. ترتبط خدمة Cloud Armor بشكل وثيق بخدمة "موازنة الحمل المستندة إلى وكيل TCP" في Google Cloud، وتتيح لك فحص حركة البيانات الواردة بحثًا عن الطلبات غير المرغوب فيها. تتيح لك ميزة الحدّ من المعدّل في هذه الخدمة تقليل عدد الزيارات إلى موارد الخلفية استنادًا إلى حجم الطلبات، كما تمنع الزيارات غير المرغوب فيها من استهلاك الموارد على شبكة السحابة الافتراضية الخاصة (VPC).
تتيح لك أجهزة موازنة الحمل لخادم وكيل TCP/SSL في Google Cloud توجيه حركة بيانات من نوع TCP/ SSL بين خدمات الخلفية.
في هذا الدرس التطبيقي حول الترميز، ستنشئ جهاز موازنة حمل لخادم وكيل TCP/طبقة المقابس الآمنة مع خدمة خلفية، وستستخدم Cloud Armor لحصر الوصول إلى جهاز موازنة الحمل على مجموعة محدّدة فقط من أجهزة المستخدمين.

أهداف الدورة التعليمية
- كيفية إنشاء أداة موازنة حمل لخادم وكيل TCP/SSL
- كيفية إنشاء سياسة أمان في Cloud Armor
- كيفية إنشاء قاعدة قائمة حظر عناوين IP لجهاز موازنة الحمل لخادم وكيل TCP/SSL في Cloud Armor
- كيفية إنشاء قاعدة تحديد معدّل لخدمة موازنة الحمل المستندة إلى وكيل TCP في Cloud Armor
- كيفية إضافة سياسة الأمان إلى خدمة خلفية لموازنة الحمل TCP/SSL
المتطلبات
- معرفة أساسية بخدمة Google Compute Engine ( codelab)
- معرفة أساسية بالشبكات وبروتوكول TCP/IP
- معرفة أساسية بسطر الأوامر في نظامَي Unix وLinux
- من المفيد أن تكون قد أكملت جولة في الشبكات في Google Cloud Platform باستخدام الشبكات في Google Cloud.
2. المتطلبات
إعداد البيئة بوتيرة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
ملاحظة: يمكنك الوصول بسهولة إلى Cloud Console من خلال تذكُّر عنوان URL الخاص بها، وهو console.cloud.google.com.



تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيُشار إليه لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.
ملاحظة: إذا كنت تستخدم حساب Gmail، يمكنك ترك الموقع الجغرافي التلقائي مضبوطًا على "بدون مؤسسة". في حال كنت تستخدم حسابًا على Google Workspace، اختَر موقعًا جغرافيًا مناسبًا لمؤسستك.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.
لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا تتحمّل رسومًا تتجاوز هذا البرنامج التعليمي. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا التمرين المعملي باستخدام متصفّح فقط.
قبل البدء
داخل Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
تفعيل واجهات برمجة التطبيقات
تفعيل جميع الخدمات اللازمة
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3- إنشاء خدمات الخلفية
أنشئ مثيلَين على النحو التالي: أنشئ instance1-b1 في المنطقة us-central1-b
gcloud compute instances create vm-1-b1 \
--image-family debian-9 \
--image-project debian-cloud \
--tags tcp-lb \
--zone us-central1-b \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
sudo service apache2 restart
echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html
EOF"
إنشاء الجهاز الظاهري 1-b2 في المنطقة us-central1-b
gcloud compute instances create vm-1-b2 \
--image-family debian-9 \
--image-project debian-cloud \
--tags tcp-lb \
--zone us-central1-b \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
sudo service apache2 restart
echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html
EOF"
إنشاء مثيل مجموعة vm-ig1
gcloud compute instance-groups unmanaged create vm-ig1 --zone us-central1-b
أنشئ منفذًا مسمّى لمجموعة المثيلات. في هذا التمرين العملي، سنستخدم المنفذ 110.
gcloud compute instance-groups set-named-ports vm-ig1 \ --named-ports tcp 110:110 --zone us-central1-b
أضِف المثيلات إلى مجموعة المثيلات.
gcloud compute instance-groups unmanaged add-instances vm-ig1 \ --instances vm-1-b1,vm-1-b2 --zone us-central1-b
4. ضبط إعدادات جهاز موازنة الحمل
بعد ذلك، سننشئ عملية التحقق من الصحة.
gcloud compute health-checks create tcp my-tcp-health-check --port 110
إنشاء خدمة خلفية
gcloud compute backend-services create my-tcp-lb --global-health-checks --global \ --protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110
إضافة مجموعة الأجهزة الافتراضية إلى خدمة الخلفية
gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8
إعداد خادم وكيل TCP مستهدف
gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE
حجز عناوين IPv4 ثابتة وعالمية
ستستخدم عنوان IP هذا للوصول إلى الخدمة التي تمّت موازنة تحميلها.
gcloud compute addresses create tcp-lb-static-ipv4 --ip-version=IPV4 --global
اضبط قواعد إعادة التوجيه العامة لعنوان IP الخاص بموازنة التحميل.
gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
--global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110
5- إنشاء قاعدة جدار حماية لموازنة حمل خادم وكيل TCP
gcloud compute firewall-rules create allow-tcplb-and-health \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --target-tags tcp-lb \ --allow tcp:110
بعد إنشاء أداة موازنة التحميل، اختبِرها باستخدام الأمر التالي
Curl LB_IP:110
بعد ذلك، أنشئ أجهزة افتراضية للتحقّق من رفض الوصول إلى موازن التحميل.
عليك إنشاء مثيلَين، لكلّ منهما عنوان IP عام، وتسميتهما test-server1 وtest-server2.
6. إنشاء سياسة أمان في Cloud Armor
في هذا القسم، ستنشئ سياسة أمان للخادم الخلفي وقاعدتَين في السياسة في Cloud Armor.
سترفض القاعدة الأولى مجموعة محدودة من عناوين IP الوصول إلى موازن تحميل TCP من خلال ضبط سياسة أمان لرفض عناوين IP معيّنة، وستنفّذ القاعدة الثانية عملية الحدّ من المعدّل.
- في Cloud Shell(راجِع "بدء Cloud Shell" ضمن "الإعداد والمتطلبات" للحصول على تعليمات حول كيفية استخدام Cloud Shell)، أنشئ سياسة أمان لخدمة الخلفية باسم rate-limit-and-deny-tcp على النحو التالي:
gcloud compute security-policies create rate-limit-and-deny-tcp \
--description "policy for tcp proxy rate limiting and IP deny"
إضافة قواعد إلى سياسة الأمان
بعد ذلك، أضِف قاعدة قائمة الرفض إلى سياسة Cloud Armor "rate-limit-and-deny-tcp".
gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"
إضافة قاعدة تحديد المعدّل إلى سياسة أمان Cloud Armor "rate-limit-and-deny-tcp"
gcloud compute security-policies rules create 3000 \ --security-policy=rate-limit-and-deny-tcp \ --expression="true" --action=rate-based-ban --rate-limit-threshold-count=5 \ --rate-limit-threshold-interval-sec=60 --ban-duration-sec=300 \ --conform-action=allow --exceed-action=deny-404 --enforce-on-key=IP
ربط السياسة بخدمة الخلفية لخادم وكيل TCP:
نفِّذ الأمر التالي للتأكّد من ربط سياسة الأمان بخدمة الخلفية لخادم TCP الوكيل.
gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp
تفعيل التسجيل في موازن تحميل وكيل TCP
gcloud beta compute backend-services update my-tcp-lb \ --enable-logging --logging-sample-rate=1
7. التحقّق من صحة قاعدة قائمة الرفض
تحقَّق من صحة قاعدة قائمة الرفض من خلال تسجيل الدخول إلى الخادم التجريبي الذي تم تحديد عنوان IP الخاص به في قاعدة قائمة الرفض وتشغيل الأمر التالي
Curl LB_IP:110
قد تقدّم الطلبات الفورية استجابة من موازنة التحميل، ولكن عليك الانتظار إلى أن يتم رفض طلب curl أو إسقاطه، ثم إلقاء نظرة على السجلات في Cloud Logging للتحقّق من تفعيل إدخال السجلّ لقاعدة رفض عنوان IP.
انتقِل إلى Cloud Logging وضِمن المراجع، اختَر نوع المرجع "tcp_ssl_proxy_rule" واضبط هدف الخلفية على "my-tcp-lb".
باستخدام الموارد المحدّدة للتصفية، يمكننا التأكّد من أنّ قاعدة رفض عنوان IP سارية من قيمة الأولوية 1000 في إدخال في السجلّ، وأنّ الإجراء "رفض" الذي تم ضبطه سارٍ لأنّه تم توجيه كليهما من قاعدة الرفض وعنوان IP الذي تم رفضه كما هو موضّح أدناه.

8. التحقّق من صحة قاعدة الحدّ الأقصى لمعدّل الزحف
تأكَّد من أنّ قاعدة الحدّ الأقصى لعدد الطلبات سارية من خلال إرسال العديد من الطلبات في إطار زمني قصير يتجاوز الحدّ المحدّد (5 طلبات في الدقيقة).
بعد الانتهاء من ذلك، انقر على "عرض السجلات" في خدمة Cloud Armor، وسيتم نقلك إلى Cloud Logging حيث يمكنك فلترة السجلات حسب موازنة الحمل للاطّلاع على سجلات Cloud Armor عند ورودها.
يجب أن يكون إدخال الحدّ الأقصى لعدد الطلبات في الدقيقة الواحدة مطابقًا للقطة الشاشة أدناه. يمكننا التأكّد من أنّ قاعدة الحدّ الأقصى لعدد الطلبات سارية من قيمة الأولوية البالغة 3000 في إدخال في السجلّ ومن الإجراء الذي تمّ ضبطه، وأنّ الإجراء "الحظر المستند إلى عدد الطلبات" سارٍ كما هو موضّح في قاعدة الحدّ الأقصى لعدد الطلبات.

9- تنظيف البيئة
احرص على تنظيف البنية الأساسية التي تم إنشاؤها لتجنُّب تكاليف التشغيل للبنية الأساسية غير المستخدَمة.
أسرع طريقة هي حذف المشروع بأكمله في Google Cloud Platform لضمان عدم ترك أي موارد معلّقة بدون معالجة، ولكن يمكنك حذف الموارد الفردية باستخدام الأوامر التالية:
جهاز موازنة الحمل لخادم وكيل TCP
gcloud compute target-tcp-proxies delete my-tcp-lb
مجموعة الأجهزة الافتراضية
gcloud compute instance-groups unmanaged delete vm-ig1
تم إنشاء مثيلَي الجهازَين الافتراضيَين التجريبيَين
gcloud compute instances delete Instance_name --zone=instance_zone
خدمة الخلفية
gcloud compute backend-services delete BACKEND_SERVICE_NAME
قواعد Cloud Armor ضِمن السياسة
gcloud compute security-policies rules delete 1000 \ --security-policy=rate-limit-and-deny-tcp && gcloud compute security-policies rules delete 3000 \ --security-policy=rate-limit-and-deny-tcp
سياسة الأمان في Cloud Armor
gcloud compute security-policies delete rate-limit-and-deny-tcp