My bad, most likely.
After killing haproxy process completely -instead of just config
reloads-, and restarting it, problem can't be reproduced anymore
without rate limiting config.
So most likely it was simply rejecting the request where it seemed to
be serving 'random' blank pages due to config not being reloaded
properly.
Number of denied reqs in the stats is 0 all along though. Bug?
Let me mod the question then though:
All I'm trying to achieve is a simple rate limiting config against
(d)dos attacks.
Need to:
- Serve custom 503 page when client is banned (never give blank page)
- Ban with over 30reqs/10secs, temp ban for 10mins then
Based on "better rate limiting" and docs, I came up with the config
below, but problem is, the rate limiting does not take place with
"use_backend ease-up if conn_rate_abuse mark_as_abuser" in the
backend, while it does _reject_ the page if I use "tcp-request content
reject if conn_rate_abuse mark_as_abuser" in there (but I need custom
503 as stated above).
By the way: to achieve this with as simple config as possible, could 2
stick-tables config be put under a single listen block (don't need
separate frontend/backend blocks for anything but this)?
So the config is as follows:
global
log 127.0.0.1 daemon debug
maxconn 1024
chroot /var/chroot/haproxy
uid 99
gid 99
daemon
quiet
pidfile /var/run/haproxy-private2.pid
defaults
log global
mode http
option httplog
option dontlognull
option redispatch
retries 3
maxconn 3000
contimeout 4000
clitimeout 1000
srvtimeout 200000
stats enable
stats scope MyHost-webfarm
stats uri /secretadmin?stats
stats realm Haproxy\ Statistics
stats auth user:pass
frontend MyHost-webfarm 82.136.111.111:8011
option forwardfor
default_backend works
contimeout 6000
clitimeout 2000
errorfile 503 /usr/local/etc/503error.html
### (d)dos protection ###
# check master 'banned' table first
stick-table type ip size 200k expire 10m store gpc0
acl source_is_abuser src_get_gpc0(http) gt 0
use_backend ease-up if source_is_abuser
tcp-request connection track-sc1 src if ! source_is_abuser
backend works
option httpchk /!healthcheck.php
option httpclose
balance roundrobin
server myserv1 192.168.0.4:80 check inter 5000 rise 2 fall 3
server myserv2 192.168.0.3:80 check inter 5000 rise 2 fall 3
stick-table type ip size 200k expire 1m store conn_rate(10s)
# values below are specific to the backend
tcp-request content track-sc2 src
acl conn_rate_abuse sc2_conn_rate gt 3
# abuse is marked in the frontend so that it's shared between all sites
acl mark_as_abuser sc1_inc_gpc0 gt 0
#tcp-request content reject if conn_rate_abuse mark_as_abuser
use_backend ease-up if conn_rate_abuse mark_as_abuser
backend ease-up
mode http
errorfile 503 /usr/local/etc/503error_dos.html
Thanks for reading!
Joe
Idézet (Willy Tarreau <[email protected]>):
On Tue, Sep 14, 2010 at 11:39:05PM +0200, Jozsef R.Nagy wrote:
Hello guys,
Just been testing 1.5dev2 (and most recent snapshot as well) on freebsd,
evaluating it for its anti-dos capabilities.
The strange thing is..it starts up just fine, serves a few pages just
fine then it returns blank pages.
After a minute or so it will deliver a few pages again and then blank
again..this does happen with no limitation config (no dos protection) as
well.
Could you please send your config ? (you can send it to me privately
if you prefer). I suspect an uninitialized variable or something like
this, though I don't understand why it would only strike on FreeBSD.
Regards,
Willy