Alguém conhece uma maneira de usar o HAProxy para adicionar solicitações recebidas a um atraso depois que um determinado número máximo de solicitações chegou e não apenas rejeitar ou enviar um código de status, enfileirar solicitações de um endereço IP específico e, se não forem muitas, permitir uma vez que o número tenha reduzido o suficiente.
Usando a documentação, todas as partes acima parecem possíveis independentemente, embora combinado pareça ser um problema.
Eu tenho o seguinte no meu front end:
#Add counter to ip in ratelimiting table
tcp-request content track-sc0 src table ratelimiting
# if alot of requests (more than 1000) - reject
acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000
tcp-request content reject if mark_alot_of_requests TRUE
#If concurrent requests >= 100 from a single IP return 429
acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100
use_backend 429_slow_down if mark_too_many_requests
Então
backend 429_slow_down
mode http
timeout tarpit 5s
reqitarpit .
errorfile 500 /etc/haproxy/errors/429.http
http-request tarpit
Meu tarpit é que, embora diminuiu a velocidade, mas não se comporta da maneira que eu pensava inicialmente.
A tabela ratelimiting é criada no listen da seguinte forma:
listen ratelimiting
mode http
stick-table type ip size 1m expire 1h store conn_rate(5000),conn_cur
Muito obrigado
Tags haproxy