Использование правил Cloud NAT NAT

1. Обзор

Cloud NAT — это мощный инструмент: с его помощью рабочие нагрузки Compute Engine и Google Kubernetes Engine (GKE) могут получать доступ к интернет-ресурсам масштабируемым и безопасным способом, не предоставляя работающим на них рабочим нагрузкам доступ извне с использованием внешних IP-адресов.

Облачная NAT имеет беспрокси-серверную архитектуру, реализуя NAT непосредственно на уровне Andromeda SDN. Таким образом, это не влияет на производительность вашей рабочей нагрузки и легко масштабируется для множества виртуальных машин, регионов и VPC.

Правила NAT — это расширение функции Cloud NAT. Функция правил NAT в Cloud NAT позволяет создавать правила доступа, определяющие, как Cloud NAT используется для подключения к Интернету. В настоящее время правила NAT поддерживают выбор исходного NAT-адреса на основе адреса назначения.

Без правил NAT виртуальная машина с включенным облачным NAT использует один и тот же набор IP-адресов NAT для доступа ко всем интернет-адресам.

Иногда в сценарии использования NAT требуется, чтобы Cloud NAT использовал разные исходные IP-адреса для определенных адресов назначения. Правило NAT определяет соответствие и соответствующее действие. После указания правил NAT пакет сопоставляется с каждым правилом NAT. Если правило совпадает, выполняется действие, соответствующее этому совпадению.

Для получения более подробной информации ознакомьтесь с разделом «Документация» о правилах NAT .

Что вы узнаете

  • Как настроить шлюз Cloud NAT для подготовки к использованию правил NAT.
  • Как создавать правила NAT с использованием языка выражений Common Expression Language (CEL).
  • Как создать правила NAT и привязать их к шлюзу NAT.
  • Как проверить правила NAT из экземпляра системы.
  • Как обновить правила NAT-шлюза.
  • Как удалить правила NAT и вернуться к поведению Cloud NAT по умолчанию.

Что вам понадобится

  • Базовые знания Google Compute Engine.
  • Базовые знания сетевых технологий и протокола TCP/IP.
  • Базовые знания командной строки Unix/Linux.
  • Полезно предварительно ознакомиться с основами работы с сетями в GCP, например, пройти лабораторную работу «Сети в Google Cloud» .
  • Понимание основ облачного NAT.

2. Использование консоли Google Cloud и Cloud Shell

Для взаимодействия с GCP в ходе этой лабораторной работы мы будем использовать как консоль Google Cloud, так и Cloud Shell.

Консоль Google Cloud

Доступ к консоли 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 — среду командной строки, работающую в облаке.

В консоли GCP щелкните значок Cloud Shell на панели инструментов в правом верхнем углу:

bce75f34b2c53987.png

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

f6ef2b5f13479f3a.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории можно выполнять с помощью обычного браузера.

3. Подготовка лаборатории

Для этой лабораторной работы вы будете использовать проект и создадите две VPC с подсетью в каждой. Вы зарезервируете внешние IP-адреса, а затем создадите и настроите шлюз Cloud NAT (с Cloud Router), два экземпляра производителя, а также один экземпляр потребителя. После проверки поведения 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-адреса: «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, облачного 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-шлюза необходимо сначала создать экземпляр Cloud Router (мы используем частный номер ASN, но это не имеет значения для данной лабораторной работы). Из Cloud Shell:

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

Выход:

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

Затем создайте экземпляр NAT-шлюза. Из Cloud Shell:

gcloud compute routers nats create consumer-nat-gw \
    --router=consumer-cr \
    --router-region=us-east4 \
    --nat-all-subnet-ip-ranges \
    --nat-external-ip-pool=nat-address-1

Выход:

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

Создайте экземпляр для тестирования потребителя. Здесь мы указываем зарезервированные 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 к обоим экземплярам производителя и посмотрите, какой 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-отражателя должна показывать тот же 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 ( CMS). Дополнительную информацию о языке выражений правил см. в разделе «Язык выражений правил» .

Вы также можете добавить правило 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" отображаются как "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 для связи с адресом производителя 2 через nat-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 должен быть равен "nat-address-2".

При попытке подключения к любой внешней службе IP-отражателя с помощью команды 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, чтобы проверить процесс опустошения адреса.

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 теперь используют правильные NAT IP-адреса.

Наконец, чтобы удалить правила 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 gateway describe`.

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-файле отсутствует раздел "rules:". Это указывает на отсутствие настроенных правил 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-шлюза.
  • Как удалить правила NAT и вернуться к поведению Cloud NAT по умолчанию.

Следующие шаги

  • Поэкспериментируйте с созданием более сложных правил NAT, подобных этому примеру.
  • Изучите проблему перегрузки NAT IP-адресов и оцените влияние на соединение.
  • Узнайте больше о сетевых технологиях на платформе Google Cloud.

©Google, Inc. или ее дочерние компании. Все права защищены. Распространение запрещено.