1. Введение
Балансировка нагрузки Google Cloud HTTP(S) развернута на периферии сети Google в точках присутствия (POP) Google по всему миру. Пользовательский трафик, направляемый к балансировщику нагрузки HTTP(S), поступает в ближайшую к пользователю точку присутствия, а затем распределяется по глобальной сети Google на ближайший бэкэнд, обладающий достаточной пропускной способностью.
Cloud Armor — это система обнаружения атак типа «отказ в обслуживании» и межсетевой экран веб-приложений (WAF) от Google. Cloud Armor тесно связан с балансировщиком нагрузки HTTP Google Cloud и позволяет проверять входящий трафик на наличие нежелательных запросов. Функция ограничения скорости позволяет ограничивать трафик к ресурсам бэкэнда в зависимости от объема запросов и предотвращает потребление ресурсов вашей виртуальной частной сети (VPC) нежелательным трафиком.
В этой лабораторной работе вы настроите HTTP-балансировщик нагрузки с глобальными бэкэндами, как показано на схеме ниже. Затем вы проведете стресс-тест балансировщика нагрузки и добавите политику ограничения скорости Cloud Armor, чтобы ограничить трафик, поступающий к ресурсам ваших бэкэндов.

Что вы узнаете
- Как настроить HTTP-балансировщик нагрузки с соответствующими проверками работоспособности.
- Как создать политику ограничения скорости запросов в Cloud Armor.
- Как проверить, действительно ли политика ограничения скорости блокирует трафик при запуске стресс-теста на виртуальной машине.
Что вам понадобится
- Базовые знания сетевых технологий и протокола HTTP.
- Базовые знания командной строки Unix/Linux.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google, и вы можете изменить её в любое время.
- Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID), поэтому, если он вам не нравится, сгенерируйте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он "замораживается" после создания проекта. - Существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud, чтобы использовать ресурсы/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, следуйте инструкциям по «очистке», приведенным в конце практического задания. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли GCP щелкните значок Cloud Shell на панели инструментов в правом верхнем углу:

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории можно выполнять с помощью обычного браузера.
Прежде чем начать
Внутри Cloud Shell убедитесь, что идентификатор вашего проекта указан правильно.
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
Включить API
Включите все необходимые службы
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. Настройте правила брандмауэра, чтобы разрешить HTTP-трафик к бэкэндам.
Настройте правила брандмауэра, чтобы разрешить HTTP-трафик к бэкэндам от проверок работоспособности Google Cloud и балансировщика нагрузки.
Мы будем использовать сеть VPC по умолчанию , созданную в вашем проекте. Создайте правило брандмауэра, разрешающее HTTP-трафик к бэкэндам. Проверки работоспособности определяют, какие экземпляры балансировщика нагрузки могут принимать новые соединения. Для балансировки нагрузки по HTTP запросы на проверку работоспособности к вашим балансируемым экземплярам поступают с адресов в диапазонах 130.211.0.0/22 и 35.191.0.0/16. Ваши правила брандмауэра VPC должны разрешать эти соединения. Кроме того, балансировщики нагрузки взаимодействуют с бэкэндом по одному и тому же диапазону IP-адресов.
- В консоли Cloud перейдите в меню «Навигация» (
) > Сеть VPC > Межсетевой экран .

- Обратите внимание на существующие правила брандмауэра для ICMP , внутренней сети , RDP и SSH. Каждый проект Google Cloud начинается с сети по умолчанию и этих правил брандмауэра.
- Нажмите «Создать правило брандмауэра» .
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Имя | default-allow-health-check |
Сеть | по умолчанию |
Цели | Указанные целевые теги |
Целевые метки | http-сервер |
Фильтр источника | Диапазоны IP-адресов |
Диапазоны IP-адресов источника | 130.211.0.0/22, 35.191.0.0/16 |
Протоколы и порты | Укажите протоколы и порты, а затем проверьте TCP-соединение. |
- Нажмите «Создать» .
В качестве альтернативы, если вы используете командную строку gcloud, ниже приведена команда:
gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=http-server
4. Настройте шаблоны экземпляров и создайте управляемые группы экземпляров.
Группа управляемых экземпляров использует шаблон экземпляра для создания группы идентичных экземпляров. Используйте их для создания бэкэндов балансировщика нагрузки HTTP.
Настройте шаблоны экземпляров.
Шаблон экземпляра — это ресурс API, используемый для создания экземпляров виртуальных машин и управляемых групп экземпляров. Шаблоны экземпляров определяют тип машины, образ загрузочного диска, подсеть, метки и другие свойства экземпляра. Создайте один шаблон экземпляра для us-east1 и один для europe-west1 .
- В консоли Cloud перейдите в меню «Навигация» (
) > Compute Engine > Шаблоны экземпляров , а затем нажмите «Создать шаблон экземпляра» . - В поле "Имя" введите us-east1-template .
- Для параметра «Серия» выберите N1 .
- Нажмите «Сеть», «Диски», «Безопасность», «Управление», «Индивидуальный доступ» .

