درس تطبيقي حول ترميز خادم وكيل TCP - الحد من المعدل وقائمة منع عنوان IP باستخدام جهاز موازنة حمل خادم وكيل TCP

1. مقدمة

يتم نشر ميزة "موازنة الحمل" في Google Cloud على حافة شبكة Google في نقاط تواجد Google (POP) حول العالم. إنّ زيارات المستخدمين الموجّهة إلى موازن تحميل وكيل بروتوكول النقل (TCP) تدخل إلى خادم بروتوكول مكتب البريد (POP) الأقرب إلى المستخدم، ويتم بعد ذلك موازنة الحمولة على شبكة Google العالمية إلى الخلفية الأقرب التي تتوفّر فيها سعة كافية.

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

تتيح لك أجهزة موازنة الحمل لخوادم الوكيل TCP/SSL في Google Cloud تمثيل حركة بيانات نوع TCP/ SSL بين خدمات الخلفية.

في هذا الدرس، ستُنشئ جهاز موازنة حمل بروتوكول النقل المتعدّد (TCP)/بروتوكول أمان طبقة النقل (SSL) مع خدمة خلفية، وستحصر الوصول إلى جهاز موازنة الحمل بمجموعة محدّدة من عملاء المستخدمين فقط.

be33dadf836374bb.png

المُعطيات

  • كيفية إنشاء موازن تحميل خادم وكيل TCP/SSL
  • كيفية إنشاء سياسة أمان Cloud Armor
  • كيفية إنشاء قاعدة قائمة حظر عناوين IP لخدمة موازنة الحمولة لوكيل TCP/SSL في Cloud Armor
  • كيفية إنشاء قاعدة تقييد معدّل لجهاز موازنة الحمولة الوكيل لبروتوكول TCP في Cloud Armor
  • كيفية إضافة سياسة الأمان إلى خدمة خلفية لموازنة الحمل عبر بروتوكول TCP/بروتوكول أمان طبقة النقل

المتطلبات

  • معرفة أساسية بخدمة Google Compute Engine ( codelab)
  • المعرفة الأساسية بالشبكات وTCP/IP
  • المعرفة الأساسية لسطر أوامر Unix/Linux
  • من المفيد إكمال جولة في شبكة Google Cloud باستخدام الشبكات في Google Cloud.

2. المتطلبات

إعداد البيئة حسب وتيرة الطالب واحتياجاته

  1. سجِّل الدخول إلى Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

ملاحظة: يمكنك الوصول بسهولة إلى Cloud Console من خلال حفظ عنوان URL الخاص بها، وهو console.cloud.google.com.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون متاحًا لك). وسيتم الإشارة إليه لاحقًا في هذا الدليل التعليمي باسم PROJECT_ID.

ملاحظة: إذا كنت تستخدم حساب Gmail، يمكنك ترك الموقع الجغرافي التلقائي مضبوطًا على "بدون مؤسسة". إذا كنت تستخدم حسابًا على Google Workspace، اختَر موقعًا جغرافيًا مناسبًا لمؤسستك.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

من المفترض ألا تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو تكلفة قليلة جدًا. احرص على اتّباع أي تعليمات في قسم "التنظيف" التي تنصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد انتهاء هذا البرنامج التعليمي. المستخدمون الجدد في Google Cloud مؤهّلون للاستفادة من برنامج الفترة التجريبية المجانية التي تقدّم رصيدًا بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 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 معيّنة، وستنفّذ القاعدة الثانية الحدّ من معدّل الإرسال.

  1. في 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 أو إسقاطه، ثم اطّلِع على السجلّات في "سجلّات السحابة الإلكترونية" للتحقّق من إدخال السجلّ لقاعدة حظر عنوان IP التي يتم تفعيلها.

انتقِل إلى "تسجيلات Cloud"، وضمن "الموارد"، اختَر نوع المورد "tcp_ssl_proxy_rule" واضبط استهداف الخلفية على "my-tcp-lb".

باستخدام الموارد المحدّدة للفلترة، يمكننا التحقّق من أنّ قاعدة رفض عنوان IP سارية من قيمة PRIORITY التي تبلغ 1000 في إدخال السجلّ وأنّ الإجراء الذي تم ضبطه "DENY" سارٍ لأنّه تم توجيه كليهما من قاعدة الرفض وعنوان IP الذي يتم رفضه كما هو موضّح أدناه.

db9b835e0360dcaf.png

8. التحقّق من صحة قاعدة الحدّ من معدّل الإدراج

تأكَّد من أنّ قاعدة الحدّ الأقصى لمعدّل الطلبات سارية من خلال إرسال العديد من الطلبات في إطار زمني قصير يتجاوز الحدّ الأدنى المحدّد (5 طلبات في الدقيقة).

بعد الانتهاء من ذلك، انقر على "عرض السجلات" في خدمة Cloud Armor، وسينقلك ذلك إلى "تسجيلات السحابة الإلكترونية" حيث يمكنك فلترة السجلات حسب جهاز موازنة الحمل للاطّلاع على سجلات Cloud Armor عند وصولها.

يجب أن يكون إدخال الحدّ الأقصى للمعدل كما هو موضّح في لقطة الشاشة أدناه. يمكننا التحقّق من أنّ قاعدة الحدّ الأقصى للمعدل سارية من قيمة PRIORITY التي تبلغ 3000 في إدخال السجلّ ومن الإجراء الذي تمّ ضبطه، وهو الإجراء "حظر استنادًا إلى معدّل الإرسال" سارٍ وفقًا للتعليمات الواردة من قاعدة الحدّ الأقصى للمعدل.

37c76e5d7532623.png

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