Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Практические руководства
  • Веб-сервис
    • Все руководства
    • Статический сайт в Object Storage
    • Сайт на LAMP- или LEMP-стеке
    • Отказоустойчивый сайт с балансировкой нагрузки через Network Load Balancer
    • Отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer
    • Сайт на базе Joomla с БД PostgreSQL
    • Сайт на WordPress
    • Сайт на WordPress с БД MySQL
    • Перенос WordPress сайта с хостинга в Yandex Cloud
    • Веб-сайт на базе 1С-Битрикс
    • Организация виртуального хостинга
    • Создание балансировщика с защитой от DDoS
    • Публикация обновлений для игр
    • Интеграция L7-балансировщика с Cloud CDN и Object Storage
    • Сине-зеленое и канареечное развертывание версий сервиса
    • Терминирование TLS-соединений
  • Интернет-магазины
    • Все руководства
    • Интернет-магазин на 1С-Битрикс
    • Интернет-магазин на Opencart
  • Архив данных
    • Все руководства
    • Однонодовый файловый сервер
    • Настройка SFTP-сервера на Centos 7
    • Резервное копирование в Object Storage через Acronis
    • Резервное копирование в Object Storage с помощью CloudBerry Desktop Backup
    • Резервное копирование в Object Storage через Duplicati
    • Резервное копирование в Object Storage с помощью Bacula
    • Резервное копирование в Object Storage с помощью Veritas Backup Exec
    • Распознавание архива изображений в Yandex Vision
  • Тестовая среда
    • Все руководства
    • Тестирование приложений с помощью GitLab
    • Создание тестовых ВМ через GitLab CI
    • Высокопроизводительные вычисления на прерываемых виртуальных машинах
    • Эмуляция множества IoT-устройств
    • Нагрузочное тестирование gRPC-сервиса
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • HTTPS-тест с постоянной нагрузкой с помощью Phantom
    • HTTPS-тест со ступенчатой нагрузкой с помощью Pandora
    • Нагрузочное тестирование с нескольких агентов
  • Управление инфраструктурой
    • Все руководства
    • Начало работы с Terraform
    • Загрузка состояний Terraform в Object Storage
    • Начало работы с Packer
    • Сборка образа ВМ с набором инфраструктурных инструментов с помощью Packer
    • Автоматизация сборки образов ВМ с помощью Jenkins
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Создание кластера Linux-серверов «1С:Предприятия» с кластером Managed Service for PostgreSQL
    • Миграция в Yandex Cloud с помощью Hystax Acura
    • Защита от сбоев с помощью Hystax Acura
    • Настройка синхронизации времени NTP
    • Работа с группой ВМ с автоматическим масштабированием
    • Автомасштабирование группы ВМ по расписанию
    • Автомасштабирование группы ВМ для обработки сообщений из очереди
    • Обновление группы ВМ под нагрузкой
    • Передача логов с ВМ в Yandex Cloud Logging
    • Резервное копирование ВМ с помощью Hystax Acura Backup
    • Настройка отказоустойчивой архитектуры в Yandex Cloud
    • Создание SAP-программы в Yandex Cloud
    • Настройка локального кеширующего DNS-резолвера
    • Миграция DNS-зон из Яндекс 360
    • Интеграция с корпоративным сервисом DNS
    • Создание веб-хука резолвера ACME для ответов на DNS01-проверки
    • Запись логов балансировщика в PostgreSQL
    • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
  • Построение Data Platform
    • Все руководства
    • Миграция базы данных из стороннего кластера Apache Kafka® в Yandex Managed Service for Apache Kafka®
    • Поставка данных из Yandex Managed Service for MySQL в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for ClickHouse с помощью Yandex Data Transfer
    • Перенос данных между кластерами Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for MySQL в Yandex Managed Service for Apache Kafka® с помощью Debezium
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for Apache Kafka® с помощью Debezium
    • Настройка Kafka Connect для работы с кластером Yandex Managed Service for Apache Kafka®
    • Управление схемами данных в Yandex Managed Service for Apache Kafka®
    • Использование Managed Schema Registry с Yandex Managed Service for Apache Kafka®
    • Использование Confluent Schema Registry с Yandex Managed Service for Apache Kafka®
    • Миграция базы данных из MySQL в ClickHouse с помощью Yandex Data Transfer
    • Асинхронная репликация данных из PostgreSQL в ClickHouse
    • Обмен данными между Yandex Managed Service for ClickHouse и Yandex Data Proc
    • Настройка Yandex Managed Service for ClickHouse для Graphite
    • Получение данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for ClickHouse
    • Получение данных из RabbitMQ в Yandex Managed Service for ClickHouse
    • Сохранение потока данных Yandex Data Streams в Yandex Managed Service for ClickHouse
    • Использование гибридного хранилища в Yandex Managed Service for ClickHouse
    • Шардирование таблиц Yandex Managed Service for ClickHouse
    • Настройка Yandex Cloud DNS для доступа к кластерам управляемых баз данных из других облачных сетей
    • Настройка Yandex Cloud DNS для доступа к кластеру Yandex Managed Service for ClickHouse из других облачных сетей
    • Импорт данных из Yandex Managed Service for MySQL в Yandex Data Proc с помощью Sqoop
    • Импорт данных из Yandex Managed Service for PostgreSQL в Yandex Data Proc с помощью Sqoop
    • Использование скриптов инициализации для настройки GeeseFS в Yandex Data Proc
    • Миграция данных из стороннего кластера Elasticsearch в Yandex Managed Service for Elasticsearch с помощью Reindex API
    • Миграция коллекций из стороннего кластера MongoDB в Yandex Managed Service for MongoDB
    • Миграция данных в Yandex Managed Service for MongoDB
    • Шардирование коллекций MongoDB
    • Анализ производительности и оптимизация MongoDB
    • Миграция базы данных из стороннего кластера MySQL в кластер Yandex Managed Service for MySQL
    • Анализ производительности и оптимизация Managed Service for MySQL
    • Синхронизация данных из стороннего кластера MySQL в Yandex Managed Service for MySQL с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for MySQL в сторонний кластер MySQL
    • Миграция базы данных из Yandex Managed Service for MySQL в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for MySQL в Yandex Object Storage с помощью Yandex Data Transfer
    • Создание кластера PostgreSQL для 1С
    • Анализ производительности и оптимизация Managed Service for PostgreSQL
    • Миграция базы данных из стороннего кластера PostgreSQL в кластер Yandex Managed Service for PostgreSQL
    • Миграция базы данных из Managed Service for PostgreSQL
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for PostgreSQL в Yandex Object Storage
    • Миграция базы данных из Greenplum® в ClickHouse
    • Миграция базы данных из Greenplum® в PostgreSQL
    • Миграция базы данных из стороннего кластера Redis в Yandex Managed Service for Redis
    • Использование кластера Managed Service for Redis в качестве хранилища сессий PHP
  • Продукты Microsoft в Yandex Cloud
    • Все руководства
    • Развертывание Active Directory
    • Развертывание Microsoft Exchange
    • Развертывание Remote Desktop Services
    • Развертывание группы доступности Always On с внутренним сетевым балансировщиком
    • Развертывание Remote Desktop Gateway
  • Сетевая инфраструктура
    • Все руководства
    • Архитектура и защита базового интернет-сервиса
    • Настройки DHCP для работы с корпоративным DNS-сервером
    • Маршрутизация с помощью NAT-инстанса
    • Создание туннеля IPSec VPN
    • Установка виртуального роутера Cisco CSR 1000v
    • Установка виртуального роутера Mikrotik CHR
    • Соединение с облачной сетью при помощи OpenVPN
    • Создание и настройка шлюза UserGate в режиме прокси-сервера
    • Создание и настройка шлюза UserGate в режиме межсетевого экрана
    • Настройка сети для Yandex Data Proc
  • Визуализация и анализ данных
    • Все руководства
    • Визуализация данных из CSV-файла
    • Создание и публикация диаграммы с картой Москвы из CSV-файла
    • Анализ продаж сети магазинов из БД ClickHouse
    • Анализ открытых данных ДТП на дорогах России
    • Анализ продаж и локаций пиццерий на данных из БД ClickHouse и Marketplace
    • Веб-аналитика с подключением к Яндекс Метрике
    • Веб-аналитика с расчетом воронок и когорт на данных Яндекс Метрики
    • Аналитика мобильного приложения на данных AppMetrica
    • Анализ статистики подкастов Яндекс Музыки (для авторов подкастов)
    • Визуализация данных с помощью SQL-чарта
    • Анализ customer journey мобильного приложения на данных AppMetrica
    • Анализ логов Object Storage при помощи DataLens
  • Интернет вещей
    • Руководства по работе с интернетом вещей
    • Мониторинг состояния географически распределенных устройств
    • Мониторинг показаний датчиков и уведомления о событиях
  • Бессерверные технологии
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Хранение журналов работы приложения
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка пользовательской интеграции в API Gateway
    • Разработка CRUD API для сервиса фильмов
    • Разработка навыка Алисы и сайта с авторизацией
  1. Веб-сервис
  2. Создание балансировщика с защитой от DDoS

