Sử dụng quy tắc NAT Cloud

1. Tổng quan

Cloud NAT là một công cụ mạnh mẽ: nhờ đó, các tải công việc của Compute Engine và Google Kubernetes Engine (GKE) có thể truy cập vào các tài nguyên trên Internet theo cách có thể mở rộng quy mô và an toàn mà không để lộ các tải công việc đang chạy trên các tài nguyên đó cho quyền truy cập bên ngoài bằng cách sử dụng IP bên ngoài.

Cloud NAT có thiết kế không dùng proxy, triển khai NAT trực tiếp ở lớp SDN Andromeda. Do đó, khối lượng công việc của bạn không bị ảnh hưởng đến hiệu suất và có thể dễ dàng mở rộng quy mô sang nhiều VM, khu vực và VPC.

Quy tắc NAT là một tiện ích cho Cloud NAT. Tính năng Quy tắc NAT trong Cloud NAT cho phép bạn tạo các quy tắc truy cập để xác định cách Cloud NAT được dùng để kết nối với Internet. Hiện tại, Quy tắc NAT hỗ trợ lựa chọn địa chỉ NAT nguồn dựa trên địa chỉ đích.

Nếu không có Quy tắc NAT, một VM đã bật Cloud NAT sẽ dùng cùng một bộ địa chỉ IP NAT để truy cập vào tất cả các địa chỉ Internet.

Đôi khi, trường hợp sử dụng NAT yêu cầu Cloud NAT sử dụng các địa chỉ IP nguồn khác nhau cho những đích đến cụ thể. Quy tắc NAT xác định một điều kiện so khớp và hành động tương ứng. Sau khi bạn chỉ định các quy tắc NAT, gói sẽ được so khớp với từng quy tắc NAT. Nếu một quy tắc được khớp, thì hành động tương ứng với kết quả khớp đó sẽ diễn ra.

Để biết thêm thông tin, vui lòng xem phần Tài liệu về Quy tắc NAT .

Kiến thức bạn sẽ học được

  • Cách thiết lập một cổng NAT trên đám mây để chuẩn bị cho các quy tắc NAT.
  • Cách thiết kế Quy tắc NAT bằng Ngôn ngữ diễn đạt thông thường (CEL).
  • Cách tạo quy tắc NAT và đính kèm quy tắc đó vào một Cổng NAT.
  • Cách kiểm thử quy tắc NAT từ một phiên bản.
  • Cách cập nhật các quy tắc của Cổng NAT.
  • Cách xoá các quy tắc NAT và quay lại hành vi mặc định của Cloud NAT.

Bạn cần có

  • Kiến thức cơ bản về Google Compute Engine
  • Kiến thức cơ bản về mạng và TCP/IP
  • Kiến thức cơ bản về dòng lệnh Unix/Linux
  • Bạn nên hoàn thành một chuyến tham quan về mạng trong GCP, chẳng hạn như phòng thí nghiệm Mạng trong Google Cloud.
  • Hiểu kiến thức cơ bản về Cloud NAT.

2. Sử dụng Google Cloud Console và Cloud Shell

Để tương tác với GCP, chúng ta sẽ sử dụng cả Google Cloud Console và Cloud Shell trong suốt phòng thực hành này.

Bảng điều khiển Google Cloud

Bạn có thể truy cập vào Cloud Console tại https://console.cloud.google.com.

75eef5f6fd6d7e41.png

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Tên dự án là giá trị nhận dạng cá nhân của bạn cho dự án này. Miễn là tuân thủ quy ước đặt tên, bạn có thể sử dụng bất kỳ tên nào bạn muốn và có thể cập nhật tên đó bất cứ lúc nào.
  • Mã dự án phải là duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đặt). Bảng điều khiển Cloud sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Vì vậy, nếu không thích mã này, bạn có thể tạo một mã ngẫu nhiên khác hoặc thử mã của riêng mình để xem mã đó có dùng được hay không. Sau đó, tên này sẽ "được cố định" sau khi dự án được tạo.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Trên Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

bce75f34b2c53987.png

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

f6ef2b5f13479f3a.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn chỉ cần một trình duyệt là có thể thực hiện mọi thao tác trong phòng thí nghiệm này.

3. Thiết lập phòng thí nghiệm