- Перейдите в раздел «Управление» -

- В разделе «Метаданные» нажмите «Добавить элемент» и укажите следующее:
Ключ | Ценить |
startup-script-url | gs://cloud-training/gcpnet/httplb/startup.sh |
- Нажмите «Сеть» .
- Установите следующие значения, а все остальные оставьте по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Сеть (в разделе «Сетевые интерфейсы») | по умолчанию |
Подсеть (в разделе «Сетевые интерфейсы») | по умолчанию (us-east1) |
Сетевые теги | http-сервер |
- Нажмите «Создать» .
- Дождитесь создания шаблона экземпляра.
Теперь создайте еще один шаблон экземпляра для подсети b, скопировав us-east1-template :
- Нажмите на us-east1-template , а затем выберите опцию «Копировать» вверху.
- В поле "Имя" введите europe-west1-template .
- Нажмите «Сеть», «Диски», «Безопасность», «Управление», «Индивидуальный доступ» .
- Нажмите «Сеть» .
- В разделе «Сетевые интерфейсы» отредактируйте интерфейс по умолчанию. Для параметра «Подсеть» выберите default (europe-west1) .
- Нажмите «Создать» .
Создайте группы управляемых экземпляров.
Создайте группу управляемых экземпляров в us-east1 и еще одну в europe-west1 .
- Оставаясь в Compute Engine , щелкните «Группы экземпляров» в левом меню.

- Нажмите «Создать группу экземпляров» . Выберите «Новая управляемая группа экземпляров (без сохранения состояния)».
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Имя | us-east1-mig |
Расположение | Несколько зон |
Область | us-east1 |
Шаблон экземпляра | us-east1-template |
Автомасштабирование > Политика автомасштабирования > Щелкните значок карандаша > Тип метрики | использование ЦП |
Целевая загрузка ЦП | 80, нажмите «Готово». |
период охлаждения | 45 |
Минимальное количество экземпляров | 1 |
Максимальное количество экземпляров | 5 |
- Нажмите «Создать» .
Теперь повторите ту же процедуру, чтобы создать вторую группу экземпляров для europe-west1-mig в europe-west1 :
- Нажмите «Создать группу экземпляров» .
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Имя | europe-west1-mig |
Расположение | Несколько зон |
Область | europe-west1 |
Шаблон экземпляра | europe-west1-template |
Автомасштабирование > Политика автомасштабирования > Щелкните значок карандаша > Тип метрики | использование ЦП |
Целевая загрузка ЦП | 80, нажмите «Готово». |
период охлаждения | 45 |
Минимальное количество экземпляров | 1 |
Максимальное количество экземпляров | 5 |
- Нажмите «Создать» .
5. Настройте балансировщик нагрузки HTTP.
Настройте HTTP-балансировщик нагрузки для распределения трафика между двумя бэкэндами ( us-east1-mig в us-east1 и europe-west1-mig в europe-west1), как показано на сетевой диаграмме:

Запустите настройку
- В консоли Cloud нажмите меню навигации (
) > Щелкните «Сетевые службы» > «Балансировка нагрузки» , а затем нажмите «Создать балансировщик нагрузки» . - В разделе «Балансировка нагрузки HTTP(S)» нажмите « Начать настройку» .