Создание балансировщика с защитой от DDoS

Статья создана
Yandex Cloud
,
улучшена
Dmitry A.
  • Подготовьте облако к работе
  • Создайте облачную сеть
  • Создайте группы безопасности
  • Создайте группу ВМ
  • Зарезервируйте статический публичный IP-адрес
  • Создайте группу бэкендов
  • Создайте HTTP-роутер
  • Создайте балансировщик
  • Проверьте работу балансировщика
  • Удалите созданные ресурсы
  • Как создать инфраструктуру с помощью Terraform

В этом сценарии вы создадите L7-балансировщик с обработчиком, который имеет публичный IP-адрес с функцией защиты от DDoS-атак.

Чтобы создать L7-балансировщик с защитой от DDoS-атак:

  1. Подготовьте облако к работе.
  2. Создайте облачную сеть.
  3. Создайте группы безопасности.
  4. Создайте группу ВМ.
  5. Зарезервируйте статический публичный IP-адрес.
  6. Создайте группу бэкендов.
  7. Создайте HTTP-роутер.
  8. Создайте L7-балансировщик.
  9. Проверьте работу балансировщика.

Если созданные ресурсы вам больше не нужны, удалите их.

Также инфраструктуру для балансировщика с защитой от DDoS можно развернуть через Terraform с помощью готового файла конфигурации.

