Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HAProxy slow down connections from specific IP

Tags:

haproxy

Does anybody know a way of using HAProxy to add incoming requests to a delay once a certain maximum number of requests reached and not just reject or send a status code, actually queue a specific IP address' requests and if not too many, allow once the number has reduced enough.

Using the documentation all the above parts seem possible independently although combined seems to be a problem.

I have the following in my 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

Then

backend 429_slow_down
    mode http
    timeout tarpit 5s
    reqitarpit .
    errorfile 500 /etc/haproxy/errors/429.http
    http-request tarpit

Is my tarpit that i though did slow them down but doesn't behave in the way I initially thought.

The ratelimiting table is created in the listen as follows:

listen ratelimiting
    mode http
    stick-table type ip size 1m expire 1h store conn_rate(5000),conn_cur

Many thanks

like image 617
Mr Sorbose Avatar asked Feb 05 '26 20:02

Mr Sorbose


1 Answers

I would use inspect-timeout with 'WAIT_END` in the frontend section

frontend mywww

   tcp-request content track-sc0 src table ratelimiting

   acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000
   tcp-request content reject if mark_alot_of_requests TRUE

   acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100

   # delay for request inspect, it will be used for effectively client delay 
   tcp-request inspect-delay 1000ms

   # if client is not too fast let it through
   tcp-request content accept unless mark_too_many_requests

   # too fast clients, will need to wait entire inspect-delay
   tcp-request content accept if WAIT_END

   use_backend some_normal_backend
like image 72
kwarunek Avatar answered Feb 07 '26 10:02

kwarunek



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!