Hi Amol,
For example, this one:
# Shut the new connection as long as the client has already 40 opened
tcp-request connection reject if { src_conn_cur ge 40 }
Should be written
# Shut the new connection as long as the client has already 40 opened
tcp-request connection reject if { sc0_conn_cur ge 40 }
Baptiste
On Mon, Aug 17, 2015 at 4:53 AM, Amol <[email protected]> wrote:
> Hi Baptiste,
> I tried to read about SC0 and SRC, but i am not quite sure what i would gain
> by changing SRC to SCO for the acl paramters? did u have some example to
> explain?
>
> Thanks
>
> ________________________________
> From: Amol <[email protected]>
> To: Baptiste <[email protected]>
> Cc: HAproxy Mailing Lists <[email protected]>
> Sent: Friday, August 14, 2015 2:06 PM
>
> Subject: Re: Regarding using HAproxy for rate limiting
>
> Hi Baptiste,
> Yes sorry i might have confused you with some questions but to answer your
> questions
>
> "here, the question is: what kiils your server exactly?
> A high number of queries from a single users or whatever the number of
> users?
> I'm trying to understand what you need..."
> Yes i am trying to protect against high number of requests from a single
> user who can use API's or even mis-configure API's to generate high load.
>
> reposting the configuration
>
> frontend www-https
> bind xx.xx.xx.xx:443 ssl crt xxxx.pem ciphers AES128+EECDH:AES128+EDH
> no-sslv3 no-tls-tickets
>
> # Table definition
> stick-table type ip size 100k expire 30s store
> gpc0,conn_cur,conn_rate(3s),http_req_rate(10s),http_err_rate(10s)
>
> # Allow clean known IPs to bypass the filter
> tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
>
> # this is sending data defined in the stick-table and storing it the
> stick-table since by default nothing is restored in it
> tcp-request connection track-sc0 src
>
> # Shut the new connection as long as the client has already 40 opened
> tcp-request connection reject if { src_conn_cur ge 40 }
>
> # if someone has more than 40 connections in over a period of 3 seconds,
> REJECT
> tcp-request connection reject if { src_conn_rate ge 40 }
>
> # tracking connections that are not rejected from clients that don't have
> 10 connections/don't have 10 connections/3 seconds
> #tcp-request connection reject if { src_get_gpc0 gt 0 }
>
> acl abuse_err src_http_err_rate ge 10
> acl flag_abuser_err src_inc_gpc0 ge 0
> acl abuse src_http_req_rate ge 250
> #acl flag_abuser src_inc_gpc0 ge 0
> #tcp-request content reject if abuse_err flag_abuser_err
> #tcp-request content reject if abuse flag_abuser
>
> use_backend backend_slow_down if abuse flag_abuser
> use_backend backend_slow_down if abuse_err flag_abuser_err
> default_backend www-backend
>
> backend www-backend
> balance leastconn
> cookie BALANCEID insert indirect nocache secure httponly
> option httpchk HEAD /xxx.php HTTP/1.0
> redirect scheme https if !{ ssl_fc }
> server A1 xx.xx.xx.xx:80 cookie A check
> server A2 yy.yy.yy.yy:80 cookie B check
>
> backend backend_slow_down
> timeout tarpit 2s
> errorfile 500 /etc/haproxy/errors/429.http
> http-request tarpit
>
>
> ------
>
> Yes i will check out the difference between SC0 and SRC paramters in config
>
> regarding this .....
>> What i am doing here is that if the http_req_rate > 250 then i want to
>> send
>> them to a another backend which gives them a rate limiting message or if
>> the
>> number of concurrent connections are > 4, then i want to rate limit their
>> usage and allow on 40 connections to come in.
>
> i was trying to make 2 points i guess i should have been more clear...
> So i was saying that based on my config i am trying to achieve 2 things
>
> 1) to rate limit a client with high number of http requests in a certain
> time span (http_req_rate)
> 2) to rate limit a client with high number of concurrent connections in the
> certain time span. (src_conn_cur and src_conn_rate )
>
> Thanks once again for looking into this.
>
>
>
>
>
> ________________________________
> From: Baptiste <[email protected]>
> To: Amol <[email protected]>
> Cc: HAproxy Mailing Lists <[email protected]>
> Sent: Friday, August 14, 2015 1:40 PM
> Subject: Re: Regarding using HAproxy for rate limiting
>
> Hi Amol,
>
> On Fri, Aug 14, 2015 at 4:16 PM, Amol <[email protected]> wrote:
>> Hello,
>> I am been trying to configure my Haproxy for rate limiting our customer
>> usage, and wanted to know/understand some of my options
>> what i am trying to achieve is to throttle any clients requests/api calls
>> that can take lead to high load and can kill my servers.
>
> here, the question is: what kiils your server exactly?
> A high number of queries from a single users or whatever the number of
> users?
> I'm trying to understand what you need...
>
>
>> First of all here is my configuration i have so far from reading a few
>> articles
>>
>> frontend www-https
>> bind xx.xx.xx.xx:443 ssl crt xxxx.pem ciphers AES128+EECDH:AES128+EDH
>> no-sslv3 no-tls-tickets
>>
>> # Table definition
>> stick-table type ip size 100k expire 30s store
>> gpc0,conn_cur,conn_rate(3s),http_req_rate(10s),http_err_rate(10s)
>> # Allow clean known IPs to bypass the filter
>> tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
>> # this is sending data defined in the stick-table and storing it the
>> stick-table since by default nothing is restored in it
>> tcp-request connection track-sc0 src
>> # Shut the new connection as long as the client has already 10 opened
>> tcp-request connection reject if { src_conn_cur ge 40 }
>> # if someone has more than 100 connections in over a period of 3
>> seconds,
>> REJECT
>> tcp-request connection reject if { src_conn_rate ge 40 }
>> # tracking connections that are not rejected from clients that don't
>> have
>> 10 connections/don't have 10 connections/3 seconds
>> #tcp-request connection reject if { src_get_gpc0 gt 0 }
>>
>> acl abuse_err src_http_err_rate ge 10
>> acl flag_abuser_err src_inc_gpc0 ge 0
>> acl abuse src_http_req_rate ge 250
>> #acl flag_abuser src_inc_gpc0 ge 0
>> #tcp-request content reject if abuse_err flag_abuser_err
>> #tcp-request content reject if abuse flag_abuser
>>
>> use_backend backend_slow_down if abuse
>> #use_backend backend_slow_down if flag_abuser
>> use_backend backend_slow_down if abuse_err flag_abuser_err
>> default_backend www-backend
>>
>> backend www-backend
>> balance leastconn
>> cookie BALANCEID insert indirect nocache secure httponly
>> option httpchk HEAD /xxx.php HTTP/1.0
>> redirect scheme https if !{ ssl_fc }
>> server A1 xx.xx.xx.xx:80 cookie A check
>> server A2 yy.yy.yy.yy:80 cookie B check
>>
>> backend backend_slow_down
>> timeout tarpit 2s
>> errorfile 500 /etc/haproxy/errors/429.http
>> http-request tarpit
>
> you should use the sc0_conn_* functions instead of src_conn_* since
> you're tracking over sc0.
> Also, please repost your configuration with comments updated. For now,
> some comments doesn't match the statement you configured, which makes
> it hard to follow up.
>
>> What i am doing here is that if the http_req_rate > 250 then i want to
>> send
>> them to a another backend which gives them a rate limiting message or if
>> the
>> number of concurrent connections are > 4, then i want to rate limit their
>> usage and allow on 40 connections to come in.
>
> Please be more accurate on the context.
> Furthermore, you mix rate-limiting and concurrent connections for the
> same purpose in your sentence and I'm really confused about the real
> goal you want to achieve.
>
>
>> Please feel free to critique my config. Now on to questions,
>>
>> 1) is rate limiting based on IP a good way to do this or has anyone tried
>> of
>> other ways?
>
> The closest to the application layer the best.
> If you have a cookie or whatever header we can use to perform rate
> limiting, then it would be much better than source IP.
>
>> 2) Am i missing anything critical in the configuration?
>
> no idea as long as I still don't know what your primary goal was.
>
>> 3) when does the src_inc_gpc0 counter really increment? does it increment
>> for every subsequent request from the client in the given timeframe, i
>> have
>> seen it goes from 0 to 6 during my test but wasn't sure about it
>
> Each event may update a counter, such as a new connection or a new
> HTTP request coming in.
>
>
>
>
>> 4) can i not rate limit by just adding the maxconn to the server in the
>> backend or will that throttle everyone instead of the rogue IP...
>
>
> This will prevent your server from running too many request in
> parallel and then being overloaded.
> You can mix both technics. server's maxconn to protect servers against
> a huge load generated by many clients running 1 request + the
> configuration you setup above to prevent a single user to generate too
> many request and taking too much connections allowed by the maxconn.
>
>
> Baptiste
>
>
>>
>>
>>
>
>
>
>