Подготовьте облако к работе

Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Создайте облачную сеть

Все ресурсы, созданные в сценарии, будут относиться к одной облачной сети.

Чтобы создать сеть:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Virtual Private Cloud.
  2. Нажмите кнопку Создать сеть.
  3. Укажите имя сети: ddos-network.
  4. В поле Дополнительно выберите опцию Создать подсети.
  5. Нажмите кнопку Создать сеть.

Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Создайте облачную сеть в каталоге по умолчанию:

    yc vpc network create \
      --name ddos-network
    

    Подробнее о команде yc vpc network create читайте в справочнике CLI.

  2. Создайте подсети в каждой зоне доступности, указав идентификатор облачной сети с помощью флага --network-name:

    yc vpc subnet create \
      --name ddos-network-ru-a \
      --network-name ddos-network \
      --zone ru-central1-a \
      --range 192.168.0.0/24
    
    yc vpc subnet create \
      --name ddos-network-ru-b \
      --network-name ddos-network \
      --zone ru-central1-b \
      --range 192.168.1.0/24
    
    yc vpc subnet create \
      --name ddos-network-ru-c \
      --network-name ddos-network \
      --zone ru-central1-c \
      --range 192.168.2.0/24
    

    Подробнее о команде yc vpc subnet create читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Создайте группы безопасности

Примечание

Группы безопасности находятся на стадии Preview. Если они недоступны в вашей сети, для ресурсов будет разрешен весь входящий и исходящий трафик и дополнительной настройки не требуется.

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

Чтобы создать группы безопасности:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Virtual Private Cloud.

  2. Откройте вкладку Группы безопасности.

  3. Создайте группу безопасности для балансировщика:

    1. Нажмите кнопку Создать группу.

    2. Укажите Имя группы: ddos-sg-balancer.

    3. Выберите Сеть ddos-network.

    4. В блоке Правила создайте следующие правила по инструкции под таблицей:

      Направление
      трафика
      Описание Диапазон
      портов
      Протокол Тип источника /
      назначения
      Источник /
      назначение
      Исходящий any Весь Любой 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
      Входящий healthchecks 30080 TCP Проверки состояния балансировщика —
      1. Выберите вкладку Исходящий трафик или Входящий трафик.

      2. Нажмите кнопку Добавить правило.

      3. В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.

      4. В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.

      5. В поле Назначение или Источник выберите назначение правила:

        • CIDR — правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.
        • Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
        • Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
      6. Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.

    5. Нажмите кнопку Сохранить.

  4. Аналогично создайте группу безопасности для ВМ с именем ddos-sg-vms, той же сетью ddos-network и следующими правилами:

    Направление
    трафика
    Описание Диапазон
    портов
    Протокол Тип источника Источник
    Входящий balancer 80 TCP Группа безопасности ddos-sg-balancer
    Входящий ssh 22 TCP CIDR 0.0.0.0/0

Чтобы создать группу безопасности для балансировщика, выполните команду:

yc vpc security-group create \
  --name ddos-sg-balancer \
  --rule "direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0]" \
  --rule "direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
  --rule "direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
  --rule "direction=ingress,port=30080,protocol=tcp,predefined=loadbalancer_healthchecks" \
  --network-name ddos-network

Чтобы создать группу безопасности для ВМ, выполните команду:

yc vpc security-group create \
  --name ddos-sg-vms \
  --rule "direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
  --rule "direction=ingress,port=80,protocol=tcp,security-group-id=<идентификатор группы безопасности ddos-sg-balancer>" \
  --network-name ddos-network

