استخدام قواعد "ترجمة عنوان الشبكة" (NAT) في السحابة الإلكترونية

1. نظرة عامة

‫Cloud NAT هي أداة فعّالة: من خلالها، يمكن لأحمال العمل في Compute Engine وGoogle Kubernetes Engine (GKE) الوصول إلى موارد الإنترنت بطريقة قابلة للتوسّع وآمنة، بدون تعريض أحمال العمل التي يتم تشغيلها عليها للوصول الخارجي باستخدام عناوين IP الخارجية.

تتميّز خدمة Cloud NAT بتصميم بدون وكيل، ما يتيح تنفيذ NAT مباشرةً في طبقة Andromeda SDN. وبالتالي، لن يتأثر أداء عبء العمل ويمكنك توسيعه بسهولة ليشمل العديد من الأجهزة الافتراضية والمناطق وشبكات VPC.

قواعد NAT هي إضافة إلى Cloud NAT. تتيح لك ميزة "قواعد NAT" في Cloud NAT إنشاء قواعد وصول تحدّد كيفية استخدام Cloud NAT للاتصال بالإنترنت. تتيح "قواعد ترجمة عنوان الشبكة" حاليًا اختيار عنوان ترجمة عنوان الشبكة المصدر استنادًا إلى عنوان الوجهة.

بدون قواعد NAT، تستخدم الآلة الافتراضية التي تم تفعيل Cloud NAT عليها المجموعة نفسها من عناوين IP الخاصة بآلية NAT للوصول إلى جميع عناوين الإنترنت.

في بعض الأحيان، تتطلّب حالة استخدام NAT أن تستخدم Cloud NAT عناوين IP مصدر مختلفة لوجهات معيّنة. تحدّد قاعدة NAT تطابقًا وإجراءً مطابقًا. بعد تحديد قواعد NAT، تتم مطابقة الحزمة مع كل قاعدة NAT. في حال تطابقت قاعدة، يتم تنفيذ الإجراء المتوافق مع هذا التطابق.

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

ما ستتعلمه

  • كيفية إعداد بوابة Cloud NAT استعدادًا لقواعد NAT
  • كيفية تصميم قواعد NAT باستخدام لغة التعبير الشائعة (CEL)
  • كيفية إنشاء قواعد NAT وربطها ببوابة NAT
  • كيفية اختبار قواعد NAT من إحدى الآلات الافتراضية
  • كيفية تعديل قواعد NAT Gateway
  • كيفية حذف قواعد NAT والرجوع إلى السلوك التلقائي لخدمة Cloud NAT

المتطلبات

  • معرفة أساسية بخدمة Google Compute Engine
  • معرفة أساسية بالشبكات وبروتوكول TCP/IP
  • معرفة أساسية بسطر الأوامر في نظامَي Unix وLinux
  • من المفيد أن تكون قد أكملت جولة في الاتصال بالشبكات في Google Cloud Platform، مثل مختبر الاتصال بالشبكات في Google Cloud.
  • فهم أساسيات Cloud NAT

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. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • اسم المشروع هو المعرّف الشخصي لهذا المشروع. طالما أنّك تلتزم باصطلاحات التسمية، يمكنك استخدام أي شيء تريده وتعديله في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Cloud تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم الجلسات التدريبية المبرمَجة، ستحتاج إلى الرجوع إلى رقم تعريف المشروع (ويتم تحديده عادةً على أنّه PROJECT_ID)، لذا إذا لم يعجبك، يمكنك إنشاء رقم آخر عشوائي، أو يمكنك تجربة رقمك الخاص ومعرفة ما إذا كان متاحًا. ثم يتم "تجميده" بعد إنشاء المشروع.
  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، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا التمرين المعملي باستخدام متصفّح فقط.

3- إعداد الدرس التطبيقي

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

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

815147de3de0bd19.png

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

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

من Cloud Shell:

