Использование статических маршрутов IPv6: экземпляр следующего перехода (без тегов и тегов), адрес следующего перехода и шлюз следующего перехода.

1. Введение

Статические пользовательские маршруты влияют на поведение маршрутизации по умолчанию в VPC. Пользовательские маршруты IPv6 теперь поддерживают новые атрибуты следующего перехода: next-hop-gateway, next-hop-instance и next-hop-address. В этом практическом занятии описывается, как использовать пользовательские маршруты IPv6 с этими новыми параметрами следующего перехода, используя две VPC, соединенные экземпляром виртуальной машины с несколькими сетевыми адаптерами. Вы также продемонстрируете смешивание адресации ULA и GUA и обеспечение доступности VPC ULA для доступа к общедоступному интернету с помощью новой возможности пользовательских маршрутов.

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

  • Как создать пользовательский маршрут IPv6 с указанием следующего перехода через ILB, указав имя ILB.
  • Как создать пользовательский маршрут IPv6 с указанием IPv6-адреса балансировщика нагрузки (ILB) в качестве следующего хопа.

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

  • Проект Google Cloud

2. Прежде чем начать

Обновите проект, чтобы он поддерживал практическое занятие.

В этом практическом занятии используется переменная `$variables` для упрощения настройки gcloud в Cloud Shell.

Внутри Cloud Shell выполните следующие действия.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export projectname=$(gcloud config list --format="value(core.project)")

Общая архитектура лаборатории

5fc56288b4f8ae05.png

Для демонстрации обоих типов пользовательских маршрутов перехода к следующему узлу вам потребуется создать две VPC: клиентскую и серверную VPC, использующие адресацию ULA.

Для доступа клиентской VPC к серверу необходимо использовать пользовательский маршрут с параметром next-hop-ilb, указывающим на ILB (используя имя ILB) перед группой многосетевых шлюзовых экземпляров, расположенных между двумя ILB. Для обеспечения обратной маршрутизации к клиентскому экземпляру (после удаления маршрута по умолчанию ::/0) необходимо использовать пользовательский маршрут с параметром next-hop-ilb (используя адрес ILB), указывающим на ILB.

3. Настройка клиентской VPC

Создайте клиентскую VPC.

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks create client-vpc \
    --project=$projectname \
    --subnet-mode=custom --mtu=1500 \
    --bgp-routing-mode=regional \
    --enable-ula-internal-ipv6

Создайте клиентскую подсеть.

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks subnets create client-subnet  \
    --network=client-vpc \
    --project=$projectname \
    --range=192.168.1.0/24 \
    --stack-type=IPV4_IPV6 \
    --ipv6-access-type=internal \
    --region=us-central1

Запишите назначенную подсеть IPv6 в переменную среды, используя эту команду.

export client_subnet=$(gcloud compute networks subnets \
    describe client-subnet \
    --project $projectname \
    --format="value(internalIpv6Prefix)" \
    --region us-central1)

Запуск экземпляра клиента

Внутри Cloud Shell выполните следующие действия:

gcloud compute instances create client-instance \
    --subnet client-subnet \
    --stack-type IPV4_IPV6 \
    --zone us-central1-a \
    --project=$projectname

Добавьте правило брандмауэра для трафика клиентских VPC.

Внутри Cloud Shell выполните следующие действия:

gcloud compute firewall-rules create allow-gateway-client \
    --direction=INGRESS --priority=1000 \
    --network=client-vpc --action=ALLOW \
    --rules=tcp --source-ranges=$client_subnet \
    --project=$projectname 

Добавьте правило брандмауэра, разрешающее IAP для экземпляра клиента.

Внутри Cloud Shell выполните следующие действия:

gcloud compute firewall-rules create allow-iap-client \
    --direction=INGRESS --priority=1000 \
    --network=client-vpc --action=ALLOW \
    --rules=tcp:22 --source-ranges=35.235.240.0/20 \
    --project=$projectname 

Подтвердите SSH-доступ к экземпляру клиента.

Внутри Cloud Shell войдите в клиентский экземпляр:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

В случае успеха вы увидите окно терминала клиентского приложения. Выйдите из SSH-сессии, чтобы продолжить выполнение задания.

4. Настройка VPC сервера

Создайте серверную VPC

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks create server-vpc \
    --project=$projectname \
    --subnet-mode=custom --mtu=1500 \
    --bgp-routing-mode=regional \
    --enable-ula-internal-ipv6