Trong lớp học lập trình này, bạn sẽ sử dụng một Dự án và tạo 2 VPC có một mạng con trong mỗi VPC. Bạn sẽ đặt trước địa chỉ IP bên ngoài, sau đó tạo và định cấu hình một cổng Cloud NAT (với Cloud Router), hai phiên bản nhà sản xuất cũng như một phiên bản người dùng. Sau khi xác thực hành vi mặc định của Cloud NAT, bạn sẽ tạo các quy tắc tuỳ chỉnh cho Cloud NAT và xác thực hành vi của các quy tắc đó.

Tổng quan về cấu trúc mạng:

815147de3de0bd19.png

4. Dành riêng địa chỉ IP ngoài

Hãy dành riêng tất cả địa chỉ IP ngoài để sử dụng trong phòng thí nghiệm này. Điều này sẽ giúp bạn viết tất cả các quy tắc NAT và tường lửa có liên quan trong cả VPC của người dùng và nhà sản xuất.

Trong Cloud Shell:

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

Kết quả:

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].

Điền sẵn các địa chỉ IP đã được đặt trước dưới dạng biến môi trường.

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)"`

Không có đầu ra nào được mong đợi, nhưng để xác nhận rằng các địa chỉ đã được điền đúng cách. Hãy xuất các giá trị của tất cả các biến môi trường.

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

Kết quả:

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

5. Thiết lập VPC và các phiên bản của nhà sản xuất.

Bây giờ, chúng ta sẽ tạo các tài nguyên cho tài nguyên của nhà sản xuất. Các phiên bản đang chạy trong VPC của nhà sản xuất sẽ cung cấp dịch vụ hướng đến Internet bằng cách sử dụng hai IP công khai "producer-address-1" và "producer-address-2" .

Trước tiên, hãy tạo VPC. Trong Cloud Shell:

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

Kết quả:

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

Tiếp theo, hãy tạo mạng con trong us-east4. Trong Cloud Shell:

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

Kết quả:

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

Tiếp theo, hãy tạo các quy tắc về tường lửa VPC để cho phép các địa chỉ IP NAT truy cập vào các phiên bản nhà sản xuất trên cổng 8080.

Đối với quy tắc đầu tiên, từ Cloud Shell:

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

Kết quả:

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

Bước tiếp theo là tạo 2 thực thể nhà sản xuất.