Подробнее о команде yc vpc security-group create читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Создайте группу ВМ

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

Чтобы создать группу ВМ:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Compute Cloud.

  2. Откройте вкладку Группы виртуальных машин и нажмите кнопку Создать группу.

  3. В блоке Базовые параметры:

    • Введите Имя группы ВМ: ddos-group.
    • Выберите сервисный аккаунт из списка или создайте новый. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль editor. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.
  4. В блоке Распределение выберите несколько зон доступности, чтобы обеспечить отказоустойчивость хостинга.

  5. В блоке Шаблон виртуальной машины нажмите кнопку Задать и укажите конфигурацию базовой ВМ:

    • В блоке Базовые параметры введите Описание шаблона.

    • В блоке Выбор образа/загрузочного диска откройте вкладку Cloud Marketplace и нажмите кнопку Посмотреть больше. Выберите продукт LEMP и нажмите кнопку Использовать.

    • В блоке Диски укажите:

      • Тип диска — HDD.
      • Размер диска — 3 ГБ.
    • В блоке Вычислительные ресурсы укажите:

      • Платформа — Intel Cascade Lake.
      • vCPU — 2.
      • Гарантированная доля vCPU — 5%.
      • RAM — 1 ГБ.
    • В блоке Сетевые настройки:

      • Выберите облачную сеть ddos-network и ее подсети.
      • В поле Публичный адрес выберите Автоматически.
      • Выберите группу безопасности ddos-sg-vms.
    • В блоке Доступ укажите данные для доступа на виртуальную машину:

      • В поле Логин введите имя пользователя.
      • В поле SSH-ключ вставьте содержимое файла открытого ключа.

      Для подключения по SSH необходимо создать пару ключей. Подробнее в разделе Создание пары ключей SSH.

    • Нажмите кнопку Сохранить.

  6. В блоке Масштабирование укажите Размер группы ВМ — 2.

  7. В блоке Интеграция с Application Load Balancer выберите опцию Создать целевую группу и укажите имя группы: tg-ddos. Подробнее о целевых группах.

  8. Нажмите кнопку Создать.

  1. Получите идентификаторы ресурсов, необходимые для создания группы ВМ, с помощью команд:

    • yc iam service-account get <имя сервисного аккаунта> — для сервисного аккаунта;
    • yc vpc network get ddos-network — для сети ddos-network;
    • yc vpc subnet get <имя подсети> — для подсетей ddos-network-ru-a, ddos-network-ru-b и ddos-network-ru-c;
    • yc compute image get-latest-by-family lemp --folder-id standard-images — для образа загрузочного диска;
    • yc vpc security-group get ddos-sg-vms — для группы безопасности ddos-sg-vms.
  2. Создайте YAML-файл с именем specification.yaml.

  3. Добавьте в него описание конфигурации базовой виртуальной машины:

    name: ddos-group
    service_account_id: <идентификатор сервисного аккаунта>
    description: "DDoS alb scenario"
    instance_template:
        platform_id: standard-v3
        resources_spec:
            memory: 1g
            cores: 2
            core_fraction: 5
        boot_disk_spec:
            mode: READ_WRITE
            disk_spec:
                image_id: <идентификатор образа>
                type_id: network-hdd
                size: 3g
        network_interface_specs:
            - network_id: <идентификатор облачной сети>
              subnet_ids:
                - <идентификатор подсети в зоне ru-central1-a>
                - <идентификатор подсети в зоне ru-central1-b>
                - <идентификатор подсети в зоне ru-central1-c>
              primary_v4_address_spec: {}
              security_group_ids: 
                - <идентификатор группы безопасности ddos-sg-vms>
    deploy_policy:
        max_unavailable: 1
        max_expansion: 0
    scale_policy:
        fixed_scale:
            size: 2
    allocation_policy:
        zones:
            - zone_id: ru-central1-a
            - zone_id: ru-central1-b
            - zone_id: ru-central1-c
    application_load_balancer_spec:
        target_group_spec:
            name: tg-ddos
    
  4. Создайте группу виртуальных машин в каталоге по умолчанию:

    yc compute instance-group create \
      --file specification.yaml
    

    Результат:

    done (25s)
    id: cl1qjhlcdofg6rujs29d
    folder_id: b1g86q4m5vej8lkljme5
    created_at: "2021-08-30T19:25:02.031Z"
    name: ddos-group
    description: DDoS scenario
    instance_template:
      platform_id: standard-v2
      resources_spec:
        memory: "1073741824"
        cores: "2"
        core_fraction: "5"
      boot_disk_spec:
        mode: READ_WRITE
        disk_spec:
          type_id: network-hdd
          size: "3221225472"
          image_id: fd8r6kq84o7be9tm50ms
      network_interface_specs:
      - network_id: enp3srbi9u49pjvcejnb
        subnet_ids:
        - e9b17pi15695qc0mngl2
        - e2lt87g1rligsso4ketj
        - b0c7kl8riq244aq2mfc1
        primary_v4_address_spec: {}
        security_group_ids:
        - enpi08rif04dcugga5e3
      scheduling_policy: {}
    scale_policy:
      fixed_scale:
        size: "2"
    deploy_policy:
      max_unavailable: "1"
      startup_duration: 0s
      strategy: PROACTIVE
    allocation_policy:
      zones:
      - zone_id: ru-central1-a
      - zone_id: ru-central1-b
      - zone_id: ru-central1-c
    load_balancer_state: {}
    managed_instances_state:
      target_size: "2"
    service_account_id: aje2stn6id9k43qk7n7l
    status: ACTIVE
    application_load_balancer_spec:
      target_group_spec:
        name: first-target-group
    application_load_balancer_state:
      target_group_id: ds78imh0ds2eluau7ojp
    

    Подробнее о команде yc compute instance-group create читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Зарезервируйте статический публичный IP-адрес

