Reading up on 2 blog posts regarding DDOS protection via haproxy stick-tables 

http://blog.serverfault.com/2010/08/26/1016491873/
http://blog.exceliance.fr/2011/08/25/protect-apache-against-apache-killer-script/

Problem
i tried testing this on my local test server with haproxy v1.5 dev7. But it 
seems if I have an acl rule in place path_beg /forum/images/ and /images/ it 
bypasses the stick-tables completely. It doesn't seem to matter if the acl rule 
is placed before or after the stick-table entry on the frontend www.

If I remove the acl rule for path_beg, then stick-table works !

the acl path_beg rule i have is these 3 lines in frontend www

        acl imagepath path_beg /images/
        acl imagepathforums path_beg /forums/images/
        use_backend imagepath_backend if imagepath or imagepathforums

Problem explained
1. If these acl path_beg rules are enabled then phpinfo.php gets rate limited 
with 503 status error but i.png allows full unrestricted connection speed to 
server bypassing the stick-table completely. 

2. If I remove the path_beg 3 lines outlined above from haproxy config file, 
then both siege tests urls for phpinfo.php and i.png I test against DO NOT 
allow full unrestricted connection to server and are properly rate limited with 
503 status error.

siege -b -c 100 -r 100 http://192.168.56.120/phpinfo.php
siege -b -c 100 -r 100 http://192.168.56.120/forums/images/i.png

So why does the acl path_beg rule bypass the stick-table ?

Config
full frontend www looks like this

##############
# front end options
        frontend www
        mode http
        bind *:80
        default_backend www_backend
        option contstats
        acl spiderbots hdr_sub(user-agent) -i -f /etc/haproxy/spiderbotlist.lst 
        use_backend spider_backend if spiderbots 

  ### Setup stick table ###
  stick-table type ip size 10k expire 60s store gpc0
  # Configure the DoS src
  acl MARKED src_get_gpc0(www) gt 0
  # tarpit attackers if src_DoS
  use_backend backend_tarpit if MARKED
  # If not blocked, track the connection
  tcp-request connection track-sc1 src if ! MARKED
  ### Setup stick table ###

        acl imagepath path_beg /images/
        acl imagepathforums path_beg /forums/images/
        use_backend imagepath_backend if imagepath or imagepathforums

the backend looks like this

##############
# backend options
        backend www_backend
        mode http
        balance roundrobin # Load Balancing algorithm
        cookie SERVERID insert indirect nocache
        option httpchk OPTION /health_check.php
        option forwardfor # This sets X-Forwarded-For

  ### Setup stick table ###
  # Table to track connection rate
  stick-table type ip size 10k expire 60s store conn_rate(5s),bytes_out_rate(5s)
  # Track request
  tcp-request content track-sc2 src
  # Mark as abuser if more than 10 connection
  acl ABUSER sc2_conn_rate gt 10
  acl DATARATE_ABUSER sc2_bytes_out_rate gt 200
  acl MARKED_AS_ABUSER sc1_inc_gpc0 gt 0
  # Block connection concidered as abuser
  tcp-request content reject if ABUSER DATARATE_ABUSER MARKED_AS_ABUSER
  ### Setup stick table ###

        ## Define your servers to balance
        server server1 192.168.56.101:80 weight 1 maxconn 4096 cookie svr1 check
        server server2 192.168.56.120:82 weight 1 maxconn 4096 cookie svr2 check

        backend spider_backend
        mode http 
        balance roundrobin 
        cookie SERVERID insert indirect nocache 
        option httpchk OPTION /health_check.php 
        option forwardfor 
        acl too_fast be_sess_rate gt 10
        acl too_many be_conn gt 10
        tcp-request inspect-delay 3000ms
        tcp-request content accept if ! too_fast or ! too_many
        tcp-request content accept if WAIT_END
        server server1 192.168.56.101:80 weight 1 minconn 1 maxconn 10 cookie 
svr1bot check
        server server2 192.168.56.120:82 weight 1 minconn 1 maxconn 10 cookie 
svr2bot check

        backend imagepath_backend
        mode http
        balance roundrobin
        cookie SERVERID insert indirect nocache
        option httpchk OPTION /health_check.php
        option forwardfor

  ### Setup stick table ###
  # Table to track connection rate
  stick-table type ip size 10k expire 60s store conn_rate(5s),bytes_out_rate(5s)
  # Track request
  tcp-request content track-sc2 src
  # Mark as abuser if more than 10 connection
  acl ABUSER sc2_conn_rate gt 10
  acl DATARATE_ABUSER sc2_bytes_out_rate gt 200
  acl MARKED_AS_ABUSER sc1_inc_gpc0
  # Block connection concidered as abuser
  tcp-request content reject if ABUSER DATARATE_ABUSER MARKED_AS_ABUSER
  ### Setup stick table ###

        server server1 192.168.56.101:80 weight 1 maxconn 500 cookie svr1 check
        server server2 192.168.56.120:82 weight 1 maxconn 500 cookie svr2 check

        backend backend_tarpit
        mode http
        # hold the connection for 10s before answering
        timeout tarpit 10s
        # Emulate a 503 error
        errorfile 500 /etc/haproxy/503.html
        # slowdown any request coming up to here
        reqitarpit .

---
posted at http://www.serverphorums.com
http://www.serverphorums.com/read.php?10,447870,447870#msg-447870

Reply via email to