Các phiên bản nhà sản xuất sẽ chạy dịch vụ phản hồi IP trong một vùng chứa Docker có trên Docker Hub (mã nguồn có trong kho lưu trữ GitHub của tác giả dịch vụ.

Để nhanh chóng cung cấp các phiên bản có tất cả phần mềm cần thiết, chúng ta sẽ sử dụng tính năng Triển khai vùng chứa trên Compute Engine.

Để có thể viết các quy tắc NAT, chúng tôi sẽ cung cấp cho mỗi phiên bản một địa chỉ IP dành riêng khác nhau.

Tạo phiên bản đầu tiên. Trong 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

Kết quả:

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

Sau đó, hãy tạo phiên bản thứ hai. Trong 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

Kết quả:

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. Thiết lập VPC người dùng, Cloud NAT và phiên bản

Bây giờ bạn đã tạo dịch vụ nhà sản xuất, đã đến lúc tạo VPC người dùng và cổng Cloud NAT của VPC đó.

Sau khi tạo VPC và mạng con, chúng ta sẽ thêm một quy tắc tường lửa đơn giản để cho phép IAP cho dải IP nguồn TCP. Điều này sẽ cho phép chúng tôi SSH đến các phiên bản người dùng trực tiếp bằng gcloud.

Sau đó, chúng ta sẽ tạo một cổng NAT trên đám mây đơn giản ở chế độ phân bổ thủ công và địa chỉ được đặt trước "nat-address-1" được liên kết với cổng này. Trong các phần tiếp theo của lớp học lập trình, chúng ta sẽ cập nhật cấu hình của cổng để thêm các quy tắc tuỳ chỉnh. .

Trước tiên, hãy tạo VPC. Trong Cloud Shell:

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

Kết quả:

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

Tiếp theo, hãy tạo một mạng con trong us-east4. Trong Cloud Shell:

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

Kết quả:

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

Tiếp theo, hãy tạo các quy tắc về tường lửa VPC để cho phép các địa chỉ trong dải IAP truy cập vào các phiên bản người dùng trên cổng 22.

Đối với quy tắc tường lửa đầu tiên, hãy chạy lệnh sau từ Cloud Shell:

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

Kết quả:

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

Trước khi tạo một cổng NAT, trước tiên, chúng ta cần tạo một phiên bản Cloud Router (Bộ định tuyến đám mây) (chúng ta sử dụng số ASN riêng tư nhưng số này không liên quan đến các hoạt động của phòng thí nghiệm này). Trong Cloud Shell:

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

Kết quả:

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

Sau đó, hãy tạo phiên bản cổng NAT. Trong 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

Kết quả:

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

Tạo phiên bản kiểm thử người tiêu dùng. Chúng tôi điền sẵn các IP của nhà sản xuất được đặt trước tại đây để có thể tham khảo chúng trong phiên bản sau này. Trong 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

Kết quả:

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. Xác minh hành vi mặc định của Cloud NAT

Tại thời điểm này, phiên bản người dùng sử dụng hành vi Cloud NAT mặc định, tức là sử dụng cùng một IP dành riêng "nat-address-1" để giao tiếp với tất cả các địa chỉ bên ngoài.

Trước tiên, hãy xác thực hành vi này trước khi sử dụng tính năng Quy tắc NAT mới trong Cloud NAT.

SSH vào phiên bản người dùng. Trong Cloud Shell:

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

Lúc này, bạn sẽ ở trong trình bao của phiên bản.

Đầu ra mẫu (đầu ra đầy đủ bị cắt bớt để ngắn gọn)

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:~$

Từ phiên bản người dùng, trước tiên, hãy tìm nạp cả IP của nhà sản xuất và điền chúng dưới dạng các biến môi trường

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"`

Sau đó, hãy thử curl đến cả hai phiên bản nhà sản xuất và quan sát địa chỉ IP nguồn được trả về.

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

Bạn sẽ thấy cùng một địa chỉ IP được trả về cho cả hai điểm cuối, bằng với giá trị của IP dành riêng bên ngoài "nat-address-1".

Tương tự, một lệnh curl đến bất kỳ dịch vụ phản xạ IP ngoài nào cũng phải cho thấy cùng một IP, ví dụ:

<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

Tạm thời thoát khỏi phiên SSH của phiên bản. Chúng ta sẽ SSH lại sau khi định cấu hình Quy tắc NAT.

8. Tạo quy tắc Cloud NAT

Các quy tắc NAT được viết bằng cú pháp Ngôn ngữ biểu thức chung. Để biết thêm thông tin về ngôn ngữ biểu thức quy tắc, hãy xem phần Ngôn ngữ biểu thức quy tắc.

Bạn cũng có thể thêm quy tắc NAT vào một cổng NAT hiện có bằng cách sử dụng các lệnh gcloud. Chúng ta sẽ tìm hiểu cả hai lựa chọn để tạo quy tắc Cloud NAT.

Trước tiên, hãy tạo một tệp YAML quy tắc NAT.

Trong 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

Sau đó, hãy cập nhật cổng NAT hiện có bằng tệp quy tắc này. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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

Xác thực rằng bạn đã định cấu hình thành công quy tắc. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

Hãy thử tạo lại quy tắc tương tự chỉ bằng các lệnh gcloud. Trước tiên, hãy xoá quy tắc hiện có. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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

Sau đó, hãy tạo lại quy tắc bằng lệnh gcloud này. Trong 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

Bạn sẽ thấy kết quả sau :

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

Để xác thực rằng quy tắc đã được tạo thành công, hãy lặp lại lệnh trước đó. Lần này, chúng ta sẽ thêm công tắc định dạng YAML để xem toàn bộ thông tin chi tiết về quy tắc.

Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

---
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

Cuối cùng, hãy lưu ý rằng hiện cả địa chỉ bên ngoài "nat-address1" và "nat-address-2" đều hiển thị là "IN_USE". Để xem thông tin đó, hãy chạy lệnh sau trong Cloud Shell:

$ gcloud compute addresses list

Bạn sẽ thấy kết quả sau (Địa chỉ IP thực tế phải khớp với địa chỉ bạn đã đặt trước) :

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. Xác minh hành vi của quy tắc NAT trên đám mây

Tại thời điểm này, phiên bản người dùng sẽ sử dụng Quy tắc Cloud NAT đã tạo để sử dụng nat-address-2 nhằm giao tiếp với producer-address-2.

Hãy xác thực hành vi này. SSH vào phiên bản người dùng. Trong Cloud Shell:

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

Lúc này, bạn sẽ ở trong trình bao của phiên bản.

Đầu ra mẫu (đầu ra đầy đủ bị cắt bớt để ngắn gọn)

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:~$

Từ phiên bản người dùng, trước tiên, hãy tìm nạp cả IP của nhà sản xuất và điền chúng dưới dạng các biến môi trường

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"`

Sau đó, hãy thử curl đến cả hai phiên bản nhà sản xuất và quan sát địa chỉ IP nguồn được trả về.

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

Giờ đây, bạn sẽ thấy một địa chỉ IP khác được trả về cho cả hai điểm cuối, địa chỉ IP đầu tiên phải giống với hành vi mặc định. Địa chỉ IP thứ hai phải bằng "nat-address-2" sau khi thêm quy tắc NAT mới.

Một lệnh curl đến bất kỳ dịch vụ phản xạ IP ngoài nào vẫn sẽ cho thấy cùng một IP như hành vi mặc định, ví dụ:

<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

Thoát phiên SSH của phiên bản này. Chúng ta sẽ SSH quay lại để kiểm tra tính năng chuyển hướng địa chỉ.

10. Cập nhật và xoá các quy tắc NAT đám mây

Bạn có thể cập nhật các quy tắc Cloud NAT hiện có. Ví dụ: bạn có thể liên kết địa chỉ IP mới và xoá các địa chỉ IP hiện có được liên kết với các quy tắc hiện có.

Hãy cập nhật tệp Quy tắc NAT như sau

Trong 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

Tệp mới này sẽ đặt "nat-address-2" ở trạng thái đã xả. Thêm "nat-address-3" ở trạng thái hoạt động. Điều này sẽ cho phép các kết nối hiện có sử dụng nat-address-2 để kết thúc một cách suôn sẻ, trong khi chỉ tạo các kết nối mới bằng nat-address-3.

Sau đó, hãy cập nhật cổng NAT hiện có bằng tệp quy tắc này. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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

Xác thực rằng bạn đã định cấu hình thành công quy tắc. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

---
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

Lưu ý cách "nat-address-2" hiện đã được chuyển sang trạng thái đã xả. Bạn có thể tự mình xác thực rằng các kết nối mới từ VPC của người dùng hiện đang sử dụng IP NAT chính xác.

Cuối cùng, để xoá các quy tắc NAT khỏi cổng Cloud NAT và quay lại hành vi mặc định. Bạn có thể sử dụng lệnh gcloud sau. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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

Để xác minh rằng không còn quy tắc NAT nào, hãy sử dụng lệnh mô tả cổng NAT

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

Bạn sẽ thấy kết quả sau :

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

Lưu ý rằng không có phần "rules:" trong tệp YAML đầu ra. Cho biết chưa định cấu hình Quy tắc NAT.

11. Các bước dọn dẹp

Để tránh bị tính phí định kỳ, bạn nên xoá tất cả tài nguyên liên quan đến lớp học lập trình này.

Trước tiên, hãy xoá tất cả các phiên bản.

Trong Cloud Shell:

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

Kết quả đầu ra dự kiến :

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].