- Выберите «Из интернета на мои виртуальные машины» , «Классический балансировщик нагрузки HTTP(S)» и нажмите «Продолжить» .
- Установите имя как http-lb.
Настройте бэкэнд.
Серверные службы направляют входящий трафик на один или несколько подключенных серверов. Каждый сервер состоит из группы экземпляров и дополнительных метаданных, определяющих пропускную способность.
- Нажмите на «Конфигурация бэкэнда» .
- Для выбора серверных служб и серверных хранилищ нажмите «Создать серверную службу» .
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (выберите вариант, как указано) |
Имя | http-бэкенд |
Группа экземпляров | us-east1-mig |
Номера портов | 80 |
Режим балансировки | Ставка |
Максимальная скорость выстрела | 50 (за каждый случай) |
Емкость | 100 |
- Нажмите «Готово» .
- Нажмите «Добавить бэкэнд» .
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (выберите вариант, как указано) |
Группа экземпляров | europe-west1-mig |
Номера портов | 80 |
Режим балансировки | Использование |
Максимальная загрузка бэкэнда | 80 |
Емкость | 100 |
- Нажмите «Готово» .
- Для проверки состояния здоровья выберите «Создать проверку состояния здоровья» .

- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (выберите вариант, как указано) |
Имя | http-health-check |
Протокол | TCP |
Порт | 80 |

- Нажмите « Сохранить ».
- Установите флажок «Включить ведение журнала» .
- Установите частоту дискретизации на 1:

- Нажмите «Создать» , чтобы создать серверную службу.

Настройте интерфейс пользователя.
Правила для хоста и пути определяют, как будет направляться ваш трафик. Например, вы можете направлять видеотрафик на один бэкэнд, а статический трафик — на другой. Однако в этой лабораторной работе вы не будете настраивать правила для хоста и пути.
- Нажмите на «Конфигурация интерфейса» .
- Укажите следующие значения, оставив все остальные значения по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Протокол | HTTP |
IP-версия | IPv4 |
IP-адрес | Эфемерный |
Порт | 80 |
- Нажмите «Готово» .
- Нажмите «Добавить IP-адрес и порт внешнего интерфейса» .
- Укажите следующие значения, оставив все остальные значения по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Протокол | HTTP |
IP-версия | IPv6 |
IP-адрес | Эфемерный |
Порт | 80 |
- Нажмите «Готово» .
Проверьте и создайте HTTP-балансировщик нагрузки.
- Нажмите «Просмотреть и завершить» .

- Просмотрите серверную часть и интерфейс пользователя .

- Нажмите «Создать» .
- Дождитесь создания балансировщика нагрузки.
- Щелкните по названию балансировщика нагрузки ( http-lb ).
- Обратите внимание на IPv4 и IPv6 адреса балансировщика нагрузки для следующей задачи. Они будут обозначаться как [LB_IP_v4] и [LB_IP_v6] соответственно.
6. Проверьте работу балансировщика нагрузки HTTP.
Теперь, когда вы создали HTTP-балансировщик нагрузки для своих бэкэндов, убедитесь, что трафик перенаправляется на бэкэнд-сервис.
Получите доступ к балансировщику нагрузки HTTP.
Чтобы проверить доступ по IPv4 к балансировщику нагрузки HTTP, откройте новую вкладку в браузере и перейдите по адресу http://[LB_IP_v4] . Убедитесь, что вы заменили [LB_IP_v4] на IPv4-адрес балансировщика нагрузки.
Если у вас есть локальный IPv6-адрес, попробуйте использовать IPv6-адрес балансировщика нагрузки HTTP, перейдя по адресу http://[LB_IP_v6]. Убедитесь, что вы заменили [LB_IP_v6] на IPv6-адрес балансировщика нагрузки.

