استخدام تخصيص منفذ ديناميكي NAT في السحابة الإلكترونية

1. نظرة عامة

التخصيص الديناميكي للمنافذ (DPA) هو ميزة جديدة في Cloud NAT. ومن خلال تفعيل "تعديل بنود معالجة البيانات"، تعمل "ترجمة عنوان الشبكة" على زيادة/خفض تخصيصات المنافذ بشكل ديناميكي حسب احتياجاتها. يتم ضبط "تعديل بنود معالجة البيانات" وفقًا للحد الأدنى والأقصى للمنافذ، بحيث لا يتم مطلقًا خفض حجم المنافذ إلى ما دون الحد الأدنى أو زيادة المنافذ إلى ما هو أبعد من الحد الأقصى. ويسمح ذلك لبعض المثيلات التي تقف وراء مداخل NAT بتوسيع نطاق عدد اتصالاتها ديناميكيًا بدون الحاجة إلى تخصيص المزيد من المنافذ لجميع الحالات التي يطلق عليها Cloud NAT (ترجمة عنوان الشبكة).

وبدون تعديل معالجة البيانات (DPA)، يتم تخصيص عدد المنافذ نفسه لجميع المثيلات التي تقف وراء Cloud NAT بغض النظر عن الاستخدام، على النحو المحدّد في المَعلمة minPortsPerVm .

لمزيد من المعلومات، يُرجى الاطّلاع على قسم المستندات حول تعديل بنود معالجة البيانات (NAT) .

المعلومات التي ستطّلع عليها

  • كيفية إعداد بوابة ترجمة عنوان الشبكة في السحابة الإلكترونية استعدادًا لتعديل معالجة البيانات (DPA).
  • كيفية فحص تخصيصات المنافذ بدون تعديل بنود معالجة البيانات
  • كيفية تفعيل وضبط تعديل معالجة البيانات (DPA) لبوابة NAT.
  • كيفية مراقبة تأثيرات "تعديل بنود معالجة البيانات" من خلال تشغيل وصلات مخرج موازٍ
  • كيفية إضافة قواعد NAT إلى بوابة NAT مع تفعيل تعديل معالجة البيانات (DPA).
  • كيفية الاطّلاع على سلوك "تعديل بنود معالجة البيانات" باستخدام القواعد من خلال تنفيذ اتصالات مخارج إلى وجهات متعددة

المتطلبات

  • معرفة أساسية بـ Google Compute Engine
  • الشبكات الأساسية والمعرفة ببروتوكول TCP/IP
  • معرفة سطر أوامر Unix/Linux الأساسي
  • من المفيد استكمال جولة حول الشبكات في Google Cloud مثل مختبر الاتصال بالشبكات في Google Cloud.
  • مشروع على Google Cloud مع "إذن الوصول إلى الإصدار الأولي" مفعّلة.
  • فهم أساسيات ترجمة عنوان الشبكة في السحابة الإلكترونية.

2. استخدام Google Cloud Console وCloud Shell

وللتفاعل مع Google Cloud Platform، سنستخدم كلاً من Google Cloud Console وCloud Shell خلال هذا الدرس التطبيقي.

Google Cloud Console

يمكن الوصول إلى Cloud Console من خلال https://console.cloud.google.com.

75eef5f6fd6d7e41.png

إعداد بيئة ذاتية

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي عبارة عن سلسلة أحرف لا تستخدمها Google APIs، ويمكنك تحديثها في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الرجوع إلى رقم تعريف المشروع (والذي يتم تحديده عادةً على أنّه PROJECT_ID). لذلك، إذا لم يعجبك، يمكنك إنشاء رقم تعريف عشوائي آخر أو يمكنك تجربة رقم تعريف المشروع الخاص بك ومعرفة ما إذا كان متاحًا. بعد ذلك تكون الحالة "مجمّدة". بعد إنشاء المشروع.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد أكثر من هذا البرنامج التعليمي، اتبع أي عملية "تنظيف". التعليمات الموجودة في نهاية الدرس التطبيقي حول الترميز. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا التمرين من خلال متصفح.

