Glad you found a solution that works for you. I personally don't see any
issues with this since lua is lightweight and haproxy is famous for
efficient resource management. So all should be good under "normal" usage
and by normal I mean a traffic and usage pattern you expect from your app
users that non maliciously overstep your given limits. I cannot say what
will happen in case of a real DDOS attack and how much this buffering can
hurt you :-/, you might want to wait for a reply from one of the more
knowledgeable users or the devs.

On Tue, Jun 9, 2020 at 10:38 PM Stefano Tranquillini <[email protected]> wro

> I may have found a solution, that's a bit more elegant (to me)
>
> The idea is to use a lua script to do some weighted sleep depending on
> data.
> the question is: "is this idea good or bad"? especially, will the
> "core.msleep"  have implications on performance for everybody?
> If someone uses all the connections available it will stuck all the users,
> right?
>
> said so, i should cap/limit the number of connections for each user at the
> same time. but that's another story. (i guess i can create an acl with OR
> condition, if it's 30 request in 10 sec or 30 open connections)
> going back to the beginning.
>
> my lua file
>
> function delay_request(txn)
> local number1 = tonumber(txn:get_var('txn.sc_http_req_rate'))
> core.msleep(50 * number1)
> end
>
> core.register_action("delay_request", { "http-req" }, delay_request, 0);
>
> my frontend
>
> frontend proxy
> bind *:80
>
> stick-table type ip size 100k expire 10s store http_req_rate(10s)
> http-request track-sc0 src
> http-request set-var(txn.sc_http_req_rate) sc_http_req_rate(0)
> http-request lua.delay_request if { sc_http_req_rate(0) gt 30 }
> use_backend api
>
> Basically if there are more than 30 request per 10 seconds, i will make
> them wait 50*count (so starting from 1500ms up to whatver they keep
> insisting)
> does it make sense?
> do you see performance problems?
>
> On Tue, Jun 9, 2020 at 11:12 AM Igor Cicimov <
> [email protected]> wrote:
>
>> On Tue, Jun 9, 2020 at 6:48 PM Stefano Tranquillini <[email protected]>
>> wrote:
>>
>>> Hello,
>>> i didn't really get what has been changed in this example, and why.
>>>
>>> On Tue, Jun 9, 2020 at 9:46 AM Igor Cicimov <
>>> [email protected]> wrote:
>>>
>>>> Modify your frontend from the example like this and let us know what
>>>> happens:
>>>>
>>>> frontend proxy
>>>>     bind *:80
>>>>     stick-table type ip size 100k expire 15s store http_req_rate(10s)
>>>>
>>>
>>> sticky table is now here
>>>
>>>
>>>>     http-request track-sc0 src table Abuse
>>>>
>>> but this refers to the other one , do I've to keep this? is it better to
>>> have it here or shared?
>>>
>>>     use_backend api_delay if { sc_http_req_rate(0) gt 30 }
>>>>
>>>
>>> this is measuring that in the last 10s there are more than 30 requests,
>>> uses the table in this proxy here, not the abuse
>>>
>>>
>>>>     use_backend api
>>>>
>>>> backend api
>>>>     server api01 api01:80
>>>>     server api02 api02:80
>>>>     server api03 api03:80
>>>>
>>>> backend api_delay
>>>>     tcp-request inspect-delay 500ms
>>>>     tcp-request content accept if WAIT_END
>>>>     server api01 api01:80
>>>>     server api02 api02:80
>>>>     server api03 api03:80
>>>>
>>>> Note that as per the sliding window rate limiting from the examples you
>>>> said you read this limits each source IP to 30 requests for the last time
>>>> period of 30 seconds. That gives you 180 requests per 60 seconds.
>>>>
>>>
>>> Yes sorry that's typo should had been
>>
>> frontend proxy
>>     bind *:80
>>     stick-table type ip size 100k expire 15s store http_req_rate(10s)
>>     http-request track-sc0 src
>>     use_backend api_delay if { sc_http_req_rate(0) gt 30 }
>>     use_backend api
>>
>>> In this example, and what I did before, it seems the same behaviour (or
>>> at least per my understanding).
>>> so that, if a user does more than 30 requests in 10 seconds then the
>>> rest are slowed down by 500ms.
>>> right?
>>>
>>>
>> Correct.
>>
>>
>>> it does not really imply that there's a max number of calls per minute.
>>> in fact, if the users makes 500 calls in parallel from the same IP
>>>
>>
>> It implies indirectly, if there are 30 per 10 seconds then there can be a
>> maximum of 180 per minute.
>>
>>>
>>> - the first 30 are executed
>>> - the other 470 are executed but with a "penalty" of 500s
>>>
>>> but that's it. Did i get it correctly?
>>>
>>
>> Yes. If they get executed in the same period of 10 seconds. You can play
>> with the numbers and adjust to your requirements. You can delay them as in
>> your example or drop them.
>>
>> Haproxy have more examples in other articles like Bot net protection one
>> and one about stick tables that I also highly recommend for reading. You
>> might find some interesting info that can help your case.
>>
>>>
>>> --
>>> *Stefano Tranquillini, *CTO/Co-Founder @ chino.io
>>> *Need to talk? book a slot <http://bit.ly/2LdXbZQ>*
>>> *Please consider the environment before printing this email - **keep it
>>> short <http://five.sentenc.es/> *
>>>
>>>
>>>
>>
>
> --
> *Stefano Tranquillini, *CTO/Co-Founder @ chino.io
> *Need to talk? book a slot <http://bit.ly/2LdXbZQ>*
> *Please consider the environment before printing this email - **keep it
> short <http://five.sentenc.es/> *
>
>
>

-- 

Igor Cicimov  | Senior DevOps Engineer

t  +61 (1) 300-362-667

e  [email protected]

w www.encompasscorporation.com

a  Level 10, 117 Clarence Street, Sydney, NSW, Australia 2000

Reply via email to