การใช้กฎ Cloud NAT

1. ภาพรวม

Cloud NAT เป็นเครื่องมือที่มีประสิทธิภาพ ซึ่งช่วยให้เวิร์กโหลด Compute Engine และ Google Kubernetes Engine (GKE) เข้าถึงทรัพยากรบนอินเทอร์เน็ตได้อย่างปลอดภัยและปรับขนาดได้ โดยไม่ต้องเปิดเผยเวิร์กโหลดที่ทำงานบนทรัพยากรเหล่านั้นให้เข้าถึงจากภายนอกโดยใช้ IP ภายนอก

Cloud NAT มีการออกแบบที่ไม่ต้องใช้พร็อกซี โดยจะใช้ NAT ที่เลเยอร์ Andromeda SDN โดยตรง ดังนั้น เวิร์กโหลดจึงไม่ได้รับผลกระทบด้านประสิทธิภาพ และจะปรับขนาดได้อย่างง่ายดายไปยัง VM, ภูมิภาค และ VPC จำนวนมาก

กฎ NAT เป็นส่วนขยายของ Cloud NAT ฟีเจอร์กฎ NAT ใน Cloud NAT ช่วยให้คุณสร้างกฎการเข้าถึงที่กำหนดวิธีใช้ Cloud NAT เพื่อเชื่อมต่อกับอินเทอร์เน็ตได้ ปัจจุบันกฎ NAT รองรับการเลือกที่อยู่ NAT ต้นทางตามที่อยู่ปลายทาง

หากไม่มีกฎ NAT VM ที่เปิดใช้ Cloud NAT จะใช้ชุดที่อยู่ IP ของ NAT ชุดเดียวกันเพื่อเข้าถึงที่อยู่อินเทอร์เน็ตทั้งหมด

ในบางครั้ง Use Case ของ NAT อาจกำหนดให้ Cloud NAT ใช้ที่อยู่ IP ต้นทางที่แตกต่างกันสำหรับปลายทางที่เฉพาะเจาะจง กฎ NAT จะกำหนดการจับคู่และการดำเนินการที่เกี่ยวข้อง เมื่อระบุกฎ NAT แล้ว ระบบจะจับคู่แพ็กเก็ตกับกฎ NAT แต่ละกฎ หากตรงกับกฎ ระบบจะดำเนินการที่สอดคล้องกับการจับคู่ดังกล่าว

ดูข้อมูลเพิ่มเติมได้ที่ส่วนเอกสารประกอบเกี่ยวกับกฎ NAT

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าเกตเวย์ Cloud NAT เพื่อเตรียมพร้อมสำหรับกฎ NAT
  • วิธีออกแบบกฎ NAT โดยใช้ Common Expression Language (CEL)
  • วิธีสร้างกฎ NAT และแนบกฎกับเกตเวย์ NAT
  • วิธีทดสอบกฎ NAT จากอินสแตนซ์
  • วิธีอัปเดตกฎของ NAT Gateway
  • วิธีลบกฎ NAT และเปลี่ยนกลับไปใช้ลักษณะการทำงานเริ่มต้นของ Cloud NAT

สิ่งที่คุณต้องมี

  • ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine
  • ความรู้พื้นฐานด้านเครือข่ายและ TCP/IP
  • ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
  • การทัวร์ระบบเครือข่ายใน GCP เช่น แล็บระบบเครือข่ายใน Google Cloud จะช่วยให้คุณเข้าใจได้ดียิ่งขึ้น
  • ความเข้าใจพื้นฐานของ Cloud NAT

2. การใช้ Google Cloud Console และ Cloud Shell

หากต้องการโต้ตอบกับ GCP เราจะใช้ทั้ง 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 ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เมื่อตั้งค่าแล้วจะเปลี่ยนไม่ได้) คอนโซลระบบคลาวด์จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (และโดยทั่วไปจะระบุเป็น PROJECT_ID) ดังนั้นหากไม่ชอบรหัสนี้ ให้สร้างรหัสแบบสุ่มอีกรหัส หรือคุณจะลองใช้รหัสของคุณเองและดูว่ามีรหัสนั้นหรือไม่ก็ได้ จากนั้นจะ "หยุด" เมื่อสร้างโปรเจ็กต์แล้ว
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

bce75f34b2c53987.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

f6ef2b5f13479f3a.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในห้องทดลองนี้ได้โดยใช้เพียงเบราว์เซอร์

3. การตั้งค่าห้องทดลอง

สำหรับแล็บนี้ คุณจะใช้โปรเจ็กต์และสร้าง VPC 2 รายการที่มีซับเน็ตในแต่ละรายการ คุณจะจองที่อยู่ IP ภายนอก จากนั้นสร้างและกำหนดค่าเกตเวย์ Cloud NAT (พร้อม Cloud Router) อินสแตนซ์ผู้ผลิต 2 รายการ รวมถึงอินสแตนซ์ผู้บริโภค หลังจากตรวจสอบลักษณะการทำงานเริ่มต้นของ Cloud NAT แล้ว คุณจะสร้างกฎที่กำหนดเองของ Cloud NAT และตรวจสอบลักษณะการทำงานของกฎเหล่านั้น

ภาพรวมสถาปัตยกรรมเครือข่าย

815147de3de0bd19.png

4. จองที่อยู่ IP ภายนอก

