← Документация WAF / rate-limiting-rules
Создание правила rate limiting через API
Используйте Rulesets API , чтобы создать правило rate limiting через API на уровне зоны.
Правило rate limiting похоже на обычное правило, обрабатываемое Ruleset Engine, но содержит дополнительный ratelimit объект с конфигурацией rate limiting. См. Параметры правил rate limiting — там приведена дополнительная информация об этом поле и его параметрах.
Вы должны развернуть правила rate limiting в фазе http_ratelimit набор правил точки входа фазы.
Правила rate limiting должны находиться в конце списка правил.
Если вы используете Terraform, см. Настройка правил rate limiting с помощью Terraform.
Создание правила rate limiting
Чтобы создать правило rate limiting для зоны, добавьте правило с ratelimit объект в http_ratelimit набора правил точки входа фазы.
-
Вызовите Получение набора правил точки входа зоны (операция), чтобы получить определение набора правил точки входа для фазы
http_ratelimit(фаза). Вам понадобится ID зоны для этой задачи. -
Если набор правил точки входа уже существует (то есть если вы получили
200 OKкод состояния и определение набора правил), запишите ID набора правил из ответа. Затем вызовите Создание правила в наборе правил зоны (операция), чтобы добавить правило rate limiting в существующий набор. Подробности — в примерах ниже. -
Если набор правил точки входа не существует (то есть если вы получили
404 Not Foundкод состояния на шаге 1), создайте его с помощью Создание набора правил зоны операции. Включите ваше правило rate limiting вrules(массив). См. Create ruleset для примера.
Пример A — rate limiting на основе свойств запроса
Этот пример добавляет правило rate limiting в http_ratelimit (набор правил точки входа этой фазы) для зоны с ID $ZONE_ID. Набор правил точки входа фазы уже существует, его ID — $RULESET_ID.
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600
}
}'Чтобы задать конкретную позицию нового правила, включите position (объект) в теле запроса в соответствии с рекомендациями в Изменение порядка правила в наборе правил.
Инструкции по созданию набора правил точки входа и определению его правил одним вызовом API см. в Добавление правил в наборы правил точек входа фаз.
Пример B — rate limiting с пользовательским ответом
Этот пример добавляет правило rate limiting в http_ratelimit (набор правил точки входа этой фазы) для зоны с ID $ZONE_ID. Набор правил точки входа фазы уже существует, его ID — $RULESET_ID.
Новое правило определяет пользовательский ответ для запросов, заблокированных из-за rate limiting.
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"action_parameters": {
"response": {
"status_code": 403,
"content": "You have been rate limited.",
"content_type": "text/plain"
}
},
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600
}
}'Чтобы задать конкретную позицию нового правила, включите position (объект) в теле запроса в соответствии с рекомендациями в Изменение порядка правила в наборе правил.
Инструкции по созданию набора правил точки входа и определению его правил одним вызовом API см. в Добавление правил в наборы правил точек входа фаз.
Пример C — rate limiting без учёта кэшированных ресурсов
Этот пример добавляет правило rate limiting в http_ratelimit (набор правил точки входа этой фазы) для зоны с ID $ZONE_ID. Набор правил точки входа фазы уже существует, его ID — $RULESET_ID.
Новое правило не учитывает запросы к кешированным ресурсам при вычислении частоты ("requests_to_origin": true).
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600,
"requests_to_origin": true
}
}'Чтобы задать конкретную позицию нового правила, включите position (объект) в теле запроса в соответствии с рекомендациями в Изменение порядка правила в наборе правил.
Инструкции по созданию набора правил точки входа и определению его правил одним вызовом API см. в Добавление правил в наборы правил точек входа фаз.
Пример D — правило rate limiting на основе сложности
Этот пример добавляет правило rate limiting в http_ratelimit (набор правил точки входа этой фазы) для зоны с ID $ZONE_ID. Набор правил точки входа фазы уже существует, его ID — $RULESET_ID.
Новое правило — это правило rate limiting на основе сложности, которое учитывает my-score для вычисления суммарной оценки сложности для клиента. Счётчик с суммарной оценкой обновляется при совпадении с выражением подсчёта правила rate limiting (в данном случае оно совпадает с выражением правила, поскольку counting_expression — пустая строка). Когда эта суммарная оценка превышает 400 за период 60 секунд (одна минута), последующие запросы клиента будут блокироваться в течение 600 секунд (10 минут).
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My complexity-based rate limiting rule",
"expression": "(http.request.uri.path wildcard \"/graphql/*\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"http.request.headers[\"x-api-key\"]"
],
"score_response_header_name": "my-score",
"score_per_period": 400,
"period": 60,
"mitigation_timeout": 600,
"counting_expression": ""
}
}'Чтобы задать конкретную позицию нового правила, включите position (объект) в теле запроса в соответствии с рекомендациями в Изменение порядка правила в наборе правил.
Инструкции по созданию набора правил точки входа и определению его правил одним вызовом API см. в Добавление правил в наборы правил точек входа фаз.
Дальнейшие шаги
Используйте различные операции в Rulesets API для работы с только что созданным правилом. В следующей таблице перечислены типовые задачи по работе с правилами rate limiting на уровне зоны:
| Задача | Порядок действий |
|---|---|
| Список всех правил в наборе | Используйте Получение набора правил точки входа зоны операцию с Подробнее см. Просмотр конкретного набора правил. |
| Обновление правила | Используйте Обновление правила набора правил зоны (операция API). Потребуется указать ID набора правил и ID правила. Чтобы получить эти ID, можно использовать Получение набора правил точки входа зоны операцию с Подробнее см. Обновление правила в наборе правил. |
| Удаление правила | Используйте Удаление правила из набора правил зоны (операция API). Потребуется указать ID набора правил и ID правила. Чтобы получить эти ID, можно использовать Получение набора правил точки входа зоны операцию с Подробнее см. Удаление правила из набора. |
Эти операции описаны в документации по Ruleset Engine. Ruleset Engine лежит в основе различных продуктов Cloudflare, включая правила rate limiting.
Дополнительные ресурсы
Инструкции по развёртыванию правил rate limiting на уровне аккаунта через API см. в Создание набора правил rate limiting через API.