Создайте подсети серверов.

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks subnets create server-subnet \
    --network=server-vpc \
    --project=$projectname \
    --range=192.168.0.0/24 \
    --stack-type=IPV4_IPV6 \
    --ipv6-access-type=internal \
    --region=us-central1

Запишите назначенную подсеть в переменную среды, используя эту команду.

export server_subnet=$(gcloud compute networks subnets \
    describe server-subnet \
    --project $projectname \
    --format="value(internalIpv6Prefix)" \
    --region us-central1)

Запуск виртуальной машины сервера

Внутри Cloud Shell выполните следующие действия:

gcloud compute instances create server-instance \
    --subnet server-subnet \
    --stack-type IPV4_IPV6 \
    --zone us-central1-a \
    --project=$projectname

Добавьте правило брандмауэра, разрешающее доступ к серверу с клиентских устройств.

Внутри Cloud Shell выполните следующие действия:

gcloud compute firewall-rules create allow-client-server \
    --direction=INGRESS --priority=1000 \
    --network=server-vpc --action=ALLOW \
    --rules=tcp --source-ranges=$client_subnet \
    --project=$projectname 

Добавьте правило брандмауэра для разрешения использования IAP.

Внутри Cloud Shell выполните следующие действия:

gcloud compute firewall-rules create allow-iap-server \
    --direction=INGRESS --priority=1000 \
    --network=server-vpc --action=ALLOW \
    --rules=tcp:22 \
    --source-ranges=35.235.240.0/20 \
    --project=$projectname 

Установите Apache в экземпляре сервера ULA.

Внутри Cloud Shell войдите в клиентский экземпляр:

gcloud compute ssh server-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри оболочки виртуальной машины сервера выполните следующую команду.

sudo apt update && sudo apt -y install apache2

Убедитесь, что Apache запущен.

sudo systemctl status apache2

Замените веб-страницу по умолчанию.

echo '<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>' | sudo tee /var/www/html/index.html

Чтобы продолжить выполнение практического задания, выйдите из SSH-сессии.

5. Создайте экземпляры шлюза.

Создайте шаблон экземпляра шлюза с несколькими сетевыми адаптерами.

Внутри Cloud Shell выполните следующие действия:

gcloud compute instance-templates create gateway-instance-template \
    --project=$projectname \
    --instance-template-region=us-central1 \
    --region=us-central1 \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet,no-address \
    --can-ip-forward \
    --metadata=startup-script='#! /bin/bash 
sudo sysctl -w net.ipv6.conf.ens4.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens5.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens4.accept_ra_defrtr=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1'

Создайте группу экземпляров шлюза с несколькими сетевыми адаптерами.

Внутри Cloud Shell выполните следующие действия:

gcloud compute instance-groups managed create gateway-instance-group \
    --project=$projectname \
    --base-instance-name=gateway-instance \
      --template=projects/$projectname/regions/us-central1/instanceTemplates/gateway-instance-template \
    --size=2 \
    --zone=us-central1-a

Проверьте экземпляры шлюза.

Чтобы убедиться, что наш скрипт запуска был передан корректно и что таблица маршрутизации v6 верна, подключитесь по SSH к одному из экземпляров шлюза.

Внутри Cloud Shell выведите список экземпляров шлюза, выполнив следующую команду:

gcloud compute instances list \
    --project=$projectname \
    --zones=us-central1-a \
    --filter name~gateway \
    --format 'csv(name)'

Запишите одно из имен экземпляров и используйте его в следующей команде для подключения к этому экземпляру по SSH.

Внутри Cloud Shell войдите в один из экземпляров шлюза.

gcloud compute ssh gateway-instance-<suffix> \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри оболочки виртуальной машины шлюза выполните следующую команду, чтобы проверить пересылку IPv6.

sudo sysctl net.ipv6.conf.all.forwarding

Команда должна вернуть значение "1", указывающее на то, что пересылка IPv6 включена.

Проверьте таблицу маршрутизации IPv6 на экземпляре.

ip -6 route show

Пример выходных данных, показывающий маршруты подсетей ULA и GUA, при этом маршрут по умолчанию указывает на интерфейс GUA.

