Это пример конфигурации,
frontend fe_app
bind 0.0.0.0:8484 name http
acl has_auth_header req.fhdr(api-key) -m found
acl mark_as_abuser sc0_inc_gpc0(be_429_table_api) gt 10
acl req_rate_api_abuse sc0_http_req_rate(be_429_table_api) gt 10
http-request set-header X-Concat %[req.fhdr(api-key)]_%[src] if has_auth_header
http-request track-sc0 req.fhdr(X-Concat) table be_429_table_api if has_auth_header
capture request header X-Concat len 100
use_backend be_429_slow_down if mark_as_abuser req_rate_api_abuse has_auth_header
default_backend be_default
backend be_429_table_api
stick-table type string size 100k expire 10s store http_req_rate(10s),http_req_cnt,gpc0,gpt0
backend be_429_slow_down
timeout tarpit 10s
http-request tarpit
И я протестировал с watch -n2 'echo "show table be_429_table_api" | socat stdio unix:/var/run/haproxy.sock'
Проблема при получении запроса gpc0 автоматически начинает увеличиваться . Пока не истек срок действия таблицы. Похоже, это никак не связано с http_req_rate
. Тогда для чего этот счетчик?
Мне нужен счетчик, который увеличивается только тогда, когда http_req_rate> 10. Поэтому, когда он превышает 3 (т.е. преступник повторяет это более 3 раз в течение 1 м), я могу заблокировать. Примерно так:
1) 14:00:00: http_req_rate> 10, abuae_counter = 1
2) 14:00:07 pm: http_req_rate> 10, abuse_counter = 2
3) 14:00:17: http_req_rate> 10 abuse_counter = 3
4) 14:00:45: http_req_rate> 10 abuse_counter = 4> Блок
Тогда я могу просто использовать
use_backend be_429_slow_down if abuse_counter has_auth_header
Как этого добиться? Я думал об использовании lua или set.var, но ничего не получалось.