Создание L7-балансировщика с защитой от DDoS с помощью консоли управления или CLI
Чтобы создать балансировщик с защитой от DDoS c помощью консоли управления Yandex Cloud или CLI:
- Подготовьте облако к работе.
- Создайте облачную сеть.
- Создайте группы безопасности.
- Создайте группу виртуальных машин.
- Зарезервируйте статический публичный IP-адрес.
- Создайте группу бэкендов.
- Создайте HTTP-роутер.
- Создайте L7-балансировщик.
- Проверьте работу балансировщика.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для балансировщика с защитой от DDoS входят:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичного статического IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за фильтрацию входящего трафика на публичный IP-адрес с защитой от DDoS-атак (см. тарифы Yandex Virtual Private Cloud);
- плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer).
Создайте облачную сеть
Все ресурсы, созданные в практическом руководстве, будут относиться к одной облачной сети.
Чтобы создать сеть:
- В консоли управления
выберите сервис Virtual Private Cloud. - Нажмите кнопку Создать сеть.
- Укажите имя сети
ddos-network
. - В поле Дополнительно выберите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте облачную сеть в каталоге по умолчанию:
yc vpc network create \ --name ddos-network
Подробнее о команде
yc vpc network create
читайте в справочнике CLI. -
Создайте подсети в каждой зоне доступности, указав идентификатор облачной сети с помощью флага
--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-d \ --network-name ddos-network \ --zone ru-central1-d \ --range 192.168.2.0/24
Подробнее о команде
yc vpc subnet create
читайте в справочнике CLI.
Создайте группы безопасности
Группы безопасности содержат правила, которые разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик. В сценарии будут созданы две группы безопасности: для балансировщика и для всех ВМ.
Чтобы создать группы безопасности:
-
В консоли управления
выберите сервис Virtual Private Cloud. -
На панели слева выберите
Группы безопасности. -
Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу безопасности.
-
Укажите Имя группы безопасности:
ddos-sg-balancer
. -
Выберите Сеть
ddos-network
. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон портов Протокол Источник /
назначениеДобавить CIDR Исходящий
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
Проверки состояния балансировщика
— -
Выберите вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
-
В поле Протокол укажите нужный протокол или оставьте
Любой
, чтобы разрешить передачу трафика по всем протоколам. -
В поле Назначение или Источник выберите назначение правила:
CIDR
— правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.Группа безопасности
— правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.Проверки состояния балансировщика
— правило, которое позволяет балансировщику проверять состояние ВМ.
-
Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
-
Нажмите кнопку Сохранить.
-
-
Аналогично создайте группу безопасности для ВМ с именем
ddos-sg-vms
, той же сетьюddos-network
и следующими правилами:Направление
трафикаОписание Диапазон портов Протокол Источник CIDR блоки Входящий
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=<идентификатор_группы_безопасности>" \
--network-name ddos-network
Где security-group-id
— идентификатор группы безопасности ddos-sg-balancer
.
Подробнее о команде yc vpc security-group create
читайте в справочнике CLI.
Создайте группу ВМ
На ВМ из целевой группы развертываются бэкенды вашего приложения. Целевая группа ВМ будет подключена к балансировщику, чтобы на эндпоинты бэкендов вашего приложения можно было направлять запросы. В этом сценарии достаточно создать группу ВМ с минимальной конфигурацией.
Чтобы создать группу ВМ:
-
В консоли управления
выберите сервис Compute Cloud. -
На панели слева выберите
Группы виртуальных машин. Нажмите кнопку Создать группу виртуальных машин. -
В блоке Базовые параметры:
- Введите Имя группы ВМ:
ddos-group
. - Выберите сервисный аккаунт из списка или создайте новый. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль
editor
. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.
- Введите Имя группы ВМ:
-
В блоке Распределение выберите несколько зон доступности, чтобы обеспечить отказоустойчивость хостинга.
-
В блоке Шаблон виртуальной машины нажмите кнопку Задать и укажите конфигурацию базовой ВМ:
-
В блоке Общая информация введите Описание шаблона.
-
В блоке Образ загрузочного диска откройте вкладку Marketplace и нажмите кнопку Показать все продукты Marketplace. Выберите продукт LEMP и нажмите кнопку Использовать.
-
В блоке Диски укажите:
- Тип —
HDD
. - Размер диска —
3 ГБ
.
- Тип —
-
В блоке Вычислительные ресурсы укажите:
- Платформа —
Intel Cascade Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
5%
. - RAM —
1 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
- Выберите облачную сеть
ddos-network
и ее подсети. - В поле Публичный адрес выберите
Автоматически
. - Выберите группу безопасности
ddos-sg-vms
.
- Выберите облачную сеть
-
В блоке Доступ укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
Для подключения по SSH необходимо создать пару ключей. Подробнее в разделе Создание пары ключей SSH.
-
Нажмите кнопку Сохранить.
-
-
В блоке Масштабирование укажите Размер группы ВМ —
2
. -
В блоке Интеграция с Application Load Balancer выберите опцию Создать целевую группу и укажите имя группы:
tg-ddos
. Подробнее о целевых группах. -
Нажмите кнопку Создать.
-
Получите идентификаторы ресурсов, необходимые для создания группы ВМ, с помощью команд:
- 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-d
. - yc compute image get-latest-by-family lemp --folder-id standard-images — для образа загрузочного диска.
- yc vpc security-group get ddos-sg-vms — для группы безопасности
ddos-sg-vms
.
-
Создайте YAML-файл с именем
specification.yaml
. -
Добавьте в него описание конфигурации базовой ВМ:
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-d> primary_v4_address_spec: {} security_group_ids: - <идентификатор_группы_безопасности> 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-d application_load_balancer_spec: target_group_spec: name: tg-ddos
Где
security_group_ids
— идентификатор группы безопасностиddos-sg-vms
. -
Создайте группу ВМ в каталоге по умолчанию:
yc compute instance-group create \ --file specification.yaml
Результат:
done (25s) id: cl1qjhlcdofg******** folder_id: b1g86q4m5vej******** 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: fd8r6kq84o7b******** network_interface_specs: - network_id: enp3srbi9u49******** subnet_ids: - e9b17pi15695******** - e2lt87g1rlig******** - b0c7kl8riq24******** primary_v4_address_spec: {} security_group_ids: - enpi08rif04d******** 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-d load_balancer_state: {} managed_instances_state: target_size: "2" service_account_id: aje2stn6id9k******** status: ACTIVE application_load_balancer_spec: target_group_spec: name: first-target-group application_load_balancer_state: target_group_id: ds78imh0ds2e********
Подробнее о команде
yc compute instance-group create
читайте в справочнике CLI.
Зарезервируйте статический публичный IP-адрес
Примечание
Этот шаг нельзя выполнить через интерфейс командной строки (CLI).
Чтобы защитить балансировщик от DDoS-атак, необходимо зарезервировать для него статический публичный IP-адрес с опцией Защита от DDoS-атак:
- В консоли управления
выберите сервис Virtual Private Cloud. - На панели слева выберите
IP-адреса и нажмите кнопку Зарезервировать адрес. - Выберите зону доступности, в которой нужно зарезервировать IP-адрес.
- Включите опцию Защита от DDoS-атак.
- Нажмите кнопку Зарезервировать.
Создайте группу бэкендов
Целевую группу, созданную вместе с группой ВМ, нужно привязать к группе бэкендов с настройками распределения трафика.
Для бэкендов в группах будут созданы проверки состояния: балансировщик будет периодически отправлять проверочные запросы к ВМ и ожидать ответа в течение определенного периода.
Чтобы создать группу бэкендов:
- В консоли управления
выберите сервис Application Load Balancer. - На панели слева выберите
Группы бэкендов. Нажмите кнопку Создать группу бэкендов. - Укажите Имя группы бэкендов:
ddos-backend-group
. - В блоке Бэкенды нажмите кнопку Добавить.
- Укажите Имя бэкенда:
backend-1
. - В поле Целевые группы выберите группу
tg-ddos
. - Укажите Порт, на котором ВМ бэкенда будут принимать входящий трафик от балансировщика:
80
. - Нажмите кнопку Добавить проверку состояния.
- Укажите Порт, на котором ВМ бэкенда будут принимать проверочные соединения:
80
. - Укажите Путь, к которому будет обращаться балансировщик при проверке состояния:
/
. - Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте группу бэкендов:
yc alb backend-group create ddos-backend-group
Результат:
id: a5dg2cv4ngne******** name: ddos-backend-group folder_id: aoerb349v3h4******** created_at: "2021-08-08T20:46:21.688940670Z"
Подробнее о команде
yc alb backend-group create
читайте в справочнике CLI. -
Добавьте в группу бэкенд и проверку состояния:
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: ds7fea2pggr2******** name: ddos-backend-group folder_id: b1g86q4m5vej******** http: backends: - name: backend-1 backend_weight: "1" port: "80" target_groups: target_group_ids: - ds78ate00f8e******** 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.
Создайте HTTP-роутер
Группу бэкендов нужно привязать к HTTP-роутеру с правилами маршрутизации HTTP-запросов.
Чтобы создать HTTP-роутер и добавить в него маршрут:
- В консоли управления
выберите сервис Application Load Balancer. - На панели слева выберите
HTTP-роутеры. Нажмите кнопку Создать HTTP-роутер. - Укажите Имя HTTP-роутера:
ddos-router
. - Нажмите кнопку Добавить виртуальный хост.
- Укажите Имя виртуального хоста:
ddos-host
. - Укажите значение Authority:
alb-with-ddos.com
. - Нажмите кнопку Добавить маршрут.
- Введите Имя:
route-1
. - В поле Путь выберите
Начинается с
и укажите путь/
. - В поле Действие оставьте
Маршрутизация
. - В списке Группа бэкендов выберите созданную ранее группу.
- Остальные настройки оставьте без изменений и нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Выполните команду:
yc alb http-router create ddos-router
Результат:
id: a5dcsselagj4******** name: ddos-router folder_id: aoerb349v3h4******** created_at: "2021-08-08T21:04:59.438292069Z"
Подробнее о команде
yc alb http-router create
читайте в справочнике CLI. -
Создайте виртуальный хост, указав имя HTTP-роутера:
yc alb virtual-host create ddos-host \ --http-router-name ddos-router --authority alb-with-ddos.com
Подробнее о команде
yc alb virtual-host create
читайте в справочнике CLI. -
Добавьте маршрут, указав имя роутера и параметры маршрутизации:
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: ds7fea2pggr2******** timeout: 60s
Подробнее о команде
yc alb virtual-host append-http-route
читайте в справочнике CLI.
Создайте балансировщик
Чтобы создать балансировщик:
-
В консоли управления
выберите сервис Application Load Balancer. -
В меню слева выберите Балансировщики.
-
Нажмите кнопку Создать L7-балансировщик.
-
Введите имя балансировщика:
ddos-protect-alb
. -
В блоке Сетевые настройки выберите сеть
ddos-network
и группу безопасностиddos-sg-balancer
. -
В блоке Размещение выберите подсети для узлов балансировщика в каждой зоне доступности и включите передачу трафика.
-
В блоке Обработчики нажмите кнопку Добавить обработчик. Задайте настройки обработчика:
- Введите имя обработчика:
ddos-listener
. - В блоке Публичный IP-адрес включите передачу трафика.
- Укажите порт
80
. - Выберите тип Список и укажите зарезервированный ранее IP-адрес с защитой от DDoS.
- Введите имя обработчика:
-
В поле HTTP-роутер выберите
ddos-router
. -
Нажмите кнопку Создать.
-
Создайте балансировщик с узлами в подсетях облачной сети:
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-d,zone=ru-central1-d
Подробнее о команде
yc alb load-balancer create
читайте в справочнике CLI. -
Добавьте обработчик:
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.
После создания балансировщика, проверьте его работу.
Проверьте работу балансировщика
Проверьте доступность сервиса на хосте alb-with-ddos.com
. Для этого выполните команду:
curl \
--header "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>
Как удалить созданные ресурсы
Чтобы остановить работу хостинга и перестать платить за созданные ресурсы:
-
Удалите нетарифицируемые ресурсы, которые блокируют удаление тарифицируемых ресурсов:
-
Удалите группу ВМ
ddos-group
. -
Удалите зарезервированный статический публичный IP-адрес.