Sử dụng quy tắc NAT Cloud

1. Tổng quan

Cloud NAT là một công cụ mạnh mẽ: với công cụ này, khối lượng công việc của Compute Engine và Google Kubernetes Engine (GKE) có thể truy cập vào tài nguyên Internet một cách bảo mật và có thể mở rộng mà không làm lộ trình truy cập bên ngoài bằng IP bên ngoài.

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

Quy tắc NAT là một phần mở rộng của 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 dùng Cloud NAT để kết nố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áy ảo có bật Cloud NAT sẽ sử dụng cùng một nhóm địa chỉ IP NAT để truy cập 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 các đích đến cụ thể. Quy tắc NAT xác định việc so khớp và hành động tương ứng. Sau khi bạn chỉ định 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 so khớp thì hành động tương ứng với kết quả trùng 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 cổng vào Cloud NAT để 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 các quy tắc này vào NAT Gateway.
  • Cách kiểm thử Quy tắc NAT từ một thực thể.
  • Cách cập nhật các quy tắc của NAT Gateway.
  • Cách xoá các quy tắc NAT và quay về hành vi Cloud NAT mặc định.

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 sẽ thấy hữu ích khi hoàn thành phần hướng dẫn về kết nối mạng trong GCP, chẳng hạn như phòng thí nghiệm Kết nối mạng trong Google Cloud.
  • Hiểu biết về 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 phòng thí nghiệm 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.pngS

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.pngs

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 theo quy ước đặt tên, bạn có thể sử dụng bất kỳ thứ gì bạn muốn và có thể cập nhật thông tin đó bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (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 bạn không quan tâm đến sản phẩm đó là gì. 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 (và mã này thường được xác định là PROJECT_ID). Vì vậy, nếu không thích, bạn có thể tạo một mã ngẫu nhiên khác hoặc bạn có thể thử mã của riêng mình để xem có mã này chưa. Sau đó, video sẽ được "đóng băng" sau khi tạo dự án.
  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài 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í 300 USD.

Khởi động Cloud Shell

Mặc dù bạn 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 trong Đám mây.

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

bce75f34b2c53987.png

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường. Sau khi hoàn tất, bạn sẽ thấy như sau:

f6ef2b5f13479f3a.png

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Bạn có thể thực hiện tất cả công việc trong phòng thí nghiệm này chỉ bằng một trình duyệt.

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

Đối với phòng thí nghiệm này, bạn sẽ sử dụng một Dự án rồi tạo 2 VPC, mỗi VPC có một mạng con. Bạn sẽ đặt trước địa chỉ IP bên ngoài, sau đó tạo và định cấu hình cổng vào Cloud NAT (với Cloud Router), 2 thực thể thực thể sản xuất và 1 thực thể của người dùng. Sau khi xác thực hành vi Cloud NAT mặc định, bạn sẽ tạo các quy tắc tuỳ chỉnh 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.pngS

4. Đặt trước địa chỉ IP bên ngoài

Hãy giữ lại tất cả địa chỉ IP bên ngoài sẽ được sử dụng trong phòng thí nghiệm này. Việc 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 VPC của cả người tiêu dùng và nhà sản xuất.

Trên 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 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)"`

Kết quả dự kiến sẽ không xuất hiện, nhưng cần xác nhận rằng các địa chỉ đã được điền đúng cách. Hãy nhập giá trị của tất 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 tài nguyên cho tài nguyên nhà sản xuất. Các thực thể chạy trong VPC của nhà sản xuất sẽ cung cấp dịch vụ kết nối Internet bằng cách sử dụng 2 IP công khai "nhà sản xuất-địa chỉ-1" và "nhà sản xuất-địa chỉ-2" của Google.

Trước tiên, hãy tạo VPC. Trên 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. Trên 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 tường lửa VPC để cho phép địa chỉ IP NAT kết nối với thực thể sản xuất trên cổng 8080.

Đối với quy tắc đầu tiên của 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ể thực thể sản xuất.

Các thực thể nhà sản xuất sẽ chạy dịch vụ lặp lạ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 bằng tất cả phần mềm cần thiết, chúng tôi 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 ta sẽ cung cấp cho mỗi thực thể một địa chỉ IP dành riêng khác nhau.

Tạo thực thể đầu tiên. Trên 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 đó, tạo thực thể thứ hai. Trên 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 của người tiêu dùng, Cloud NAT và phiên bản

Giờ đây, khi bạn đã tạo dịch vụ nhà sản xuất, đã đến lúc tạo VPC dành cho người tiêu dùng và cổng Cloud NAT.

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

Sau đó chúng ta sẽ tạo một cổng Cloud NAT đơn giản ở chế độ phân bổ thủ công và địa chỉ dành riêng "nat-address-1" liên kết với cuộc trò chuyện đó. 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 vào để thêm các quy tắc tuỳ chỉnh. .

Trước tiên, hãy tạo VPC. Trên 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. Trên 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 một quy tắc tường lửa VPC để cho phép các địa chỉ dải IAP kết nối đến các thực thể người tiêu 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 đây 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 cổng NAT, trước tiên chúng ta cần tạo một thực thể Cloud Router (chúng ta sử dụng số ASN riêng tư nhưng số đó không liên quan đến các hoạt động của phòng thí nghiệm này). Trên 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 đó, tạo phiên bản cổng NAT. Trên 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 thực thể kiểm thử cho người dùng. Chúng tôi điền sẵn các IP nhà sản xuất được đặt trước vào đây để có thể tham chiếu đến chúng trong thực thể sau này. Trên 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 Cloud NAT mặc định