::1 dev lo proto kernel metric 256 pref medium
2600:1900:4000:7a7f:0:1:: dev ens4 proto kernel metric 256 expires 83903sec pref medium
2600:1900:4000:7a7f::/65 via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
fd20:3df:8d5c::1:0:0 dev ens5 proto kernel metric 256 expires 83904sec pref medium
fd20:3df:8d5c::/64 via fe80::4001:c0ff:fea8:1 dev ens5 proto ra metric 1024 expires 84sec pref medium
fe80::/64 dev ens5 proto kernel metric 256 pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium

Чтобы продолжить выполнение практического задания, выйдите из SSH-сессии.

6. Создайте компоненты балансировщика нагрузки.

Прежде чем создавать маршруты в обеих VPC, нам потребуется создать внутренние балансировщики нагрузки с переадресацией трафика на обеих сторонах экземпляров шлюза.

Балансировщики нагрузки, созданные в рамках этого практического занятия, состоят из следующих компонентов:

  • Проверка работоспособности: В этом практическом занятии мы создадим простые проверки работоспособности, нацеленные на порт 22. Обратите внимание, что проверки работоспособности не будут работать в развернутом виде (для этого потребуется добавить правила брандмауэра, разрешающие проверки работоспособности, и создать специальные маршруты на экземплярах шлюза). Поскольку это практическое занятие посвящено переадресации IPv6, мы будем полагаться на поведение распределения трафика по умолчанию внутренних балансировщиков нагрузки, работающих в режиме сквозной передачи, когда все бэкэнды неисправны, а именно, перенаправлять трафик на все бэкэнды в качестве крайней меры.
  • В качестве бэкэнд-сервиса мы будем использовать протокол TCP. Но поскольку балансировщики нагрузки созданы для маршрутизации, все протоколы перенаправляются независимо от протокола бэкэнд-сервиса.
  • Правило пересылки: мы создаем правило пересылки для каждой VPC.
  • Внутренний IPv6-адрес: в этом практическом задании мы позволим правилу пересылки автоматически выделять IPv6-адреса из подсети.

Создать проверку здоровья

Внутри Cloud Shell выполните следующие действия:

gcloud compute health-checks create tcp tcp-hc-22 \
    --project=$projectname \
    --region=us-central1 \
    --port=22

Создание серверных служб

Внутри Cloud Shell выполните следующие действия:

gcloud compute backend-services create bes-ilb-clientvpc \
    --project=$projectname \
    --load-balancing-scheme=internal \
    --protocol=tcp \
    --network=client-vpc \
    --region=us-central1 \
    --health-checks=tcp-hc-22 \
    --health-checks-region=us-central1

gcloud compute backend-services create bes-ilb-servervpc \
    --project=$projectname \
    --load-balancing-scheme=internal \
    --protocol=tcp \
    --network=server-vpc \
    --region=us-central1 \
    --health-checks=tcp-hc-22 \
    --health-checks-region=us-central1

Добавить группу экземпляров в бэкэнд-службу

Внутри Cloud Shell выполните следующие действия:

gcloud compute backend-services add-backend bes-ilb-clientvpc \
    --project=$projectname \
    --region=us-central1 \
    --instance-group=gateway-instance-group \
    --instance-group-zone=us-central1-a
gcloud compute backend-services add-backend bes-ilb-servervpc \
    --project=$projectname \
    --region=us-central1 \
    --instance-group=gateway-instance-group \
    --instance-group-zone=us-central1-a

Создание правил пересылки

Внутри Cloud Shell выполните следующие действия:

gcloud compute forwarding-rules create fr-ilb-clientvpc \
    --project=$projectname \
    --region=us-central1 \
    --load-balancing-scheme=internal \
    --network=client-vpc \
    --subnet=client-subnet \
    --ip-protocol=TCP \
    --ip-version=IPV6 \
    --ports=ALL \
    --backend-service=bes-ilb-clientvpc \
    --backend-service-region=us-central1

gcloud compute forwarding-rules create fr-ilb-servervpc \
    --project=$projectname \
    --region=us-central1 \
    --load-balancing-scheme=internal \
    --network=server-vpc \
    --subnet=server-subnet \
    --ip-protocol=TCP \
    --ip-version=IPV6 \
    --ports=ALL \
    --backend-service=bes-ilb-servervpc \
    --backend-service-region=us-central1

Запишите IPv6-адреса обоих правил переадресации, выполнив следующие команды в Cloudshell:

export fraddress_client=$(gcloud compute forwarding-rules \
    describe fr-ilb-clientvpc \
    --project $projectname \
    --format="value(IPAddress)" \
    --region us-central1)

export fraddress_server=$(gcloud compute forwarding-rules \
    describe fr-ilb-servervpc \
    --project $projectname \
    --format="value(IPAddress)" \
    --region us-central1)

7. Создайте и протестируйте маршруты к балансировщикам нагрузки (используя адрес балансировщика нагрузки).

В этом разделе вы добавите маршруты как к клиентской, так и к серверной VPC, используя IPv6-адреса балансировщиков нагрузки в качестве следующих узлов.

Запишите адреса серверов.

Внутри Cloud Shell выполните следующие действия:

gcloud compute instances list \
   --project $projectname \
   --zones us-central1-a \
   --filter="name~server-instance" \
--format='value[separator=","](name,networkInterfaces[0].ipv6Address)'

В результате должны отобразиться имена экземпляров серверов и их префиксы IPv6. Пример вывода.

server-instance,fd20:3df:8d5c:0:0:0:0:0

Запишите адрес сервера, так как он понадобится вам позже в командах curl с клиентского компьютера. К сожалению, для хранения этих адресов сложно использовать переменные окружения, поскольку они не передаются по SSH-сессиям.

Выполните команду curl с клиентской стороны на экземпляр сервера ULA.

Чтобы увидеть поведение до добавления новых маршрутов, выполните команду curl с клиентского экземпляра на серверный экземпляр1.

Внутри Cloud Shell войдите в клиентский экземпляр:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри клиентского экземпляра выполните команду curl, используя IPv6-адрес ULA экземпляра server1 (команда устанавливает короткий тайм-аут в 5 секунд, чтобы избежать слишком долгого ожидания curl).

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Эта команда curl должна завершиться по истечении времени ожидания, поскольку у клиентской VPC пока нет маршрута к серверной VPC.

Давайте попробуем это исправить! Пока что выйдем из SSH-сессии.

Добавьте пользовательский маршрут в клиентскую VPC.

Поскольку в клиентской VPC отсутствует маршрут к префиксу ULA, давайте добавим его, создав маршрут, указывающий на балансировщик нагрузки на стороне клиента по адресу.

Примечание: Внутренним балансировщикам нагрузки IPv6, работающим в режиме сквозной передачи, назначаются адреса с маской /96. Необходимо удалить маску /96 из адреса перед передачей его следующей команде. (В приведенном ниже примере используется подстановка на месте в bash)

Внутри Cloud Shell выполните следующие действия:

gcloud compute routes create client-to-server-route \
   --project=$projectname \
   --destination-range=$server_subnet \
   --network=client-vpc \
   --next-hop-ilb=${fraddress_client//\/96}

Подключитесь к клиентскому экземпляру по SSH:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри клиентского экземпляра повторите попытку выполнения команды curl к серверному экземпляру. (Команда устанавливает короткий тайм-аут в 5 секунд, чтобы избежать слишком долгого ожидания curl).

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Эта команда curl по-прежнему выдает ошибку тайм-аута, потому что у серверной VPC еще нет маршрута обратно к клиентской VPC через экземпляр шлюза.

Чтобы продолжить выполнение практического задания, выйдите из SSH-сессии.

Добавьте пользовательский маршрут в VPC сервера.

Внутри Cloud Shell выполните следующие действия:

gcloud compute routes create server-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc \
  --next-hop-ilb=${fraddress_server//\/96}

Подключитесь к клиентскому экземпляру по SSH:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри клиентского экземпляра попробуйте еще раз выполнить команду curl к серверному экземпляру.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Эта команда curl теперь выполняется успешно, что подтверждает наличие сквозной доступности от клиентского экземпляра к серверному экземпляру ULA. Такое соединение теперь возможно только при использовании пользовательских маршрутов IPv6 с next-hop-ilb в качестве next-hops.

Пример выходных данных

<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[fd20:3df:8d5c:0:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>

Чтобы продолжить выполнение практического задания, выйдите из SSH-сессии.

8. Создайте и протестируйте маршруты к балансировщикам нагрузки (используя имя балансировщика нагрузки).

В качестве альтернативы, next-hop-ilb может также ссылаться на имя балансировщика нагрузки вместо его IPv6-адреса. В этом разделе мы рассмотрим процедуру выполнения этой операции и проверим, установлено ли соединение между клиентом и сервером.

Удалить предыдущие маршруты

Давайте восстановим среду до состояния, предшествующего добавлению каких-либо пользовательских маршрутов, удалив пользовательские маршруты, использующие имя экземпляра.

Внутри Cloud Shell выполните следующие действия:

gcloud compute routes delete client-to-server-route  --quiet --project=$projectname
gcloud compute routes delete server-to-client-route  --quiet --project=$projectname

Выполните команду curl с клиентской стороны на экземпляр сервера ULA.

Чтобы убедиться в успешном удалении предыдущих маршрутов, выполните команду curl с клиентского экземпляра на серверный экземпляр1.

Внутри Cloud Shell войдите в клиентский экземпляр:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри клиентского экземпляра выполните команду curl, используя IPv6-адрес ULA экземпляра server1 (команда устанавливает короткий тайм-аут в 5 секунд, чтобы избежать слишком долгого ожидания curl).

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Эта команда curl должна завершиться по истечении времени ожидания, поскольку у клиентской VPC больше нет маршрута к серверной VPC.

Добавление пользовательских маршрутов в клиентские и серверные VPC

Давайте повторно добавим пользовательские маршруты в клиентские и серверные VPC, но вместо адреса ILB мы будем использовать его имя и регион в команде.

Внутри Cloud Shell выполните следующие действия:

gcloud compute routes create client-to-server-route \
   --project=$projectname \
   --destination-range=$server_subnet \
   --network=client-vpc \
   --next-hop-ilb=fr-ilb-clientvpc \
   --next-hop-ilb-region=us-central1

gcloud compute routes create server-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc \
   --next-hop-ilb=fr-ilb-servervpc \
   --next-hop-ilb-region=us-central1

Подключитесь к клиентскому экземпляру по SSH:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Внутри клиентского экземпляра повторите попытку выполнения команды curl к серверному экземпляру. (Команда устанавливает короткий тайм-аут в 5 секунд, чтобы избежать слишком долгого ожидания curl).

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Теперь эта команда curl выполняется успешно, что свидетельствует о наличии сквозной доступности от клиентского экземпляра к серверному экземпляру ULA.

9. Уборка

Устранить неполадки в пользовательских маршрутах

Внутри Cloud Shell выполните следующие действия:

gcloud compute routes delete client-to-server-route  --quiet --project=$projectname
gcloud compute routes delete server-to-client-route  --quiet --project=$projectname

Очистка компонентов LB

Внутри Cloud Shell выполните следующие действия:

gcloud compute forwarding-rules delete fr-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute forwarding-rules delete fr-ilb-servervpc --region us-central1 --quiet --project=$projectname

gcloud compute backend-services delete bes-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-servervpc --region us-central1 --quiet --project=$projectname

gcloud compute health-checks delete tcp-hc-22 --region us-central1 --quiet --project=$projectname

Очистка экземпляров и шаблона экземпляра.

Внутри Cloud Shell выполните следующие действия:

gcloud compute instances delete client-instance --zone us-central1-a --quiet --project=$projectname

gcloud compute instances delete server-instance --zone us-central1-a --quiet --project=$projectname


gcloud compute instance-groups managed delete gateway-instance-group --zone us-central1-a --quiet --project=$projectname

gcloud compute instance-templates delete gateway-instance-template --region us-central1 --quiet --project=$projectname

Очистка подсетей

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks subnets delete client-subnet --region=us-central1 --quiet --project=$projectname

gcloud compute networks subnets delete server-subnet --region=us-central1 --quiet --project=$projectname

Очистка правил брандмауэра

Внутри Cloud Shell выполните следующие действия:

gcloud compute firewall-rules delete allow-iap-client  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-gateway-client  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server  --quiet --project=$projectname

Очистка VPC

Внутри Cloud Shell выполните следующие действия:

gcloud compute networks delete client-vpc --quiet --project=$projectname
gcloud compute networks delete server-vpc --quiet --project=$projectname

10. Поздравляем!

Вы успешно использовали статические пользовательские маршруты IPv6 с параметром next-hops, установленным на next-hop-ilb. Вы также проверили сквозную связь IPv6 с использованием этих маршрутов.

Что дальше?

Посмотрите некоторые из этих практических занятий по программированию...

Дополнительная литература и видеоматериалы

Справочная документация