Мы хотим добиться ограничения скорости на основе ключа. Например, предположим, что если запросов в минуту составляет> 300 для 2 м в 5 раз, используйте http tarpit. Обратите внимание: мы не хотим блокировать нарушителя в первый раз, если он повторяет то же самое более 5 раз.
Ключи API поступают в заголовок http как ключ API
Вот часть файла conf, чего я хочу достичь
frontend http_front
bind *:80
#Server 01
acl server01 hdr_dom(api-key) -i kbcf6c5b2d56d51d89b85
# ACL Functions for rate_limit
acl tx_is_api hdr_dom(host) -i -m sub \-api
acl tx_is_api path_reg -i ^(/v4-)?/api/.*$
acl has_auth_header req.fhdr(api-key) -m found
# API specific counters
acl mark_as_api_abuser sc0_inc_gpc0(be_429_table_api) gt 0
acl req_rate_api_abuse sc0_http_req_rate(be_429_table_api) gt 300
# API table fetches
http-request track-sc0 table be_429_table_api if has_auth_header tx_is_api
# set API call var
http-request set-var(txn.req_api) bool(true) if tx_is_api
use_backend be_429_slow_down if tx_is_api mark_as_api_abuser req_rate_api_abuse
backend be_429_table_api
stick-table type string size 200k expire 2m store gpc0, http_req_rate(60s)
backend be_429_slow_down
timeout tarpit 5s
http-request tarpit
Что я не понимаю, как достичь этого пятикратного окна? Должен быть acl mark_as_api_abuser sc0_inc_gpc0 (be_429_table_api) gt 5? Или я должен использовать другой счетчик отдельно как этот?
acl mark_as_api_abuser sc0_inc_gpc0(be_429_table_api) gt 0
acl acl abuse_cnt src_get_gpc0(Abuse) gt 5
Как счетчик сбросится в этом сценарии?
И что происходит, когда срок действия Stick-table истек? Допустим, пользователь заблокирован на 1 мин 59 сек, останется ли он заблокированным в течение следующих 2 мин? Какое значение я должен выбрать в качестве истечения срока действия в этом сценарии?