Ограничение скорости с помощью Cloud Armor

1. Введение

Балансировка нагрузки Google Cloud HTTP(S) развертывается на границе сети Google в точках присутствия Google (POP) по всему миру. Пользовательский трафик, направляемый на балансировщик нагрузки HTTP(S), поступает на POP, ближайший к пользователю, а затем балансируется через глобальную сеть Google на ближайший бэкэнд, имеющий достаточную доступную емкость.

Cloud Armor — это распределенная система обнаружения отказов в обслуживании и брандмауэра веб-приложений (WAF) Google. Cloud Armor тесно связан с балансировщиком нагрузки Google Cloud HTTP и позволяет проверять входящий трафик на предмет нежелательных запросов. Функция ограничения скорости этой службы позволяет вам ограничивать трафик на серверные ресурсы в зависимости от объема запроса и предотвращает потребление ресурсов нежелательным трафиком в вашей сети виртуального частного облака (VPC).

В ходе этой лабораторной работы вы настроите балансировщик нагрузки HTTP с глобальными серверными модулями, как показано на схеме ниже. Затем вы проведете стресс-тестирование балансировщика нагрузки и добавите политику ограничения скорости Cloud Armor, чтобы ограничить трафик, попадающий на ваши серверные ресурсы.

2e1b99d22f4f32a.png

Что вы узнаете

  • Как настроить балансировщик нагрузки HTTP с соответствующими проверками работоспособности.
  • Как создать политику ограничения скорости Cloud Armor.
  • Как проверить, что политика ограничения скорости блокирует трафик при запуске стресс-теста с виртуальной машины.

Что вам понадобится

  • Базовые настройки сети и знание HTTP
  • Базовые знания командной строки Unix/Linux.

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лабораторной работе можно выполнять с помощью простого браузера.

Прежде чем начать

В 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-адресов.

  1. В облачной консоли перейдите в меню навигации ( Главное меню.png ) > Сеть VPC > Брандмауэр .

dbdf491e6d7863f3.png

  1. Обратите внимание на существующие правила брандмауэра ICMP , Internal , RDP и SSH. Каждый проект Google Cloud начинается с сети по умолчанию и этих правил брандмауэра.
  2. Нажмите «Создать правило брандмауэра» .
  3. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Имя

проверка работоспособности по умолчанию

Сеть

по умолчанию

Цели

Указанные целевые теги

Целевые теги

http-сервер

Исходный фильтр

IP-диапазоны

Диапазоны исходных IP-адресов

130.211.0.0/22, 35.191.0.0/16

Протоколы и порты

Указаны протоколы и порты, а затем проверьте TCP

  1. Нажмите Создать .

Альтернативно, если вы используете командную строку 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 Load Balancer.

Настройка шаблонов экземпляров

Шаблон экземпляра — это ресурс API, который вы используете для создания экземпляров виртуальных машин и управляемых групп экземпляров. Шаблоны экземпляров определяют тип машины, образ загрузочного диска, подсеть, метки и другие свойства экземпляра. Создайте один шаблон экземпляра для us-east1 и один для europe-west1 .

  1. В облачной консоли перейдите в меню навигации ( Главное меню.png ) > Compute Engine > Шаблоны экземпляров , а затем нажмите Создать шаблон экземпляра .
  2. В поле Имя введите us-east1-template .
  3. Для серии выберите N1 .
  4. Нажмите Сеть, Диски, Безопасность, Управление, Единоличное пользование .

b60e2a44c3e4d50e.png

  1. Заходим в раздел Управление -

ee57f20ce55298fd.png

  1. В разделе «Метаданные» нажмите « Добавить элемент» и укажите следующее:

Ключ

Ценить

URL-адрес сценария запуска

gs://cloud-training/gcpnet/httplb/startup.sh

  1. Нажмите «Сеть» .
  2. Установите следующие значения и оставьте все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Сеть (в разделе «Сетевые интерфейсы»)

по умолчанию

Подсеть (в разделе «Сетевые интерфейсы»)

по умолчанию (США-восток1)

Сетевые теги

http-сервер

  1. Нажмите Создать .
  2. Подождите, пока будет создан шаблон экземпляра.

Теперь создайте еще один шаблон экземпляра для subnet-b , скопировав us-east1-template :

  1. Нажмите на us-east1-template , а затем нажмите кнопку «Копировать» сверху.
  2. В поле Имя введите europe-west1-template .
  3. Нажмите Сеть, Диски, Безопасность, Управление, Единоличное пользование .
  4. Нажмите «Сеть» .
  5. В разделе «Сетевые интерфейсы» отредактируйте интерфейс по умолчанию. В поле «Подсеть» выберите «по умолчанию» (europe-west1) .
  6. Нажмите Создать .

Создайте группы управляемых экземпляров

Создайте группу управляемых экземпляров в us-east1 и одну в Europe-west1 .

  1. Продолжая работать в Compute Engine , нажмите «Группы экземпляров» в меню слева.

