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.
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي عبارة عن سلسلة أحرف لا تستخدمها Google APIs، ويمكنك تحديثها في أي وقت.
- يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الرجوع إلى رقم تعريف المشروع (والذي يتم تحديده عادةً على أنّه
PROJECT_ID
). لذلك، إذا لم يعجبك، يمكنك إنشاء رقم تعريف عشوائي آخر أو يمكنك تجربة رقم تعريف المشروع الخاص بك ومعرفة ما إذا كان متاحًا. بعد ذلك تكون الحالة "مجمّدة". بعد إنشاء المشروع. - هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد أكثر من هذا البرنامج التعليمي، اتبع أي عملية "تنظيف". التعليمات الموجودة في نهاية الدرس التطبيقي حول الترميز. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.
من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا التمرين من خلال متصفح.
3- إعداد التمرين المعملي
ستستخدم مشروعًا في هذا التمرين المعملي وتنشئ شبكتي VPC مع شبكة فرعية في كل منهما. ستحجز عناوين IP خارجية، ثم تنشئ وتضبط مدخل ترجمة عنوان الشبكة (NAT) (باستخدام Cloud Router)، ومثيلين للمُنتِج، بالإضافة إلى مثيلين للمستهلك. بعد التحقّق من صحة سلوك "ترجمة عنوان الشبكة في السحابة الإلكترونية" التلقائي، ستفعِّل ميزة "التخصيص الديناميكي للمنفذ" وتتحقّق من سلوكها. وأخيرًا، ستقوم أيضًا بتهيئة قواعد NAT ومراقبة التفاعل بين قواعد DPA وقواعد NAT.
نظرة عامة على بنية الشبكات:
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).
- كيفية الاطّلاع على سلوك "تعديل بنود معالجة البيانات" باستخدام القواعد من خلال تنفيذ اتصالات مخارج إلى وجهات متعددة
الخطوات التالية
- تصفُّح صفحة مستندات تخصيص المنافذ الديناميكية
- جرِّب تعديل مهلات NAT وقيم تخصيص المنفذ باستخدام تطبيقك.
- مزيد من المعلومات عن الاتصال بالشبكات على Google Cloud Platform
©Google, Inc. أو الشركات التابعة لها. جميع الحقوق محفوظة. يُرجى عدم توزيعها.