Проведите стресс-тестирование балансировщика нагрузки HTTP.
Создайте новую виртуальную машину для имитации нагрузки на HTTP-балансировщик нагрузки с помощью Siege. Затем определите, распределяется ли трафик между обоими бэкэндами при высокой нагрузке.
- В консоли перейдите в меню «Навигация» (
) > Compute Engine > Экземпляры виртуальных машин . - Нажмите «Создать экземпляр» .
- Установите следующие значения, все остальные значения оставьте по умолчанию:
Свойство | Значение (введите значение или выберите нужный вариант) |
Имя | siege-vm |
Область | us-west1 |
Зона | us-west1-c |
Ряд | Н1 |
- Нажмите «Создать» .
- Дождитесь создания экземпляра siege-vm .
- Для запуска siege-vm нажмите SSH , чтобы открыть терминал и подключиться.
- Для установки Siege выполните следующую команду:
sudo apt-get -y install siege
- Чтобы сохранить IPv4-адрес балансировщика нагрузки HTTP в переменной среды, выполните следующую команду, заменив [LB_IP_v4] на IPv4-адрес:
export LB_IP=[LB_IP_v4]
- Для имитации нагрузки выполните следующую команду:
siege -c 250 http://$LB_IP
Результат должен выглядеть примерно так ( не копируйте; это пример вывода ):
New configuration template added to /home/student/.siege Run siege -C to view the current settings in that file ** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- В консоли Cloud нажмите на меню «Навигация» (
), нажмите «Сетевые службы» > «Балансировка нагрузки» . - Нажмите http-lb .
- Перейдите на вкладку «Мониторинг» . Отслеживайте трафик между Северной Америкой и двумя бэкэндами в течение 2-3 минут.
Первоначально трафик должен направляться только в порт us-east1-mig , но по мере увеличения количества RPS трафик также будет направляться в порт europe-west1-mig .

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

- Вернитесь в SSH- терминал siege-vm .
- Нажмите CTRL+C , чтобы остановить осаду.
7. Создайте политику ограничения скорости запросов в Cloud Armor.
В этом разделе вы будете использовать Cloud Armor, чтобы запретить виртуальной машине siege доступ к балансировщику нагрузки HTTP, установив политику ограничения скорости запросов.
- В Cloud Shell (инструкции по использованию Cloud Shell см. в разделе «Запуск Cloud Shell» в подразделе « Настройка и требования ») создайте политику безопасности с помощью gcloud:
gcloud compute security-policies create rate-limit-siege \
--description "policy for rate limiting"
- Далее добавьте правило ограничения скорости:
gcloud beta compute security-policies rules create 100 \
--security-policy=rate-limit-siege \
--expression="true" \
--action=rate-based-ban \
--rate-limit-threshold-count=50 \
--rate-limit-threshold-interval-sec=120 \
--ban-duration-sec=300 \
--conform-action=allow \
--exceed-action=deny-404 \
--enforce-on-key=IP
- Привяжите политику безопасности к серверной службе http-backend:
gcloud compute backend-services update http-backend \
--security-policy rate-limit-siege –-global
- В консоли перейдите в меню «Навигация» > «Сетевая безопасность» > «Cloud Armor» .
- Нажмите кнопку «Ограничение скорости». Ваша политика должна выглядеть примерно так:

Проверьте политику безопасности.
- Вернитесь в SSH-терминал виртуальной машины siege-vm.
- Выполните команду curl к IP-адресу балансировщика нагрузки, чтобы убедиться, что вы по-прежнему можете к нему подключиться; вы должны получить ответ 200.
curl http://$LB_IP
- Для имитации нагрузки в SSH-терминале виртуальной машины siege выполните следующую команду:
siege -c 250 http://$LB_IP
Результат должен выглядеть примерно так (не копируйте; это пример вывода):
** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- Изучите журналы политики безопасности, чтобы определить, блокируется ли этот трафик также.
- В консоли перейдите в меню «Навигация» > «Сетевая безопасность» > «Cloud Armor» .
- Нажмите «Rate-limit-siege» .
- Нажмите «Журналы» .

- Нажмите « Просмотреть журналы политик» .
- На странице «Ведение журнала» обязательно удалите весь текст в окне предварительного просмотра запроса.
- Выберите ресурс Cloud HTTP Load Balancer > http-lb-forwarding-rule > http-lb, затем нажмите «Добавить» . В качестве альтернативы, ниже приведен MQL-запрос (язык запросов мониторинга), который вы можете скопировать и вставить в редактор запросов.
resource.type="http_load_balancer" resource.labels.forwarding_rule_name="http-lb-forwarding-rule" resource.labels.url_map_name="http-lb"
- Теперь нажмите «Выполнить запрос» .
- Разверните запись в журнале результатов запроса.
- Разверните запись httpRequest . Запрос должен поступать с IP -адреса виртуальной машины siege . Если это не так, разверните другую запись в журнале.
- Разверните jsonPayload.
- Развернуть enforcedSecurityPolicy.