Tại thời điểm này, thực thể người tiêu dùng sử dụng hành vi Cloud NAT mặc định sử dụng cùng một IP dành riêng "nat-address-1" để giao tiếp với tất 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 của người dùng. Trên Cloud Shell:

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

Bây giờ, bạn sẽ ở trong môi trường shell thực thể.

Kết quả mẫu (toàn bộ kết quả được cắt ngắn để rút ngắ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:~$

Trong thực thể của người dùng, trước tiên, hãy tìm nạp cả hai IP của nhà sản xuất và điền chúng dưới dạng 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ử cuộn cả hai thực thể thực thể 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 curl cho mọi dịch vụ phản ánh IP bên ngoài 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 thực thể, chúng ta sẽ kết nối lại SSH 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 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ác lệnh gcloud. Chúng ta sẽ khám phá cả hai cách để tạo quy tắc Cloud NAT.

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

Trên 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ó của chúng ta bằng cách sử dụng tệp quy tắc này. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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

Xác thực rằng quy tắc đã được định cấu hình thành công. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

Hãy thử tạo lại cùng một quy tắc chỉ bằng các lệnh gcloud. Trước tiên, hãy xoá quy tắc hiện tại. Trên 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ẽ nhận được kết quả sau đây :

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. Trên 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ẽ nhận được kết quả sau đây :

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

Một lần nữa để 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 nút chuyển định dạng YAML để xem toàn bộ thông tin chi tiết của quy tắc.

Trên 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ẽ nhận được kết quả sau đây :

---
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, lưu ý rằng cả hai đều "nat-address1" và "nat-address-2" địa chỉ bên ngoài hiển thị là "IN_USE". Để kiểm tra điều đó, hãy chạy lệnh này từ Cloud Shell:

$ gcloud compute addresses list

Bạn sẽ nhận được kết quả như sau (Địa chỉ IP thực tế phải khớp với các địa chỉ mà 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 Cloud NAT

Tại thời điểm này, thực thể người tiêu dùng phải sử dụng Quy tắc Cloud NAT đã tạo để sử dụng nat-address-2 cho việc giao tiếp với địa chỉ nhà sản xuất-2.

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

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

Bây giờ, bạn sẽ ở trong môi trường shell thực thể.

Kết quả mẫu (toàn bộ kết quả được cắt ngắn để rút ngắ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:~$

Trong thực thể của người dùng, trước tiên, hãy tìm nạp cả hai IP của nhà sản xuất và điền chúng dưới dạng 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ử cuộn cả hai thực thể thực thể 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

Bây giờ, 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 curl cho mọi dịch vụ phản ánh IP bên ngoài vẫn sẽ hiển thị cùng 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

Tạm thời thoát khỏi phiên SSH của thực thể, chúng ta sẽ chuyển SSH trở lại chế độ loại bỏ địa chỉ kiểm thử.

10. Cập nhật và Xoá quy tắc Cloud NAT

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 các địa chỉ IP mới và loại bỏ các địa chỉ IP hiện có được liên kết với các quy tắc hiện tại.

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

Trên 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

Chức năng của tệp mới này giờ đây là địa chỉ "nat-address-2" ở trạng thái cạn kiệt. Và thêm "nat-address-3" (địa chỉ nat-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 chấm dứt linh hoạt, trong khi tạo các kết nối mới chỉ sử dụng nat-address-3.

Sau đó, hãy cập nhật cổng NAT hiện có của chúng ta bằng cách sử dụng tệp quy tắc này. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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

Xác thực rằng quy tắc đã được định cấu hình thành công. Trên 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ẽ nhận được kết quả sau đây :

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

Chú ý cách "nat-address-2" hiện đã được đặt vào trạng thái cạn kiệt. Chúng tôi sẽ tuỳ ý vào bạn để 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 đúng IP NAT.

Cuối cùng, để xoá các quy tắc NAT khỏi cổng vào Cloud NAT và quay về chế độ mặc định. Bạn có thể dùng lệnh gcloud sau đây. Trên 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ẽ nhận được kết quả sau đây :

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 khác, 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ẽ nhận được kết quả sau đây :

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 ý cách không có "quy tắc:" trong dữ liệu đầu ra YAML. Cho biết chưa có Quy tắc NAT được định cấu hình.

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

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

Trước tiên, hãy xoá mọi phiên bản.

Trên 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á Cloud Router. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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

Huỷ bỏ tất cả địa chỉ IP bên ngoài. Trên 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ẽ nhận được kết quả sau đây :

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. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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. Trên Cloud Shell:

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

Bạn sẽ nhận được kết quả sau đây :

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 thành Phòng thí nghiệm về quy tắc Cloud NAT!

Nội dung bạn đã đề cập

  • Cách thiết lập cổng vào Cloud NAT để 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 các quy tắc này vào NAT Gateway.
  • Cách kiểm thử Quy tắc NAT từ một thực thể.
  • Cách cập nhật các quy tắc của NAT Gateway.
  • Cách xoá các quy tắc NAT và quay về hành vi Cloud NAT mặc định.

Bước tiếp theo

  • Thử nghiệm với việc tạo Quy tắc NAT phức tạp hơn, chẳng hạn như ví dụ này
  • Khám phá việc tiêu hao địa chỉ IP NAT và quan sát tác động của kết nối.
  • Tìm hiểu thêm về việc kết nối 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.