gcloud compute addresses  create nat-address-1 nat-address-2 nat-address-3 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/nat-address-3].
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 natip3=`gcloud compute addresses list --filter name:nat-address-3 --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>
natip3=<NAT IP 3>

5- إعداد شبكة VPC ومثيلاتها الخاصة بالمنتج

سننشئ الآن المراجع الخاصة بمراجع المنتج. ستوفّر المثيلات التي تعمل في شبكة VPC الخاصة بالمنتج الخدمة المتاحة للإنترنت باستخدام عنوانَي IP عامَّين هما "producer-address-1" و "producer-address-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 producer-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/producer-e4].
NAME              REGION       NETWORK       RANGE
producer-e4       us-east4  producer-vpc  10.0.0.0/24

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

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

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

إخراج:

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

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

ستشغّل مثيلات المنتج خدمة صدى IP في حاوية Docker متاحة على Docker Hub (يتوفّر رمز المصدر في مستودع GitHub الخاص بمؤلف الخدمة).

لتوفير المثيلات بسرعة باستخدام جميع البرامج المطلوبة، سنستخدم ميزة نشر الحاويات على Compute Engine.

لكي تتمكّن من كتابة قواعد NAT، سنوفّر لكل آلة افتراضية عنوان IP محجوزًا مختلفًا.

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

gcloud compute instances create-with-container producer-instance-1 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

إخراج:

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 IP 1>  RUNNING

بعد ذلك، أنشئ المثيل الثاني. من Cloud Shell:

gcloud compute instances create-with-container producer-instance-2 \
 --zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

إخراج:

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 IP 2>  RUNNING

6. إعداد شبكة VPC للمستهلك وCloud NAT والمثيل

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

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

بعد ذلك، سننشئ بوابة Cloud NAT بسيطة في وضع التخصيص اليدوي والعنوان المحجوز "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 producer-vpc --allow tcp:22,tcp:3389,icmp

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

gcloud compute networks subnets create consumer-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/consumer-e4].
NAME              REGION       NETWORK       RANGE
consumer-e4       us-east4  consumer-vpc  10.0.0.0/24

بعد ذلك، لننشئ قواعد جدار حماية لشبكة VPC للسماح لنطاقات عناوين IAP بالوصول إلى أجهزة المستهلك الافتراضية على المنفذ 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

قبل إنشاء بوابة NAT، علينا إنشاء مثيل Cloud Router أولاً (نستخدم رقم نظام مستقل خاص، ولكنّه غير ذي صلة بأنشطة هذا المختبر). من 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.

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

gcloud compute instances create consumer-instance --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=consumer-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].
NAME               ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance  us-east4-a  e2-medium                  10.0.0.2                  RUNNING

7. التحقّق من السلوك التلقائي لخدمة Cloud NAT

في هذه المرحلة، يستخدم مثيل المستهلك سلوك Cloud NAT التلقائي الذي يستخدم عنوان IP المحجوز نفسه "nat-address-1" للتواصل مع جميع العناوين الخارجية.

لنبدأ بالتحقّق من صحة هذا السلوك قبل استخدام ميزة "قواعد ترجمة عناوين الشبكة" الجديدة في Cloud NAT.

استخدِم بروتوكول SSH للدخول إلى مثيل المستهلك. من Cloud Shell:

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

من المفترض أن تكون الآن في واجهة الأوامر الخاصة بالجهاز الظاهري.

مثال على الناتج (تم اقتطاع الناتج الكامل للإيجاز)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

من داخل مثيل المستهلك، لنبدأ أولاً باسترداد عناوين 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 مع كلتا مثيلتَي المنتج وراقِب عنوان IP المصدر الذي تم عرضه.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.136.8.83

من المفترض أن يظهر عنوان IP نفسه في كلتا نقطتَي النهاية، وهو يساوي قيمة عنوان IP المحجوز الخارجي "nat-address-1".

وبالمثل، يجب أن يعرض طلب curl إلى أي خدمة خارجية لعكس عنوان IP خارجي العنوان نفسه، على سبيل المثال:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

اخرج من جلسة SSH الخاصة بالجهاز الافتراضي في الوقت الحالي، وسنعود إلى SSH بعد ضبط قواعد NAT.

8. إنشاء قواعد Cloud NAT

تتم كتابة قواعد NAT باستخدام بنية لغة التعبير الشائعة. لمزيد من المعلومات عن لغة تعبير القاعدة، يُرجى الاطّلاع على لغة تعبير القاعدة.

يمكنك أيضًا إضافة قاعدة NAT إلى بوابة NAT حالية باستخدام أوامر gcloud. سنتعرّف على كلا الخيارين لإنشاء قواعد Cloud NAT.

لنبدأ بإنشاء ملف YAML لقاعدة NAT.

من Cloud Shell:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
EOF

بعد ذلك، لنعدّل بوابة NAT الحالية باستخدام ملف القواعد هذا. من Cloud Shell:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

من المفترض أن يظهر لك الناتج التالي :

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

تأكَّد من إعداد القاعدة بنجاح. من Cloud Shell:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4

من المفترض أن يظهر لك الناتج التالي :

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

لنحاول إعادة إنشاء القاعدة نفسها باستخدام أوامر gcloud فقط. عليك أولاً حذف القاعدة الحالية. من Cloud Shell:

gcloud alpha compute routers nats rules delete 100 \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --quiet

من المفترض أن يظهر لك الناتج التالي :

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

بعد ذلك، أعِد إنشاء القاعدة باستخدام أمر gcloud هذا. من Cloud Shell:

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

من المفترض أن يظهر لك الناتج التالي :

Creating Rule [100] in NAT [consumer-nat-gw]...done.

للتأكّد من إنشاء القاعدة بنجاح، كرِّر الأمر السابق. في هذه المرة، سنضيف خيار تنسيق YAML للاطّلاع على التفاصيل الكاملة للقاعدة.

من Cloud Shell:

gcloud alpha compute routers nats rules list\
 --nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4  --format=yaml

من المفترض أن يظهر لك الناتج التالي :

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2
match: destination.ip == <actual IP for producer-IP 2>
ruleNumber: 100

أخيرًا، لاحظ أنّ العنوانَين الخارجيَين "nat-address1" و "nat-address-2" يظهران الآن على أنّهما "قيد الاستخدام". للاطّلاع على ذلك، شغِّل الأمر التالي من Cloud Shell:

$ gcloud compute addresses list

من المفترض أن يظهر لك الناتج التالي (يجب أن تتطابق عناوين IP الفعلية مع العناوين التي حجزتها) :

NAME                ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION       SUBNET  STATUS
nat-address-1       34.136.8.83     EXTERNAL                    us-east4          IN_USE
nat-address-2       34.70.137.35    EXTERNAL                    us-east4          IN_USE
nat-address-3       34.135.103.88   EXTERNAL                    us-east4          RESERVED
producer-address-1  34.66.0.105     EXTERNAL                    us-east4          IN_USE
producer-address-2  35.192.142.134  EXTERNAL                    us-east4          IN_USE

9- التحقّق من سلوك قواعد Cloud NAT

في هذه المرحلة، يجب أن يستخدم مثيل المستهلك قاعدة Cloud NAT التي تم إنشاؤها لاستخدام nat-address-2 للتواصل مع producer-address-2.

لنؤكّد هذا السلوك. استخدِم بروتوكول SSH للدخول إلى مثيل المستهلك. من Cloud Shell:

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

من المفترض أن تكون الآن في واجهة الأوامر الخاصة بالجهاز الظاهري.

مثال على الناتج (تم اقتطاع الناتج الكامل للإيجاز)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

من داخل مثيل المستهلك، لنبدأ أولاً باسترداد عناوين 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 مع كلتا مثيلتَي المنتج وراقِب عنوان IP المصدر الذي تم عرضه.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.70.137.35

من المفترض أن يظهر لك الآن عنوان IP مختلف يتم عرضه لكلا نقطتَي النهاية، ويجب أن يكون عنوان IP الأول هو نفسه السلوك التلقائي. يجب أن يكون عنوان IP الثاني مساويًا لـ "nat-address-2" بعد إضافة قاعدة NAT الجديدة.

يجب أن يظلّ طلب curl إلى أي خدمة خارجية لعكس عنوان IP خارجي يعرض عنوان IP نفسه كما هو السلوك التلقائي، على سبيل المثال:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

اخرج من جلسة SSH الخاصة بالجهاز الافتراضي في الوقت الحالي، وسنعود إلى SSH لاختبار إيقاف العناوين.

10. تعديل قواعد Cloud NAT وحذفها

يمكنك تعديل قواعد Cloud NAT الحالية. على سبيل المثال، يمكنك ربط عناوين IP جديدة وإيقاف عناوين IP الحالية المرتبطة بالقواعد الحالية.

لنعدّل ملف قواعد NAT على النحو التالي

من Cloud Shell:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatDrainIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-3
EOF

يؤدي هذا الملف الجديد إلى وضع "nat-address-2" في حالة استنزاف. وأضِف "nat-address-3" في الحالة النشطة. من المفترض أن يسمح ذلك بإنهاء الاتصالات الحالية التي تستخدم nat-address-2 بشكل سليم، مع إنشاء اتصالات جديدة باستخدام nat-address-3 فقط.

بعد ذلك، لنعدّل بوابة NAT الحالية باستخدام ملف القواعد هذا. من Cloud Shell:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

من المفترض أن يظهر لك الناتج التالي :

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

تأكَّد من إعداد القاعدة بنجاح. من Cloud Shell:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --format=yaml

من المفترض أن يظهر لك الناتج التالي :

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3
  sourceNatDrainIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2
match: destination.ip == '35.192.142.134'
ruleNumber: 100

لاحظ كيف تم الآن وضع "nat-address-2" في حالة استنزاف. نترك لك مهمة التحقّق من أنّ الاتصالات الجديدة من شبكة VPC الخاصة بالمستهلك تستخدم الآن عناوين IP الصحيحة لترجمة عناوين الشبكة (NAT).

أخيرًا، لحذف قواعد NAT من بوابة Cloud NAT والعودة إلى السلوك التلقائي، اتّبِع الخطوات التالية: يمكنك استخدام أمر gcloud التالي. من Cloud Shell:

gcloud alpha compute routers nats rules delete 100 \
 --nat=consumer-nat-gw --router=consumer-cr \
 --router-region=us-east4 --quiet

من المفترض أن يظهر لك الناتج التالي :

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

للتحقّق من عدم توفّر المزيد من قواعد NAT، لنستخدِم الأمر describe الخاص ببوابة NAT

gcloud alpha compute routers nats describe consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

من المفترض أن يظهر لك الناتج التالي :

enableEndpointIndependentMapping: false
name: consumer-nat-gw
natIpAllocateOption: MANUAL_ONLY
natIps:
- https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1
sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES

لاحظ كيف لا يوجد قسم "القواعد:" في ملف YAML الناتج. يشير ذلك إلى عدم ضبط أي قواعد NAT.

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

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

عليك أولاً حذف جميع النُسخ.

من Cloud Shell:

gcloud compute instances delete consumer-instance \
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].
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 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 nat-address-3 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-8080 --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-8080].

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

gcloud compute networks subnets delete consumer-e4 \
producer-e4 --region=us-east4 --quiet

من المفترض أن يظهر لك الناتج التالي :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/consumer-e4].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/producer-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].

12. تهانينا!

لقد أكملت الدرس التطبيقي حول قواعد Cloud NAT.

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

  • كيفية إعداد بوابة Cloud NAT استعدادًا لقواعد NAT
  • كيفية تصميم قواعد NAT باستخدام لغة التعبير الشائعة (CEL)
  • كيفية إنشاء قواعد NAT وربطها ببوابة NAT
  • كيفية اختبار قواعد NAT من إحدى الآلات الافتراضية
  • كيفية تعديل قواعد NAT Gateway
  • كيفية حذف قواعد NAT والرجوع إلى السلوك التلقائي لخدمة Cloud NAT

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

  • جرِّب إنشاء قواعد NAT أكثر تعقيدًا، مثل هذا المثال
  • استكشاف عناوين IP الخاصة بترجمة عناوين الشبكة (NAT) التي يتم إيقافها ومراقبة تأثير الاتصال
  • مزيد من المعلومات حول الشبكات على Google Cloud Platform

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