Маршрутизация с помощью NAT-инстанса
NAT-инстанс — специальная виртуальная машина с преднастроенными правилами маршрутизации и трансляции IP-адресов.
В Yandex Cloud можно настроить связь нескольких ВМ с интернетом через NAT-инстанс с помощью статической маршрутизации. При этом будет использован только один публичный IP-адрес — тот, который присвоен NAT-инстансу.
Чтобы настроить маршрутизацию через NAT-инстанс:
- Подготовьте облако к работе.
- Создайте группу безопасности.
- Создайте тестовую ВМ.
- Создайте NAT-инстанс.
- Настройте статическую маршрутизацию в облачной сети.
- Проверьте работу NAT-инстанса.
Если созданные ресурсы вам больше не нужны, удалите их.
Также инфраструктуру для NAT-инстанса можно развернуть через Terraform с помощью готового файла конфигурации.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки NAT-инстанса входят:
- Плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud).
- Плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Подготовьте инфраструктуру
- Создайте облачную сеть, например
my-vpc
. - В облачной сети создайте подсети, например:
public-subnet
, в которой будет размещен NAT-инстанс.private-subnet
, в которой будет размещена тестовая ВМ.
Создайте группу безопасности
Группы безопасности содержат правила, которые разрешают обращаться к ВМ по SSH. В сценарии будет создана группа безопасности nat-instance-sg
.
Чтобы создать группу безопасности:
- В консоли управления
выберите сервис Virtual Private Cloud. - Откройте вкладку
Группы безопасности. - Создайте группу безопасности:
-
Нажмите кнопку Создать группу.
-
В поле Имя укажите имя группы:
nat-instance-sg
. -
В поле Сеть выберите сеть
my-vpc
. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон портов Протокол Назначение /
ИсточникCIDR блоки Исходящий any
Весь
Любой
CIDR
0.0.0.0/0
Входящий ssh
22
TCP
CIDR
0.0.0.0/0
Входящий ext-http
80
TCP
CIDR
0.0.0.0/0
Входящий ext-https
443
TCP
CIDR
0.0.0.0/0
-
Выберите вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик. Чтобы открыть все порты, нажмите Выбрать весь диапазон.
-
В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
-
В поле Назначение или Источник выберите
CIDR
— правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите0.0.0.0/0
. -
Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
Нажмите кнопку Сохранить.
-
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте тестовую виртуальную машину
-
В консоли управления
выберите каталог, в котором хотите создать тестовую ВМ. -
В списке сервисов выберите Compute Cloud.
-
Нажмите кнопку Создать виртуальную машину.
-
В блоке Базовые параметры:
- В поле Имя введите имя ВМ, например
test-vm
. - В поле Зона доступности выберите зону доступности, где находится подсеть
private-subnet
.
- В поле Имя введите имя ВМ, например
-
В блоке Выбор образа/загрузочного диска выберите один из образов и версию операционной системы на базе Linux.
-
В блоке Сетевые настройки:
- В поле Подсеть выберите подсеть для тестовой ВМ, например
private-subnet
. - В поле Публичный адрес выберите Без адреса.
- В поле Внутренний IPv4-адрес выберите Автоматически.
- В поле Группы безопасности выберите созданную ранее группу
nat-instance-sg
.
- В поле Подсеть выберите подсеть для тестовой ВМ, например
-
В блоке Доступ:
-
В поле Логин введите имя пользователя.
-
В поле SSH-ключ вставьте содержимое файла с публичным SSH-ключом. Пару ключей для подключения по SSH необходимо создать самостоятельно.
Примечание
Сохраните ключи в директории по умолчанию и используйте для них стандартные имена, например
id_ed25519
илиid_rsa
.
-
-
Нажмите кнопку Создать ВМ.
Сохраните имя пользователя, закрытый SSH-ключ и внутренний IP-адрес тестовой ВМ.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте NAT-инстанс
-
В консоли управления
выберите каталог, в котором хотите создать NAT-инстанс. -
В списке сервисов выберите Compute Cloud.
-
Нажмите кнопку Создать виртуальную машину.
-
В блоке Базовые параметры:
- В поле Имя введите имя ВМ для NAT-инстанса, например
nat-instance
. - В поле Зона доступности выберите зону доступности, где находится подсеть
public-subnet
.
- В поле Имя введите имя ВМ для NAT-инстанса, например
-
В блоке Выбор образа/загрузочного диска перейдите на вкладку Marketplace и выберите образ NAT-инстанс.
-
В блоке Сетевые настройки:
- В поле Подсеть выберите подсеть для NAT-инстанса, например
public-subnet
. - В поле Публичный адрес выберите
Автоматически
. - В поле Внутренний IPv4-адрес выберите
Автоматически
. - В поле Группы безопасности выберите созданную ранее группу
nat-instance-sg
.
- В поле Подсеть выберите подсеть для NAT-инстанса, например
-
В блоке Доступ:
-
В поле Логин введите имя пользователя.
-
В поле SSH-ключ вставьте содержимое файла с публичным SSH-ключом. Пару ключей для подключения по SSH необходимо создать самостоятельно.
Примечание
Сохраните ключи в директории по умолчанию и используйте для них стандартные имена, например
id_ed25519
илиid_rsa
.
-
-
Нажмите кнопку Создать ВМ.
Сохраните имя пользователя, закрытый SSH-ключ, внутренний и публичный IP-адреса NAT-инстанса.
См. раздел Как создать инфраструктуру с помощью Terraform.
Настройте статическую маршрутизацию
Примечание
При создании NAT-инстанса автоматически настраивается только один сетевой интерфейс. Остальные интерфейсы можно включить вручную. Назначьте каждому новому интерфейсу IP-адрес и пропишите для него маршрут в таблице маршрутизации. В каждой подсети корректным шлюзом будет первый IP-адрес. Например, для подсети 192.168.0.128/25
первым адресом в подсети будет — 192.168.0.129
.
- Создайте таблицу маршрутизации и добавьте в нее статический маршрут:
-
В консоли управления
выберите каталог, в котором хотите создать статический маршрут. -
В списке сервисов выберите Virtual Private Cloud.
-
На панели слева выберите
Таблицы маршрутизации. -
Нажмите кнопку Создать.
-
В поле Имя задайте имя таблицы маршрутизации, например
nat-instance-route
. Требования к имени:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В поле Cеть выберите сеть, например
my-vpc
. -
В блоке Статические маршруты нажмите Добавить маршрут.
-
В открывшемся окне в поле Префикс назначения введите
0.0.0.0/0
. -
В поле Next hop выберите
IP-адрес
. -
В поле IP-адрес укажите внутренний IP-адрес NAT-инстанса. Нажмите кнопку Добавить.
-
Нажмите кнопку Создать таблицу маршрутизации.
-
- Привяжите таблицу маршрутизации к подсети, где находится тестовая ВМ, например
private-subnet
:- На панели слева выберите
Подсети. - Нажмите
в строке подсети с тестовой ВМ и выберите Привязать таблицу маршрутизации. - В открывшемся окне в поле Таблица маршрутизации выберите таблицу
nat-instance-route
и нажмите Привязать.
- На панели слева выберите
См. раздел Как создать инфраструктуру с помощью Terraform.
Созданный маршрут можно применять и к другим подсетям в той же сети, кроме подсети, где находится NAT-инстанс.
Важно
Не привязывайте таблицу маршрутизации к подсети, в которой находится NAT-инстанс. В противном случае будут возникать маршрутные петли, при которых NAT-инстанс будет направлять пакеты не в локальную сеть, а сам себе.
Проверьте работу NAT-инстанса
-
Подключитесь к тестовой ВМ через внутренний IP-адрес, используя NAT-инстанс в роли джамп-хоста:
ssh -J <имя_пользователя_NAT-инстанса>@<публичный_IP-адрес_NAT-инстанса> \ <имя_пользователя_ВМ>@<внутренний_IP-адрес_ВМ>
Также подключиться к тестовой ВМ можно с помощью перенаправления стандартного ввода-вывода (флаг
-W
) для «проброса» соединения через NAT-инстанс:ssh -o ProxyCommand="ssh -i <путь/имя_файла_ключа_NAT> -W %h:%p <имя_пользователя_NAT>@<публичный_IP-адрес_NAT>" \ -i <путь/имя_файла_ключа_ВМ> <имя_пользователя_ВМ>@<внутренний_IP-адрес_ВМ>
Используйте эту команду для подключения в следующих случаях:
- на ВМ используется версия OpenSSH ниже 7.3;
- ваши SSH-ключи хранятся в отличном от директории по умолчанию месте или имеют нестандартные имена.
-
Введите yes для подключения к NAT-инстансу и повторно введите yes для подключения к тестовой ВМ.
Примечание
При вводе yes команда может не отображаться в терминале, но сработает.
-
Убедитесь, что тестовая ВМ получает доступ в интернет через публичный IP-адрес NAT-инстанса. Выполните команду:
curl ifconfig.co
Если команда вернет публичный IP-адрес NAT-инстанса, все настроено правильно.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы, удалите тестовую ВМ и NAT-инстанс.
Как создать инфраструктуру с помощью Terraform
Terraform
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
Чтобы настроить маршрутизацию через NAT-инстанс с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовый архивВручную- Создайте папку для файла с описанием инфраструктуры.
- Скачайте архив
(2 КБ). - Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл
nat-instance.tf
и файл с пользовательскими даннымиnat-instance.auto.tfvars
.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
nat-instance.tf
:nat-instance.tf# Объявление переменных для пользовательских параметров variable "folder_id" { type = string } variable "vm_user" { type = string } variable "vm_user_nat" { type = string } variable "ssh_key_path" { type = string } # Добавление прочих переменных locals { network_name = "my-vpc" subnet_name1 = "public-subnet" subnet_name2 = "private-subnet" sg_nat_name = "nat-instance-sg" vm_test_name = "test-vm" vm_nat_name = "nat-instance" route_table_name = "nat-instance-route" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Создание облачной сети resource "yandex_vpc_network" "my-vpc" { name = local.network_name } # Создание подсетей resource "yandex_vpc_subnet" "public-subnet" { name = local.subnet_name1 zone = "ru-central1-a" network_id = yandex_vpc_network.my-vpc.id v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_subnet" "private-subnet" { name = local.subnet_name2 zone = "ru-central1-a" network_id = yandex_vpc_network.my-vpc.id v4_cidr_blocks = ["192.168.2.0/24"] route_table_id = yandex_vpc_route_table.nat-instance-route.id } # Создание группы безопасности resource "yandex_vpc_security_group" "nat-instance-sg" { name = local.sg_nat_name network_id = yandex_vpc_network.my-vpc.id egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" description = "ssh" v4_cidr_blocks = ["0.0.0.0/0"] port = 22 } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } } # Добавление готового образа ВМ resource "yandex_compute_image" "ubuntu-1804-lts" { source_family = "ubuntu-1804-lts" } resource "yandex_compute_image" "nat-instance-ubuntu" { source_family = "nat-instance-ubuntu" } # Создание загрузочных дисков resource "yandex_compute_disk" "boot-disk-ubuntu" { name = "boot-disk-ubuntu" type = "network-hdd" zone = "ru-central1-a" size = "20" image_id = yandex_compute_image.ubuntu-1804-lts.id } resource "yandex_compute_disk" "boot-disk-nat" { name = "boot-disk-nat" type = "network-hdd" zone = "ru-central1-a" size = "20" image_id = yandex_compute_image.nat-instance-ubuntu.id } # Создание ВМ resource "yandex_compute_instance" "test-vm" { name = local.vm_test_name platform_id = "standard-v3" zone = "ru-central1-a" resources { core_fraction = 20 cores = 2 memory = 2 } boot_disk { disk_id = yandex_compute_disk.boot-disk-ubuntu.id } network_interface { subnet_id = yandex_vpc_subnet.private-subnet.id security_group_ids = [yandex_vpc_security_group.nat-instance-sg.id] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh-authorized-keys:\n - ${file("${var.ssh_key_path}")}" } } # Создание ВМ NAT resource "yandex_compute_instance" "nat-instance" { name = local.vm_nat_name platform_id = "standard-v3" zone = "ru-central1-a" resources { core_fraction = 20 cores = 2 memory = 2 } boot_disk { disk_id = yandex_compute_disk.boot-disk-nat.id } network_interface { subnet_id = yandex_vpc_subnet.public-subnet.id security_group_ids = [yandex_vpc_security_group.nat-instance-sg.id] nat = true } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user_nat}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh-authorized-keys:\n - ${file("${var.ssh_key_path}")}" } } # Создание таблицы маршрутизации и статического маршрута resource "yandex_vpc_route_table" "nat-instance-route" { name = "nat-instance-route" network_id = yandex_vpc_network.my-vpc.id static_route { destination_prefix = "0.0.0.0/0" next_hop_address = yandex_compute_instance.nat-instance.network_interface.0.ip_address } }
-
Создайте в папке файл с пользовательскими данными
nat-instance.auto.tfvars
:nat-instance.auto.tfvarsfolder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" vm_user_nat = "<имя_пользователя_ВМ_NAT>" ssh_key_path = "<путь_к_публичному_SSH-ключу>"
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
В файле
nat-instance.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.vm_user_nat
— имя пользователя ВМ с NAT.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-