3- إعداد التمرين المعملي

ستستخدم مشروعًا في هذا التمرين المعملي وتنشئ شبكتي VPC مع شبكة فرعية في كل منهما. ستحجز عناوين IP خارجية، ثم تنشئ وتضبط مدخل ترجمة عنوان الشبكة (NAT) (باستخدام Cloud Router)، ومثيلين للمُنتِج، بالإضافة إلى مثيلين للمستهلك. بعد التحقّق من صحة سلوك "ترجمة عنوان الشبكة في السحابة الإلكترونية" التلقائي، ستفعِّل ميزة "التخصيص الديناميكي للمنفذ" وتتحقّق من سلوكها. وأخيرًا، ستقوم أيضًا بتهيئة قواعد NAT ومراقبة التفاعل بين قواعد DPA وقواعد NAT.

نظرة عامة على بنية الشبكات:

a21caa6c333909d8.png

4. حجز عناوين IP الخارجية

لنحتفظ بجميع عناوين IP الخارجية لاستخدامها في هذا التمرين المعملي. سيساعدك ذلك في كتابة جميع قواعد NAT وجدار الحماية ذات الصلة في سحابة VPC الخاصة بالمستهلك والمنتج.

من Cloud Shell:

gcloud compute addresses  create nat-address-1 nat-address-2 \
 producer-address-1 producer-address-2 --region us-east4

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

تعبئة عناوين IP التي تم حجزها كمتغيّرات للبيئة