Примечание

Этот шаг нельзя выполнить через интерфейс командной строки (CLI).

Чтобы защитить балансировщик от DDoS-атак, необходимо зарезервировать для него статический публичный IP-адрес с опцией Защита от DDoS:

Консоль управления
Terraform
  1. В консоли управления выберите сервис Virtual Private Cloud.
  2. Откройте вкладку IP-адреса и нажмите кнопку Зарезервировать адрес.
  3. Выберите зону доступности, в которой нужно зарезервировать адрес.
  4. Включите опцию Защита от DDoS.
  5. Нажмите кнопку Зарезервировать.

См. раздел Как создать инфраструктуру с помощью Terraform.

Создайте группу бэкендов

Целевую группу, созданную вместе с группой ВМ, нужно привязать к группе бэкендов с настройками распределения трафика.

Для бэкендов в группах будут созданы проверки состояния: балансировщик будет периодически отправлять проверочные запросы к ВМ и ожидать ответа в течение определенного периода.

Чтобы создать группу бэкендов:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Application Load Balancer.
  2. Откройте вкладку Группы бэкендов. Нажмите кнопку Создать группу бэкендов.
  3. Укажите Имя группы бэкендов: ddos-backend-group.
  4. В блоке Бэкенды нажмите кнопку Добавить.
  5. Укажите Имя бэкенда: backend-1.
  6. В поле Целевая группа выберите группу tg-ddos.
  7. Укажите Порт, на котором ВМ бэкенда будут принимать входящий трафик от балансировщика: 80.
  8. Нажмите кнопку Добавить проверку состояния.
  9. Укажите Порт, на котором ВМ бэкенда будут принимать проверочные соединения: 80.
  10. Укажите Путь, к которому будет обращаться балансировщик при проверке состояния: /.
  11. Нажмите кнопку Создать.

Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Создайте группу бэкендов:

    yc alb backend-group create ddos-backend-group
    

    Результат:

    id: a5dg2cv4ngne8575fb1p
    name: ddos-backend-group
    folder_id: aoerb349v3h4bupphtaf
    created_at: "2021-08-08T20:46:21.688940670Z"
    

    Подробнее о команде yc alb backend-group create читайте в справочнике CLI.

  2. Добавьте в группу бэкенд и проверку состояния:

    yc alb backend-group add-http-backend \
      --backend-group-name ddos-backend-group \
      --name backend-1 \
      --weight 1 \
      --port 80 \
      --target-group-id=<идентификатор целевой группы> \
      --http-healthcheck timeout=1s,interval=1s,port=80,path=/
    

    Где:

    • --backend-group-name — имя группы бэкендов.
    • --name — имя бэкенда.
    • --weight — вес бэкенда.
    • --port — порт.
    • --target-group-id — идентификатор целевой группы.
    • --http-healthcheck — параметры проверки состояния ресурсов.
      • port — порт.
      • timeout — таймаут.
      • interval — интервал.
      • host — адрес хоста.
      • path — путь.

    Результат:

    done (21s)
    id: ds7fea2pggr2e2vlncd5
    name: ddos-backend-group
    folder_id: b1g86q4m5vej8lkljme5
    http:
    backends:
    - name: backend-1
      backend_weight: "1"
      port: "80"
      target_groups:
        target_group_ids:
        - ds78ate00f8e7c0p1rem
      healthchecks:
      - timeout: 1s
        interval: 1s
        healthcheck_port: "80"
        http:
          path: /
    created_at: "2021-08-08T07:59:22.922603189Z"
    

    Подробнее о команде yc alb backend-group add-http-backend читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Создайте HTTP-роутер