มาจองที่อยู่ IP ภายนอกทั้งหมดที่จะใช้ในแล็บนี้กัน ซึ่งจะช่วยให้คุณเขียนกฎ NAT และไฟร์วอลล์ที่เกี่ยวข้องทั้งหมดในทั้ง 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 สาธารณะ 2 รายการ ได้แก่ "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

ขั้นตอนถัดไปคือการสร้างอินสแตนซ์ของโปรดิวเซอร์ 2 ราย

อินสแตนซ์ผู้ผลิตจะเรียกใช้บริการ IP Echo ในคอนเทนเนอร์ Docker ที่มีอยู่ใน Docker Hub (ซอร์สโค้ดอยู่ในที่เก็บ GitHub ของผู้เขียนบริการ)

เราจะใช้ฟีเจอร์การติดตั้งใช้งานคอนเทนเนอร์ใน Compute Engine เพื่อจัดสรรอินสแตนซ์อย่างรวดเร็วด้วยซอฟต์แวร์ที่จำเป็นทั้งหมด

เราจะจัดสรรที่อยู่ IP ที่สงวนไว้ที่แตกต่างกันให้กับแต่ละอินสแตนซ์เพื่อให้เขียนกฎ NAT ได้

สร้างอินสแตนซ์แรก จาก 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

จากนั้นสร้างอินสแตนซ์ที่ 2 จาก 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 และซับเน็ตแล้ว เราจะเพิ่มกฎไฟร์วอลล์ขาเข้าแบบง่ายเพื่ออนุญาต IAP สำหรับช่วง IP ต้นทางของ TCP ซึ่งจะช่วยให้เรา SSH ไปยังอินสแตนซ์ผู้ใช้ได้โดยตรงโดยใช้ 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 Gateway เราต้องสร้างอินสแตนซ์ Cloud Router ก่อน (เราใช้หมายเลข ASN ส่วนตัว แต่ไม่เกี่ยวข้องกับกิจกรรมใน Lab นี้) จาก 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 ของผู้ผลิตที่สงวนไว้ที่นี่เพื่อให้สามารถอ้างอิง 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" สำหรับการสื่อสารกับที่อยู่ภายนอกทั้งหมด

มาตรวจสอบลักษณะการทำงานนี้ก่อนที่จะใช้ฟีเจอร์กฎ NAT ใหม่ใน 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 ไปยังอินสแตนซ์ของ Producer ทั้ง 2 รายการและสังเกตที่อยู่ IP ต้นทางที่ส่งคืน

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

คุณควรเห็นที่อยู่ IP เดียวกันที่แสดงสำหรับทั้ง 2 ปลายทาง ซึ่งเท่ากับค่าของ IP ภายนอกที่สงวนไว้ "nat-address-1"

ในทำนองเดียวกัน การใช้ 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 กลับหลังจากกำหนดค่ากฎ NAT แล้ว

8. สร้างกฎ Cloud NAT

กฎ NAT เขียนขึ้นโดยใช้ไวยากรณ์ Common Expression Language ดูข้อมูลเพิ่มเติมเกี่ยวกับภาษาของนิพจน์กฎได้ที่ภาษาของนิพจน์กฎ

คุณยังเพิ่มกฎ NAT ไปยัง NAT Gateway ที่มีอยู่ได้โดยใช้คำสั่ง gcloud เราจะดูทั้ง 2 ตัวเลือกเพื่อสร้างกฎ 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 Gateway ที่มีอยู่โดยใช้ไฟล์กฎนี้กัน จาก 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" แสดงเป็น "IN_USE" หากต้องการดู ให้เรียกใช้คำสั่งนี้จาก 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 ไปยังอินสแตนซ์ของ Producer ทั้ง 2 รายการและสังเกตที่อยู่ IP ต้นทางที่ส่งคืน

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

ตอนนี้คุณควรเห็นที่อยู่ IP ที่แตกต่างกันสำหรับทั้ง 2 จุดปลายทาง โดยที่อยู่ IP แรกควรเหมือนกับลักษณะการทำงานเริ่มต้น ที่อยู่ IP ที่ 2 ควรเท่ากับ "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 Gateway ที่มีอยู่โดยใช้ไฟล์กฎนี้กัน จาก 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 อีกต่อไป ให้ใช้คำสั่งอธิบายเกตเวย์ 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

โปรดสังเกตว่าไม่มีส่วน "rules:" ในเอาต์พุต 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 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 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 โดยใช้ Common Expression Language (CEL)
  • วิธีสร้างกฎ NAT และแนบกฎกับเกตเวย์ NAT
  • วิธีทดสอบกฎ NAT จากอินสแตนซ์
  • วิธีอัปเดตกฎของ NAT Gateway
  • วิธีลบกฎ NAT และเปลี่ยนกลับไปใช้ลักษณะการทำงานเริ่มต้นของ Cloud NAT

ขั้นตอนถัดไป

  • ทดลองสร้างกฎ NAT ที่ซับซ้อนมากขึ้น เช่น ตัวอย่างนี้
  • สำรวจการระบายที่อยู่ IP ของ NAT และสังเกตผลกระทบต่อการเชื่อมต่อ
  • ดูข้อมูลเพิ่มเติมเกี่ยวกับเครือข่ายใน Google Cloud Platform

©Google, Inc. หรือบริษัทในเครือ สงวนลิขสิทธิ์ ห้ามเผยแพร่