export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"`
export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"`
export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"`
export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`

من غير المتوقّع أن يتم إرسال أي نتائج، ولكن للتأكّد من تعبئة العناوين بشكلٍ صحيح. لنخرج قيم جميع متغيرات البيئة.

env | egrep '^(nat|producer)ip[1-3]'

إخراج:

producerip1=<Actual Producer IP 1>
producerip2=<Actual Producer IP 2>
natip1=<NAT IP 1>
natip2=<NAT IP 2>

5- إعداد سحابة VPC ومثيلاتها في أداة الإنتاج

سنقوم الآن بإنشاء الموارد لموارد المنتج. ستوفّر المثيلات التي تعمل في سحابة VPC الخاصة بالمُنتِج خدمة الوصول إلى الإنترنت باستخدام عنوانَي IP عامَّين "POLICY-address-1". و"الإنتاج-العنوان-2" .

لنبدأ أولاً بإنشاء VPC. من Cloud Shell:

gcloud compute networks create producer-vpc --subnet-mode custom

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc].
NAME      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
producer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp

بعد ذلك، لننشئ الشبكة الفرعية في us-east4. من Cloud Shell:

gcloud compute networks subnets create prod-net-e4 \
   --network producer-vpc --range 10.0.0.0/24 --region us-east4

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4].
NAME         REGION    NETWORK       RANGE        STACK_TYPE  IPV6_ACCESS_TYPE  IPV6_CIDR_RANGE  EXTERNAL_IPV6_CIDR_RANGE
prod-net-e4  us-east4  producer-vpc  10.0.0.0/24  IPV4_ONLY

بعد ذلك، لننشئ قواعد جدار حماية سحابة VPC للسماح لعناوين IP الخاصة بترجمة عنوان الشبكة (NAT) بالوصول إلى مثيلات المنتج على المنفذ 8080.

بالنسبة إلى القاعدة الأولى، من Cloud Shell:

gcloud compute firewall-rules create producer-allow-80 \
  --network producer-vpc --allow tcp:80 \
  --source-ranges $natip1,$natip2

إخراج:

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
producer-allow-80    producer-vpc  INGRESS    1000      tcp:80          False

الخطوة التالية هي إنشاء مثيلي المنتج.

تُشغل مثيلات المنتِج نشرًا بسيطًا لخادم nginx.

لتزويد المثيلات بسرعة بجميع البرامج المطلوبة، سننشئ المثيلات بنص برمجي لبدء التشغيل يثبت nginx باستخدام مدير حزم Debian APT.

لنتمكن من كتابة قواعد NAT، سنزود كل مثيل بعنوان IP مختلف محجوز.

أنشئ المثيل الأول. من Cloud Shell:

gcloud compute instances create producer-instance-1 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=prod-net-e4 \
--metadata startup-script="#! /bin/bash
sudo apt update
sudo apt install -y nginx
mkdir /var/www/html/nginx/
cat <<EOF > /var/www/html/nginx/index.html
<html><body><h1>This is producer instance 1</h1>
</body></html>
EOF"

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-1].
NAME                 ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
producer-instance-1  us-east4-a  e2-medium                  10.0.0.2     <Producer IP1>  RUNNING

ثم أنشئ المثيل الثاني. من Cloud Shell:

gcloud compute instances create producer-instance-2 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=prod-net-e4 \
--metadata startup-script="#! /bin/bash
sudo apt update
sudo apt install -y nginx
mkdir /var/www/html/nginx/
cat <<EOF > /var/www/html/nginx/index.html
<html><body><h1>This is producer instance 2</h1>
</body></html>
EOF"

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-2].
NAME                 ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
producer-instance-2  us-east4-a  e2-medium                  10.0.0.3     <Producer IP2>  RUNNING

6- إعداد سحابة VPC وترجمة عنوان الشبكة (NAT) ومثيلاتها في السحابة الإلكترونية للمستهلك

الآن بعد أن أنشأت خدمة المنتج، حان الوقت لإنشاء شبكة VPC للمستهلك وبوابة NAT في السحابة الإلكترونية.

بعد إنشاء شبكة VPC والشبكة الفرعية، سنضيف قاعدة جدار حماية دخول بسيطة للسماح بعملية الشراء داخل التطبيق لنطاقات عناوين IP المصدر لـ TCP. وسيتيح لنا ذلك نقل بروتوكول النقل الآمن لمثيلات المستهلك مباشرةً باستخدام gcloud.

سنُنشئ بعد ذلك بوابة ترجمة عنوان الشبكة السحابية بسيطة في وضع التخصيص اليدوي والعنوان المحجوز "nat-address-1" المرتبطة بها. في الأجزاء اللاحقة من الدرس التطبيقي حول الترميز، سنُعدّل إعدادات المدخل لتفعيل تخصيص المنفذ الديناميكي، ثم إضافة قواعد مخصّصة لاحقًا.

لنبدأ أولاً بإنشاء VPC. من Cloud Shell:

gcloud compute networks create consumer-vpc --subnet-mode custom

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc].
NAME          SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
consumer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp:22,tcp:3389,icmp

بعد ذلك، لننشئ شبكة فرعية في us-east4. من Cloud Shell:

gcloud compute networks subnets create cons-net-e4 \
   --network consumer-vpc --range 10.0.0.0/24 --region us-east4

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4].
NAME         REGION    NETWORK       RANGE        STACK_TYPE  IPV6_ACCESS_TYPE  IPV6_CIDR_RANGE  EXTERNAL_IPV6_CIDR_RANGE
cons-net-e4  us-east4  consumer-vpc  10.0.0.0/24  IPV4_ONLY

بعد ذلك، لننشئ قواعد جدار حماية VPC للسماح لعناوين نطاقات الشراء داخل التطبيق بالوصول إلى مثيلات المستهلك على المنفذ 22.

بالنسبة إلى قاعدة جدار الحماية الأولى، يمكنك تشغيل ما يلي من Cloud Shell:

gcloud compute firewall-rules create consumer-allow-iap \
  --network consumer-vpc --allow tcp:22 \
  --source-ranges 35.235.240.0/20

إخراج:

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
consumer-allow-iap  consumer-vpc  INGRESS    1000      tcp:22        False

قبل إنشاء بوابة ترجمة عنوان الشبكة، نحتاج إلى إنشاء مثيل Cloud Router أولاً (نستخدم رقم ASN خاصًا ولكن لا علاقة له بأنشطة هذا التمرين). من Cloud Shell:

gcloud compute routers create consumer-cr \
--region=us-east4 --network=consumer-vpc \
 --asn=65501

إخراج:

Creating router [consumer-cr]...done.
NAME         REGION       NETWORK
consumer-cr  us-east4  consumer-vpc

ثم أنشئ مثيل بوابة NAT. من Cloud Shell:

gcloud compute routers nats create consumer-nat-gw \
    --router=consumer-cr \
    --router-region=us-east4 \
    --nat-all-subnet-ip-ranges \
    --nat-external-ip-pool=nat-address-1

إخراج:

Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.

تجدر الإشارة إلى أنّه يتم تلقائيًا إنشاء بوابة ترجمة عنوان الشبكة في السحابة الإلكترونية مع ضبط minPortsPerVm على 64.

أنشئ مثيلات اختبار المستهلك. نحن نملأ هنا عناوين IP المحجوزة للمنتج من أجل الرجوع إليها ضمن المثيل لاحقًا. من Cloud Shell:

gcloud compute instances create consumer-instance-1 --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \
--metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2

gcloud compute instances create consumer-instance-2 --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \
--metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2

إخراج:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-1].
NAME                ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance-1  us-east4-a  e2-medium                  10.0.0.2                  RUNNING

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-2].
NAME                ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance-2  us-east4-a  e2-medium                  10.0.0.3                  RUNNING

7. التحقّق من سلوك "ترجمة عنوان الشبكة في السحابة الإلكترونية" التلقائي

في هذه المرحلة، تستخدم مثيلات المستهلك سلوك "ترجمة عنوان الشبكة في السحابة الإلكترونية" التلقائي الذي يستخدم عنوان IP المحجوز نفسه وهو "nat-address-1". للتواصل مع جميع العناوين الخارجية. بالإضافة إلى ذلك، لم يتم تفعيل تعديل بنود معالجة البيانات (DPA) في Cloud NAT حتى الآن.

دعنا نتحقق من صحة المنافذ التي خصصتها Cloud NAT لمثيلات المستهلك لدينا من خلال تشغيل الأمر التالي

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

ناتج النموذج

---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Consumer IP1>:1024-1055
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
  - <NAT Consumer IP1>:32768-32799
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
---
instanceName: consumer-instance-2
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1056-1087
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3
- natIpPortRanges:
  - <NAT Address IP1>:32800-32831
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3

يظهر من الناتج أعلاه أنّ Cloud NAT خصصت 64 منفذًا لكل مثيل من عنوان IP الخارجي نفسه nat-address-1.

لنتحقّق من عدد الاتصالات التي يمكننا فتحها بالتوازي قبل تفعيل تعديل معالجة البيانات.

SSH في مثيل المستهلك الأول. من Cloud Shell:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

من المفترض أن تكون الآن في مثيل المثيل.

نتيجة النموذج (تم اقتطاع الناتج الكامل للإيجاز)

External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance-1:~$

من داخل مثيل المستهلك، لنبدأ أولاً بجلب عناوين IP الخاصة بالمنتجين وتعبئتها كمتغيرات للبيئة.

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

ثم حاول التمدُّد إلى كلتا مثيلات المنتِج لنتأكّد من قدرتنا على الوصول إليهم بنجاح.

<username>@consumer-instance-1:~$ curl http://$producerip1/nginx/
<html><body><h1>This is producer instance 1</h1>
</body></html>
<username>@consumer-instance-1:~$ curl http://$producerip2/nginx/
<html><body><h1>This is producer instance 2</h1>
</body></html>

لنحاول الآن إنشاء العديد من الاتصالات المتوازية لأحد مثيلات المثيل عن طريق تشغيل curl خلال تكرار حلقي. تذكر أن Cloud NAT لا تسمح بإعادة استخدام المقابس المغلقة لمدة دقيقتين. وبالتالي، طالما أنه يمكننا تكرار جميع محاولات الاتصال خلال دقيقتين، يمكننا محاكاة الاتصالات المتوازية بهذه الطريقة.

شغِّل الأمر التالي في جلسة بروتوكول النقل الآمن للمثيل

while true; do for i in {1..64}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

تتوقع أن تتمكن بنجاح من فتح 64 اتصالاً متوازيًا ويجب أن يطبع النص البرمجي ما يلي

Connection # 64 successful

Loop Done, Sleeping for 150s
Connection # 64 successful

Loop Done, Sleeping for 150s

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

while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

يمكنك الآن توقع الناتج التالي

Connection # 64 successful
Connection # 65 failed
Connection # 66 failed
Connection # 67 failed
Connection # 68 failed
Connection # 69 failed
Connection # 70 failed

Loop Done, Sleeping for 150s

يشير ذلك إلى أنّه على الرغم من نجاح أول 64 اتصالاً، تعذّر إتمام الاتصالات الستة المتبقية بسبب عدم توفُّر المنافذ.

لنفعل ذلك بعد ذلك، ثم اخرج من واجهة مستخدم بروتوكول النقل الآمن (SSH) وسنفعّل DPA في القسم التالي.

8. تفعيل "تعديل بنود معالجة البيانات" والتحقق من سلوكه

شغِّل الأمر gcloud التالي الذي يفعِّل "تعديل بنود معالجة البيانات"، ويضبط الحد الأدنى لتخصيص المنفذ لكل جهاز افتراضي على 64، والحد الأقصى لتخصيص المنفذ على 1024.

gcloud alpha compute routers nats update consumer-nat-gw --router=consumer-cr \
--region=us-east4 --min-ports-per-vm=64 --max-ports-per-vm=1024 \
--enable-dynamic-port-allocation

ما يؤدي إلى ما يلي

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

والآن، أعِد تشغيل get-nat-mapping-info للتأكّد من أنّه لا يزال يتوفر في كلتا النسختين 64 منفذًا فقط.

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

ناتج النموذج (مقتطَع للإيجاز)

---
instanceName: consumer-instance-1
...
  - <NAT Consumer IP1>:1024-1055
  numTotalNatPorts: 32
...
- natIpPortRanges:
  - <NAT Consumer IP1>:32768-32799
  numTotalNatPorts: 32
...
---
instanceName: consumer-instance-2
...
  - <NAT Address IP1>:1056-1087
  numTotalNatPorts: 32
...
  - <NAT Address IP1>:32800-32831
  numTotalNatPorts: 32
...

لم يحدث أي تغيير كبير في ما يتعلق بتخصيصات المنافذ لأنّ المثيل لا يستخدم أي منافذ بشكل نشط حتى الآن.

لنعد إلى المثيل من خلال بروتوكول النقل الآمن:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

أعِد تصدير متغيّرات بيئة عنوان IP للمنتج.

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

وأعد تشغيل التكرار الحلقي السابق لمحاكاة الاتصالات المتوازية:

while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

يجب أن يظهر لنا الآن الناتج التالي

Connection # 64 successful
Connection # 65 failed

Connection # 66 failed
Connection # 70 successful
Loop Done, Sleeping for 150s

ما الذي حدث هنا؟ تزيد آلية Cloud NAT (ترجمة عنوان الشبكة) في السحابة الإلكترونية من تخصيص المنافذ حسب استخدام المنافذ، إلا أنّ عملية برمجتها عبر طبقة الشبكة هذه تستغرق بعض الوقت. ومن ثم نرى من 1 إلى 3 مهلات اتصال قبل أن نكمل بقية محاولات الاتصال بنجاح.

لقد حدّدنا مهلة صارمة للتجعد (5 ثوانٍ)، ولكن من المفترض أن تتمكّن التطبيقات ذات المهلات الأطول من إكمال الاتصالات بنجاح، بينما تعمل "تعديل بنود معالجة البيانات" على زيادة تخصيصات المنافذ.

يمكن رؤية سلوك الزيادة هذا بشكل أكثر وضوحًا عند تشغيل التكرار الحلقي لمحاولات الاتصال 1024 مثل ذلك

while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

نتوقع الآن الحصول على النتائج التالية

Connection # 64 successful
Connection # 65 failed

Connection # 66 failed
Connection # 129 successful
Connection # 130 failed

Connection # 131 failed
Connection # 258 successful
Connection # 259 failed

Connection # 260 failed
Connection # 515 successful
Connection # 516 failed

Connection # 1024 successful
Loop Done, Sleeping for 150s

ولأنّ Cloud NAT تخصّص منافذ بقوة 2 منفذ، ما يؤدي إلى مضاعفة التخصيصات في كل خطوة بشكل أساسي، فإننا نرى مهلات الاتصال بارزة حول القوى 2 بين 64 و1024.

نظرًا لضبط maxPortsPerVM على 1024، لا نتوقع أن نتمكن من إجراء أكثر من 1024 اتصال. يمكننا اختبار ذلك من خلال إعادة تشغيل حلقة التجفيف مع عدد أعلى من 1024 (بعد الانتظار لمدة دقيقتين لإعادة ضبط المنافذ القديمة).

while true; do for i in {1..1035}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

وكما هو متوقع، تُظهر النتائج أنّ الاتصالات خارج نطاق 1024 تبدأ بتعذُّر الاتصال.

<truncated output>
...
Connection # 1028 successful
Connection # 1029 failed
Connection # 1030 failed
Connection # 1031 failed
Connection # 1032 failed
Connection # 1033 failed
Connection # 1034 failed
Connection # 1035 failed
...
Loop Done, Sleeping for 150s

من خلال ضبط maxPortsPerVM على 1024، أصدرنا تعليمات لـ Cloud NAT بعدم توسيع نطاق تخصيصات المنافذ مطلقًا إلى ما هو أبعد من 1024 لكل جهاز افتراضي.

إذا خرجنا من جلسة بروتوكول النقل الآمن (SSH) وأعدنا تشغيل get-nat-mapping-info بسرعة كافية، يمكننا ملاحظة تخصيص المنافذ الإضافية.

gcloud  compute routers get-nat-mapping-info consumer-cr --region=us-east4

ولاحظ الناتج التالي

---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1024-1055
  - <NAT Address IP1>1088-1119
  -<NAT Address IP1>:1152-1215
  - <NAT Address IP1>:1280-1407
  - <NAT Address IP1>:1536-1791
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 512
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
  - <NAT Address IP1>:32768-32799
  - <NAT Address IP1>:32832-32863
  - <NAT Address IP1>:32896-32959
  - <NAT Address IP1>:33024-33151
  - <NAT Address IP1>:33536-33791
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 512
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
---
instanceName: consumer-instance-2
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1056-1087
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3
- natIpPortRanges:
  - <NAT Address IP1>:32800-32831
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3

لاحِظ أنّه تم تخصيص 1024 منفذًا لـ consumer-instance-1، ولكن تم تخصيص 64 منفذًا فقط في consumer-instance-2. لم يكن ذلك ممكنًا بسهولة قبل تعديل معالجة البيانات، وهو يسلط الضوء على فعالية تعديل معالجة البيانات (DPA) لخدمة Cloud NAT.

في حال الانتظار لمدة دقيقتين قبل إعادة تشغيل الأمر get-nat-mapping-info، ستلاحظ رجوع consumer-instance-1 إلى الحد الأدنى لقيمة 64 منفذًا فقط وهو مخصّص. لا يقتصر دور "هيئة حماية البيانات" على توضيح قدرة "هيئة حماية البيانات" على زيادة تخصيصات المنافذ، بل أيضًا تحريرها عندما لا تكون قيد الاستخدام بغرض الاستخدام المحتمل من قِبل مثيلات أخرى وراء بوابة NAT نفسها.

9. اختبار قواعد Cloud NAT باستخدام تعديل معالجة البيانات (DPA)

لقد طرحنا مؤخرًا وظيفة قواعد "ترجمة عنوان الشبكة" (NAT) في Cloud NAT، ما يتيح للعملاء كتابة قواعد تستخدم عناوين IP محددة خاصة بترجمة عنوان الشبكة (NAT) لوجهات خارجية معيّنة. لمزيد من المعلومات، يُرجى الرجوع إلى صفحة المستندات الخاصة بقواعد NAT.

في هذا التمرين، نلاحظ التفاعل بين قواعد هيئة حماية البيانات (DPA) وقواعد NAT (ترجمة عنوان الشبكة). لنبدأ أولاً بتعريف قاعدة NAT لاستخدام nat-address-2 عند الوصول إلى producer-address-2.

قم بتشغيل الأمر gcloud التالي، والذي ينشئ قاعدة NAT باستخدام

gcloud alpha compute routers nats rules create 100 \
 --match='destination.ip == "'$producerip2'"' \
 --source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

يجب أن تتوقع النتيجة التالية

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

والآن، لنعيد تشغيل get-nat-mapping-info لمعرفة تأثير قاعدة NAT الجديدة.

gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4

ما الذي يجب أن ينتج عنه ما يلي

---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1024-1055
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:1024-1055
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
  - <NAT Address IP1>:32768-32799
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:32768-32799
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2

يُرجى العلم أنّ لدينا الآن منافذ إضافية مخصّصة (وهو 64 أيضًا، وهو الحدّ الأدنى المحدَّد) خصيصًا لـ nat-address-2 ضمن التسلسل الهرمي ruleMappings.

إذًا، ماذا يحدث إذا فتح أحد المثيلات العديد من الاتصالات إلى الوجهة المحددة بواسطة قاعدة NAT؟ هيا نطّلع على الإجابة.

لنعد إلى المثيل من خلال بروتوكول النقل الآمن:

gcloud compute ssh consumer-instance-1 --zone=us-east4-a

أعِد تصدير متغيّرات بيئة عنوان IP للمنتج.

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

لنعيد الآن تنفيذ حلقة curl على شاشة producerip2 هذه المرة.

while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip2/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done

يجب أن تتوقع نتيجة مشابهة لما يلي

Connection # 64 successful
Connection # 65 failed

Connection # 66 failed
Connection # 129 successful
Connection # 130 failed

Connection # 131 failed
Connection # 258 successful
Connection # 259 failed

Connection # 260 failed
Connection # 515 successful
Connection # 516 failed

Connection # 1024 successful
Loop Done, Sleeping for 150s

النسخ المطابق للاختبار السابق بشكل أساسي. لنخرج من جلسة SSH للمثيل ونلقي نظرة على تعيينات nat مرة أخرى.

gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4

ما الذي يجب أن ينتج عنه ما يلي

---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1024-1055
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:1024-1055
    - <NAT Address IP2>:1088-1119
    - <NAT Address IP2>:1152-1215
    - <NAT Address IP2>:1280-1407
    - <NAT Address IP2>:1536-1791
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 512
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
  - <NAT Address IP1>:32768-32799
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:32768-32799
    - <NAT Address IP2>:32832-32863
    - <NAT Address IP2>:32896-32959
    - <NAT Address IP2>:33024-33151
    - <NAT Address IP2>:33280-33535
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 512
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
---
instanceName: consumer-instance-2
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1056-1087
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:1056-1087
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3
- natIpPortRanges:
  - <NAT Address IP1>:32800-32831
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:32800-32831
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.3

---
instanceName: consumer-instance-1
interfaceNatMappings:
- natIpPortRanges:
  - <NAT Address IP1>:1024-1055
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:1024-1055
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2
- natIpPortRanges:
  - <NAT Address IP1>:32768-32799
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  ruleMappings:
  - natIpPortRanges:
    - <NAT Address IP2>:32768-32799
    numTotalDrainNatPorts: 0
    numTotalNatPorts: 32
    ruleNumber: 100
  sourceAliasIpRange: ''
  sourceVirtualIp: 10.0.0.2

يمكنك ملاحظة ما سبق، أنّ عنوان IP التلقائي لبروتوكول NAT في consumer-instance-1 ( عنوان IP لـ nat-address-1) لا يزال يتضمّن 64 منفذًا فقط، ولكنّ عنوان IP لقاعدة NAT (عنوان IP لـ nat-address-2) تم تخصيص 1024 منفذًا له. وفي الوقت نفسه، احتفظت السياسة consumer-instance-2 بتخصيصاتها التلقائية، وهي 64 منفذًا لجميع عناوين IP الخاصة بترجمة عنوان الشبكة (NAT).

كتمرين، يمكنك اختبار الحالة العكسية. اسمح لـ Cloud NAT بالتعامل مع جميع المنافذ الإضافية، ثم فعِّل حلقة التجعيد مقابل producerip1 ولاحظ التأثيرات على ناتج get-nat-mapping-info

10. خطوات التنظيف

لتجنُّب تحصيل الرسوم المتكرّرة، عليك حذف جميع الموارد المرتبطة بهذا الدرس التطبيقي حول الترميز.

يجب أولاً حذف جميع النُسخ الافتراضية.

من Cloud Shell:

gcloud compute instances delete consumer-instance-1 consumer-instance-2 \
 producer-instance-1 producer-instance-2 \
 --zone us-east4-a --quiet

الناتج المتوقع :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-2].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].

بعد ذلك، احذف Cloud Router. من Cloud Shell:

gcloud compute routers delete consumer-cr \
 --region us-east4 --quiet

يجب أن تتوقع النتيجة التالية :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].

تحرير جميع عناوين IP الخارجية من Cloud Shell:

gcloud compute addresses delete nat-address-1 \
 nat-address-2 producer-address-1 \
 producer-address-2 --region us-east4 --quiet

يجب أن تتوقع النتيجة التالية :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

احذف قواعد جدار الحماية من سحابة VPC. من Cloud Shell:

gcloud compute firewall-rules delete consumer-allow-iap \
 producer-allow-80 --quiet

يجب أن تتوقع النتيجة التالية :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80].

حذف الشبكات الفرعية. من Cloud Shell:

gcloud compute networks subnets delete cons-net-e4 \
 prod-net-e4 --region=us-east4 --quiet

يجب أن تتوقع النتيجة التالية :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4].

أخيرًا، لنحذف وحدات سحابة VPC. من Cloud Shell:

gcloud compute networks delete consumer-vpc \
 producer-vpc --quiet

يجب أن تتوقع النتيجة التالية :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].

11. تهانينا

لقد أكملت برنامج Cloud NAT DPA Lab.

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

  • كيفية إعداد بوابة ترجمة عنوان الشبكة في السحابة الإلكترونية استعدادًا لتعديل معالجة البيانات (DPA).
  • كيفية فحص تخصيصات المنافذ بدون تعديل بنود معالجة البيانات
  • كيفية تفعيل وضبط تعديل معالجة البيانات (DPA) لبوابة NAT.
  • كيفية مراقبة تأثيرات "تعديل بنود معالجة البيانات" من خلال تشغيل وصلات مخرج موازٍ
  • كيفية إضافة قواعد NAT إلى بوابة NAT مع تفعيل تعديل معالجة البيانات (DPA).
  • كيفية الاطّلاع على سلوك "تعديل بنود معالجة البيانات" باستخدام القواعد من خلال تنفيذ اتصالات مخارج إلى وجهات متعددة

الخطوات التالية

©Google, Inc. أو الشركات التابعة لها. جميع الحقوق محفوظة. يُرجى عدم توزيعها.