Группу бэкендов нужно привязать к HTTP-роутеру с правилами маршрутизации HTTP-запросов.

Чтобы создать HTTP-роутер и добавить в него маршрут:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Application Load Balancer.
  2. Откройте вкладку HTTP-роутеры. Нажмите кнопку Создать HTTP-роутер.
  3. Укажите Имя HTTP-роутера: ddos-router.
  4. Нажмите кнопку Добавить виртуальный хост.
  5. Укажите Имя виртуального хоста: ddos-host.
  6. Укажите значение Authority: alb-with-ddos.com.
  7. Нажмите кнопку Добавить маршрут.
  8. Введите Имя: route-1.
  9. В поле Путь выберите Начинается с и укажите путь /.
  10. В поле Действие оставьте Маршрутизация.
  11. В списке Группа бэкендов выберите созданную ранее группу.
  12. Остальные настройки оставьте без изменений и нажмите кнопку Создать.

Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Выполните команду:

    yc alb http-router create ddos-router
    

    Результат:

    id: a5dcsselagj4o2v4a6e7
    name: ddos-router
    folder_id: aoerb349v3h4bupphtaf
    created_at: "2021-08-08T21:04:59.438292069Z"
    

    Подробнее о команде yc alb http-router create читайте в справочнике CLI.

  2. Создайте виртуальный хост, указав имя HTTP-роутера:

    yc alb virtual-host create ddos-host \
      --http-router-name ddos-router
      --authority alb-with-ddos.com
    

    Подробнее о команде yc alb virtual-host create читайте в справочнике CLI.

  3. Добавьте маршрут, указав имя роутера и параметры маршрутизации:

    yc alb virtual-host append-http-route route-1 \
      --virtual-host-name ddos-host \
      --http-router-name ddos-router \
      --prefix-path-match / \
      --backend-group-name ddos-backend-group \
      --request-timeout 60s
    

    Результат:

    done (1s)
     name: ddos-host
     routes:
     - name: route-1
       http:
         match:
           path:
             prefix_match: /
         route:
           backend_group_id: ds7fea2pggr2e2vlncd5
           timeout: 60s
    

    Подробнее о команде yc alb virtual-host append-http-route читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Создайте балансировщик

Чтобы создать балансировщик:

Консоль управления
CLI
Terraform
  1. В консоли управления выберите сервис Application Load Balancer.

  2. В меню слева выберите Балансировщики.

  3. Нажмите кнопку Создать L7-балансировщик.

  4. Введите имя балансировщика: ddos-protect-alb.

  5. В блоке Сетевые настройки выберите сеть ddos-network и группу безопасности ddos-sg-balancer.

  6. В блоке Размещение выберите подсети для узлов балансировщика в каждой зоне доступности и включите передачу трафика.

  7. В блоке Обработчики нажмите кнопку Добавить обработчик. Задайте настройки обработчика:

    1. Введите имя обработчика: ddos-listener.
    2. В блоке Настройки публичного IP-адреса включите передачу трафика.
    3. Укажите порт 80.
    4. Выберите тип Список и укажите зарезервированный ранее адрес с защитой от DDoS.
  8. В поле HTTP-роутер выберите ddos-router.

  9. Нажмите кнопку Создать.

  1. Создайте балансировщик с узлами в подсетях облачной сети:

    yc alb load-balancer create ddos-protect-alb \
      --network-name ddos-network \
      --location subnet-name=ddos-network-ru-a,zone=ru-central1-a \
      --location subnet-name=ddos-network-ru-b,zone=ru-central1-b \
      --location subnet-name=ddos-network-ru-c,zone=ru-central1-c
    

    Подробнее о команде yc alb load-balancer create читайте в справочнике CLI.

  2. Добавьте обработчик:

    yc alb load-balancer add-listener ddos-protect-alb \
      --listener-name ddos-listener \
      --http-router-id <идентификатор HTTP-роутера> \
      --external-ipv4-endpoint port=80, address=<IP-адрес с защитой от DDoS>
    

    Подробнее о команде yc alb load-balancer add-listener читайте в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Проверьте работу балансировщика

Проверьте доступность сервиса на хосте alb-with-ddos.com. Для этого выполните команду:

curl -H "Host: alb-with-ddos.com" http://<IP-адрес L7-балансировщика>

Результат:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Удалите созданные ресурсы