Обратите внимание, что для параметра configuredAction установлено значение RATE_BASED_BAN с именем rate-limit-siege .
- Для дополнительной проверки перейдите в меню «Навигация» (
), нажмите «Сетевые службы» > «Балансировка нагрузки ». Нажмите http-lb . Перейдите на вкладку «Мониторинг» .

На графиках вы можете увидеть трафик, передаваемый в рамках режима "осады". Вы также заметите, что трафик с ограничением скорости не достигает бэкэнда и блокируется политикой Cloud Armor.
Поздравляем! Вы успешно завершили лабораторную работу по ограничению скорости запросов с помощью Cloud Armor.
©2020 Google LLC. Все права защищены. Google и логотип Google являются товарными знаками Google LLC. Все остальные названия компаний и продуктов могут являться товарными знаками соответствующих компаний, с которыми они связаны.
8. Уборка лаборатории
- Перейдите в раздел «Сетевая безопасность» >> «Cloud Armor» >> «%НАЗВАНИЕ ПОЛИТИКИ%» и выберите «Удалить».

- Перейдите в раздел «Сеть» >> «Сетевые службы» >> «Балансировка нагрузки». Выберите созданный вами балансировщик нагрузки и нажмите «Удалить».

Выберите серверную службу и проверку работоспособности в качестве дополнительных ресурсов для удаления.

- Перейдите в меню навигации (
) > Compute Engine > Группы экземпляров. Выберите обе группы управляемых экземпляров и нажмите «Удалить».

Для подтверждения удаления введите слово «delete» в текстовое поле.
Дождитесь удаления групп управляемых экземпляров. Это также удалит экземпляры, входящие в группу. Удалить шаблоны можно только после удаления группы экземпляров.
- Перейдите к шаблонам экземпляров в левой боковой панели**.** Выберите оба шаблона экземпляров и нажмите «Удалить».

- Перейдите к экземплярам виртуальных машин в левой боковой панели.** Выберите многоточие рядом с экземпляром siege-vm и нажмите «Удалить».

- Перейдите в меню навигации (
) > Сеть VPC > Брандмауэр . Выберите параметр default-allow-health-check и нажмите «Удалить».

9. Поздравляем!
Вы успешно внедрили ограничение скорости запросов с помощью Cloud Armor. Вы настроили HTTP-балансировщик нагрузки с бэкэндами в регионах us-east1 и europe-west1. Затем вы провели стресс-тестирование балансировщика нагрузки на виртуальной машине и внесли IP-адрес в черный список с помощью ограничения скорости запросов в Cloud Armor. Вы смогли изучить журналы политики безопасности, чтобы определить причину блокировки трафика.
Что мы рассмотрели
- Как настроить шаблоны экземпляров и создать управляемые группы экземпляров.
- Как настроить балансировщик нагрузки HTTP.
- Как создать политику ограничения скорости запросов в Cloud Armor.
- Как проверить, что политика ограничения скорости работает должным образом.
Следующие шаги
- Попробуйте настроить политику ограничения скорости на основе диапазона исходных IP-адресов. Пример команды ниже:
gcloud alpha compute security-policies rules create 105 \
--security-policy sec-policy \
--src-ip-ranges "1.2.3.0/24" \
--action throttle \
--rate-limit-threshold-count 100 \
--rate-limit-threshold-interval-sec 60 \
--conform-action allow \
--exceed-action deny-429 \
--enforce-on-key IP
- Попробуйте настроить политику ограничения скорости запросов на основе кода региона. Пример команды ниже:
gcloud alpha compute security-policies rules create 101 \
--security-policy sec-policy \
--expression "origin.region_code == 'US'" \
--action rate-based-ban \
--rate-limit-threshold-count 10 \
--rate-limit-threshold-interval-sec 60 \
--ban-duration-sec 300 \
--ban-threshold-count 1000 \
--ban-threshold-interval-sec 600 \
--conform-action allow \
--exceed-action deny-403 \
--enforce-on-key IP