Tiếp theo, hãy xoá Bộ định tuyến đám mây. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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

Giải phóng tất cả IP ngoài. Trong 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

Bạn sẽ thấy kết quả sau :

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].

Xoá các quy tắc tường lửa VPC. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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].

Xoá mạng con. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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].

Cuối cùng, hãy xoá các VPC. Trong Cloud Shell:

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

Bạn sẽ thấy kết quả sau :

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. Xin chúc mừng!

Bạn đã hoàn tất bài thực hành về quy tắc NAT trên đám mây!

Nội dung bạn đã học

  • Cách thiết lập một cổng NAT trên đám mây để chuẩn bị cho các quy tắc NAT.
  • Cách thiết kế Quy tắc NAT bằng Ngôn ngữ diễn đạt thông thường (CEL).
  • Cách tạo quy tắc NAT và đính kèm quy tắc đó vào một Cổng NAT.
  • Cách kiểm thử quy tắc NAT từ một phiên bản.
  • Cách cập nhật các quy tắc của Cổng NAT.
  • Cách xoá các quy tắc NAT và quay lại hành vi mặc định của Cloud NAT.

Các bước tiếp theo

  • Thử nghiệm tạo các quy tắc NAT phức tạp hơn, chẳng hạn như ví dụ này
  • Khám phá các địa chỉ IP NAT đang cạn kiệt và quan sát tác động của kết nối.
  • Tìm hiểu thêm về Mạng trên Google Cloud Platform

©Google, Inc. hoặc các đơn vị liên kết của Google. Bảo lưu mọi quyền. Không được phân phối.