Чтобы остановить работу хостинга и перестать платить за созданные ресурсы:

  1. Удалите нетарифицируемые ресурсы, которые блокируют удаление тарифицируемых ресурсов:

    1. Удалите L7-балансировщик ddos-protect-alb.
    2. Удалите HTTP-роутер ddos-router.
    3. Удалите группу бэкендов ddos-backend-group.
  2. Удалите группу виртуальных машин ddos-group.

  3. Удалите зарезервированный статический публичный адрес.

Как создать инфраструктуру с помощью Terraform

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией Mozilla Public License.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

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

Чтобы создать L7-балансировщик с защитой от DDoS-атак с помощью Terraform:

  1. Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  2. Подготовьте файл с описанием инфраструктуры:

    Готовый архив
    Создание вручную
    1. Создайте папку для файла с описанием инфраструктуры.
    2. Скачайте архив (3 КБ).
    3. Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл alb-with-ddos-protection.tf и файл с пользовательскими данными alb-with-ddos-protection.auto.tfvars.
    1. Создайте папку для файла с описанием инфраструктуры.

    2. Создайте в папке конфигурационный файл alb-with-ddos-protection.tf:

      Содержимое файла alb-with-ddos-protection.tf
      variable "folder_id" {
        type = string
      }
      
      variable "vm_user" {
        type = string
      }
      
      variable "ssh_key_path" {
        type = string
      }
      
      locals {
        network_name     = "ddos-network"
        subnet_name1     = "subnet-1"
        subnet_name2     = "subnet-2"
        sa_name          = "ig-sa"
        sg_balancer_name = "ddos-sg-balancer"
        sg_vm_name       = "ddos-sg-vms"
        vm_name          = "ddos-group"
        tg_name          = "tg-ddos"
        address_name     = "ddos-addr"
        abg_name         = "ddos-backend-group"
        backend_name     = "backend-1"
        router_name      = "ddos-router"
        vh_name          = "ddos-host"
        authority_domain = ["alb-with-ddos.com"]
        route_name       = "route-1"
        alb_name         = "ddos-protect-alb"
        listener_name    = "ddos-listener"
      }
      
      terraform {
        required_providers {
          yandex = {
            source  = "yandex-cloud/yandex"
            version = ">= 0.47.0"
          }
        }
      }
      
      provider "yandex" {
        folder_id = var.folder_id
      }
      
      resource "yandex_iam_service_account" "ig-sa" {
        name = local.sa_name
      }
      
      resource "yandex_resourcemanager_folder_iam_binding" "editor" {
        folder_id = var.folder_id
        role      = "editor"
        members   = [
          "serviceAccount:${yandex_iam_service_account.ig-sa.id}",
        ]
      }
      
      resource "yandex_vpc_network" "ddos-network" {
        name = local.network_name
      }
      
      resource "yandex_vpc_subnet" "subnet-1" {
        name           = local.subnet_name1
        zone           = "ru-central1-a"
        network_id     = yandex_vpc_network.ddos-network.id
        v4_cidr_blocks = ["192.168.1.0/24"]
      }
      
      resource "yandex_vpc_subnet" "subnet-2" {
        name           = local.subnet_name2
        zone           = "ru-central1-b"
        network_id     = yandex_vpc_network.ddos-network.id
        v4_cidr_blocks = ["192.168.2.0/24"]
      }
      
      resource "yandex_vpc_security_group" "ddos-sg-balancer" {
        name       = local.sg_balancer_name
        network_id = yandex_vpc_network.ddos-network.id
      
        egress {
          protocol       = "ANY"
          description    = "any"
          v4_cidr_blocks = ["0.0.0.0/0"]
        }
      
        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
        }
      
        ingress {
          protocol          = "TCP"
          description       = "healthchecks"
          predefined_target = "loadbalancer_healthchecks"
          port              = 30080
        }
      }
      
      resource "yandex_vpc_security_group" "ddos-sg-vms" {
        name       = local.sg_vm_name
        network_id = yandex_vpc_network.ddos-network.id
      
        ingress {
          protocol          = "TCP"
          description       = "balancer"
          security_group_id = yandex_vpc_security_group.ddos-sg-balancer.id
          port              = 80
        }
      
        ingress {
          protocol       = "TCP"
          description    = "ssh"
          v4_cidr_blocks = ["0.0.0.0/0"]
          port           = 22
        }
      }
      
      resource "yandex_compute_image" "lemp" {
        source_family = "lemp"
      }
      
      resource "yandex_compute_instance_group" "ddos-group" {
        name               = local.vm_name
        folder_id          = var.folder_id
        service_account_id = yandex_iam_service_account.ig-sa.id
        instance_template {
          platform_id        = "standard-v2"
          service_account_id = yandex_iam_service_account.ig-sa.id
          resources {
            core_fraction = 5
            memory        = 1
            cores         = 2
          }
      
          boot_disk {
            mode = "READ_WRITE"
            initialize_params {
              image_id = yandex_compute_image.lemp.id
              type     = "network-hdd"
              size     = 3
            }
          }
      
          network_interface {
            network_id         = yandex_vpc_network.ddos-network.id
            subnet_ids         = [yandex_vpc_subnet.subnet-1.id,yandex_vpc_subnet.subnet-2.id]
            nat                = true
            security_group_ids = [yandex_vpc_security_group.ddos-sg-vms.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}")}"
          }
        }
      
        scale_policy {
          fixed_scale {
            size = 2
          }
        }
      
        allocation_policy {
          zones = ["ru-central1-a", "ru-central1-b"]
        }
      
        deploy_policy {
          max_unavailable = 1
          max_expansion   = 0
        }
      
        application_load_balancer {
          target_group_name = local.tg_name
        }
      }
      
      resource "yandex_vpc_address" "ddos-addr" {
        name = local.address_name
      
        external_ipv4_address {
          zone_id                  = "ru-central1-a"
          ddos_protection_provider = "qrator"
        }
      }
      
      resource "yandex_alb_backend_group" "ddos-backend-group" {
        name = local.abg_name
      
        http_backend {
          name             = local.backend_name
          port             = 80
          target_group_ids = [yandex_compute_instance_group.ddos-group.application_load_balancer.0.target_group_id]
          healthcheck {
            timeout          = "10s"
            interval         = "2s"
            healthcheck_port = 80
            http_healthcheck {
              path = "/"
            }
          }
        }
      }
      
      resource "yandex_alb_http_router" "ddos-router" {
        name   = local.router_name
      }
      
      resource "yandex_alb_virtual_host" "ddos-host" {
        name           = local.vh_name
        http_router_id = yandex_alb_http_router.ddos-router.id
        authority      = local.authority_domain
        route {
          name = local.route_name
          http_route {
            http_route_action {
              backend_group_id = yandex_alb_backend_group.ddos-backend-group.id
            }
          }
        }
      }
      
      resource "yandex_alb_load_balancer" "ddos-protect-alb" {
        name               = local.alb_name
        network_id         = yandex_vpc_network.ddos-network.id
        security_group_ids = [yandex_vpc_security_group.ddos-sg-balancer.id]
      
        allocation_policy {
          location {
            zone_id   = "ru-central1-a"
            subnet_id = yandex_vpc_subnet.subnet-1.id
          }
      
          location {
            zone_id   = "ru-central1-b"
            subnet_id = yandex_vpc_subnet.subnet-2.id
          }
        }
      
        listener {
          name = local.listener_name
          endpoint {
            address {
              external_ipv4_address {
                address = yandex_vpc_address.ddos-addr.external_ipv4_address[0].address
              }
            }
            ports = [ 80 ]
          }
          http {
            handler {
              http_router_id = yandex_alb_http_router.ddos-router.id
            }
          }
        }
      }
      
    3. Создайте в папке файл с пользовательскими данными alb-with-ddos-protection.auto.tfvars:

      Содержимое файла alb-with-ddos-protection.auto.tfvars
      folder_id    = "<идентификатор_каталога>"
      vm_user      = "<имя_пользователя_ВМ>"
      ssh_key_path = "<путь_к_публичному_SSH-ключу>"
      

    Примечание

    В конфигурационном файле используются группы безопасности, они находятся на стадии Preview. Запросите в технической поддержке доступ к этой функции или удалите в конфигурационном файле блоки ресурсов yandex_vpc_security_group и строки с параметрами security_group_ids.

    Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:

    • yandex_iam_service_account
    • yandex_resourcemanager_folder_iam_binding
    • yandex_vpc_network
    • yandex_vpc_subnet
    • yandex_vpc_security_group
    • yandex_compute_image
    • yandex_compute_instance_group
    • yandex_vpc_address
    • yandex_alb_backend_group
    • yandex_alb_http_router
    • yandex_alb_virtual_host
    • yandex_alb_load_balancer
  3. В файле alb-with-ddos-protection.auto.tfvars задайте пользовательские параметры:

    • folder_id — идентификатор каталога.
    • vm_user — имя пользователя ВМ.
    • ssh_key_path — путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
  4. Создайте ресурсы:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

  5. Проверьте работу балансировщика.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Подготовьте облако к работе
  • Создайте облачную сеть
  • Создайте группы безопасности
  • Создайте группу ВМ
  • Зарезервируйте статический публичный IP-адрес
  • Создайте группу бэкендов
  • Создайте HTTP-роутер
  • Создайте балансировщик
  • Проверьте работу балансировщика
  • Удалите созданные ресурсы
  • Как создать инфраструктуру с помощью Terraform