72319de055de3942.png

  1. Нажмите Создать группу экземпляров . Выберите Новая группа управляемых экземпляров (без сохранения состояния).
  2. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Имя

США-восток1-миг

Расположение

Несколько зон

Область

США-Восток1

Шаблон экземпляра

США-восток1-шаблон

Автомасштабирование > Политика автомасштабирования > Щелкните значок карандаша > Тип показателя.

Загрузка процессора

Целевая загрузка ЦП

80, нажмите Готово.

Период охлаждения

45

Минимальное количество экземпляров

1

Максимальное количество экземпляров

5

  1. Нажмите Создать .

Теперь повторите ту же процедуру, чтобы создать вторую группу экземпляров для europe-west1-mig в europe-west1 :

  1. Нажмите «Создать группу экземпляров» .
  2. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Имя

Европа-Запад1-миг

Расположение

Несколько зон

Область

Европа-Запад1

Шаблон экземпляра

Европа-Запад1-шаблон

Автомасштабирование > Политика автомасштабирования > Щелкните значок карандаша > Тип показателя.

Загрузка процессора

Целевая загрузка ЦП

80, нажмите Готово.

Период охлаждения

45

Минимальное количество экземпляров

1

Максимальное количество экземпляров

5

  1. Нажмите Создать .

5. Настройте балансировщик нагрузки HTTP.

Настройте балансировщик нагрузки HTTP для балансировки трафика между двумя бэкэндами ( us-east1-mig в us-east1 и europe-west1-mig в europe-west1), как показано на сетевой схеме:

2e1b99d22f4f32a.png

Запустите настройку

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

8197d8f041e8eafd.png

  1. Выберите «Из Интернета на мои виртуальные машины» , «Классический балансировщик нагрузки HTTP(S)» и нажмите « Продолжить» .
  2. Установите имя http-lb.

Настройка серверной части

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

  1. Нажмите «Конфигурация серверной части» .
  2. В разделе «Верхние службы и серверные сегменты» нажмите «Создать серверную службу» .
  3. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (выберите указанный вариант)

Имя

http-бэкэнд

Группа экземпляров

США-восток1-миг

Номера портов

80

Режим балансировки

Ставка

Максимальное количество запросов в секунду

50 (за экземпляр)

Емкость

100

  1. Нажмите Готово .
  2. Нажмите Добавить серверную часть .
  3. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (выберите указанный вариант)

Группа экземпляров

Европа-Запад1-миг

Номера портов

80

Режим балансировки

Использование

Максимальное использование серверной части

80

Емкость

100

  1. Нажмите Готово .
  2. Для параметра «Проверка работоспособности» выберите «Создать проверку работоспособности» .

199239806577ceac.png

  1. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (выберите указанный вариант)

Имя

http-проверка работоспособности

Протокол

TCP

Порт

80

20f7af9fce140475.png

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

dab4b15c13917786.png

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

2db64614f855f239.png

Настройка интерфейса

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

  1. Нажмите «Конфигурация внешнего интерфейса» .
  2. Укажите следующее, оставив все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Протокол

HTTP

IP-версия

IPv4

IP-адрес

Эфемерный

Порт

80

  1. Нажмите Готово .
  2. Нажмите «Добавить внешний IP-адрес и порт» .
  3. Укажите следующее, оставив все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Протокол

HTTP

IP-версия

IPv6

IP-адрес

Эфемерный

Порт

80

  1. Нажмите Готово .

Просмотрите и создайте балансировщик нагрузки HTTP.

  1. Нажмите «Просмотреть и завершить» .

2c88715aa5f22800.png

  1. Просмотрите серверные службы и внешний интерфейс .

b2ffef90be309f0.png

  1. Нажмите «Создать» .
  2. Подождите, пока будет создан балансировщик нагрузки.
  3. Нажмите на имя балансировщика нагрузки ( http-lb ).
  4. Запишите адреса 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-адрес балансировщика нагрузки.

812d1fc75d9dfb3c.png

Стресс-тестирование балансировщика нагрузки HTTP

Создайте новую виртуальную машину для имитации нагрузки на балансировщик нагрузки HTTP с помощью Siege. Затем определите, сбалансирован ли трафик между обоими серверами при высокой нагрузке.

  1. В консоли перейдите в меню навигации ( Главное меню.png ) > Compute Engine > Экземпляры виртуальных машин .
  2. Нажмите Создать экземпляр .
  3. Установите следующие значения, оставьте все остальные значения по умолчанию:

Свойство

Значение (введите значение или выберите указанный вариант)

Имя

осада-VM

Область

США-Запад1

Зона

США-west1-c

Ряд

N1

  1. Нажмите Создать .
  2. Подождите, пока будет создан экземпляр siege-vm .
  3. Для siege-vm нажмите SSH , чтобы запустить терминал и подключиться.
  4. Запустите следующую команду, чтобы установить Siege:
sudo apt-get -y install siege
  1. Чтобы сохранить адрес IPv4 балансировщика нагрузки HTTP в переменной среды, выполните следующую команду, заменив [LB_IP_v4] адресом IPv4:
export LB_IP=[LB_IP_v4]
  1. Чтобы смоделировать нагрузку, выполните следующую команду:
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...
  1. В облачной консоли щелкните меню навигации ( Главное меню.png ), нажмите «Сетевые службы» > «Балансировка нагрузки» .
  2. Нажмите http-lb .
  3. Нажмите на вкладку Мониторинг . Отслеживайте трафик между Северной Америкой и двумя серверами в течение 2–3 минут.

Сначала трафик должен быть направлен только на us-east1-mig , но по мере увеличения числа запросов в секунду трафик также направляется на europe-west1-mig .

ead1e6d5c1f4cc4b.png

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

e5c6a657706c832c.png

  1. Вернитесь к SSH- терминалу siege-vm .
  2. Нажмите CTRL+C , чтобы остановить осаду.

7. Создайте политику ограничения скорости облачной брони.

В этом разделе вы будете использовать Cloud Armor, чтобы запретить siege-vm доступ к балансировщику нагрузки HTTP, установив политику ограничения скорости.

  1. В Cloud Shell (инструкции по использованию Cloud Shell см. в разделе «Запуск Cloud Shell » раздела « Настройка и требования ») создайте политику безопасности через gcloud:
gcloud compute security-policies create rate-limit-siege \
    --description "policy for rate limiting"
  1. Затем добавьте правило ограничения скорости:
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
  1. Прикрепите политику безопасности к http-бэкенду серверной службы:
gcloud compute backend-services update http-backend \
    --security-policy rate-limit-siege –-global
  1. В консоли перейдите в меню навигации > Сетевая безопасность > Cloud Armor .
  2. Нажмите «Ограничение скорости». Ваша политика должна выглядеть следующим образом:

8be87aa31c2ed74e.png

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

  1. Вернитесь к SSH-терминалу siege-vm.
  2. Запустите завиток по IP-адресу LB, чтобы убедиться, что вы все еще можете к нему подключиться, и должен получить ответ 200.
curl http://$LB_IP
  1. В SSH-терминале siege-vm для имитации загрузки выполните следующую команду:
siege -c 250 http://$LB_IP

Вывод должен выглядеть следующим образом (не копировать; это пример вывода):

** SIEGE 4.0.4
** Preparing 250 concurrent users for battle.
The server is now under siege...
  1. Изучите журналы политики безопасности, чтобы определить, заблокирован ли этот трафик.
  2. В консоли перейдите в меню навигации > Сетевая безопасность > Cloud Armor .
  3. Нажмите «Ограничение скорости-осада» .
  4. Нажмите Журналы .

f8be7c01c3d7c8f5.png

  1. Нажмите «Просмотреть журналы политики» .
  2. На странице «Журнал» обязательно очистите весь текст в предварительном просмотре запроса.
  3. Выберите ресурс 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"
  1. Теперь нажмите «Выполнить запрос» .
  2. Разверните запись журнала в результатах запроса.
  3. Разверните httpRequest . Запрос должен быть с IP-адреса siege-vm . Если нет, разверните другую запись журнала.
  4. Разверните jsonPayload.
  5. Разверните принудительныйSecurityPolicy.

151f575ba7b3bde9.png

Обратите внимание, что для параметра configureAction установлено значение RATE_BASED_BAN с именемrate -limit-siege .

  1. Для дополнительной проверки перейдите в меню навигации ( Главное меню.png ), нажмите «Сетевые службы» > «Балансировка нагрузки» . Нажмите http-lb . Нажмите на вкладку Мониторинг .

ab9a8a66573a5ebd.png

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

Поздравляем! Вы завершили эту лабораторную работу по ограничению скорости с помощью Cloud Armor.

© Google LLC, 2020. Все права защищены. Google и логотип Google являются товарными знаками Google LLC. Все остальные названия компаний и продуктов могут быть товарными знаками соответствующих компаний, с которыми они связаны.

8. Уборка лаборатории

  1. Перейдите в раздел «Сетевая безопасность» >> Cloud Armor >> %POLICY NAME% и выберите «Удалить».

eeafa7cafa11c4c7.png

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

3886458f25cfbd36.png

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

a0193e91b2f4cb6f.png

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

5027d56977997f70.png

Подтвердите удаление, набрав «удалить» в текстовом поле.

Подождите, пока группы управляемых экземпляров будут удалены. При этом также удаляются экземпляры в группе. Удалить шаблоны можно только после удаления группы экземпляров.

  1. Перейдите к шаблонам экземпляров на левой боковой панели**.** Выберите оба шаблона экземпляров и нажмите «Удалить».

8d88abacd32c11ce.png

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

2b58ab43695836e9.png

  1. Перейдите в меню навигации ( Главное меню.png ) > Сеть VPC > Брандмауэр . Выберите проверку работоспособности по умолчанию и нажмите «Удалить».

561d5e771d36d85.png

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