Маршрутизация через NAT-инстанс с помощью Terraform
Примечание
В регионе Казахстан доступна только зона доступности kz1-a
.
Чтобы настроить маршрутизацию через NAT-инстанс с помощью Terraform:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки NAT-инстанса входят:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы создать инфраструктуру с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовая конфигурацияВручную-
Склонируйте репозиторий с конфигурационными файлами:
git clone https://github.com/yandex-cloud-examples/yc-compute-nat-instance.git
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
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.tfvars
folder_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.
-
Проверьте работу 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-инстанса и перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
nat-instance.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-