DoS protection strategies
Roberto Nibali
ratz at drugphish.ch
Tue Apr 18 19:41:18 BST 2006
Hello,
> To my surprise, opening 150 tcp connections to a default apache
> installation is enough to effectively DoS it for a few minutes (until
> connections time out).
What is your exact setup?
Only on a really badly configured web server or maybe a 486 machine :).
Otherwise this does not hold. Every web server will handle at least 1000
concurrent TCP connections easily. After that you need some ulimit or
epoll tweaking.
> This could be circumvented by using
> mod_throttle, mod_bwshare or mod_limitipconn but imho a much better
Nope, you then just open a HTTP 1.1 channel and reload using GET / every
MaxKeepAliveTimeout-1. Those modules will not help much IMHO. They only
do QoS on established sockets. It's the wrong place to interfere.
> place to solve this is at the LVS loadbalancer. Which already does
> source IP tracking for the "persistency" feature.
Does not help either, it's not a Layer 4 issue, it's a higher layer
issue. Even if it wasn't, how would source IP tracking ever help?
> Did anyone implement such a feature? Considerations?
Check out HTTP 1.1 & pipelining. Read up on the timing configurations
and so on.
> A sample script to test your webhosting provider:
>
> #!/usr/bin/perl
> my $target = shift or die "Usage: $0 <target>\n";
> use IO::Socket::INET;
> for my $t (0..300) {
> print "Try $t... ";
> $cons[$t] = IO::Socket::INET->new( PeerAddr => "$target:80", Proto
> => 'tcp', Blocking => 1 )
> or die "Couldn't connect!";
> print "connected!\n";
> }
> print "Enter to drop connections...\n";
> <STDIN>;
Besides that only poorly-configured web servers will allow you to hold a
socket after a simple TCP handshake without sending any data, you get a
close on the socket for HTTP 1.1 configured web servers with low timeouts.
You are right however, in that using such an approach of blocking TCP
connections (_inluding_ data fetching) can tear down a lot of (even very
well known) web sites. I've actually started writing a paper on this
last year, however never finished it. I wrote a proof-of-concept tool
that would (after some scanning and timeout guessing) block a whole web
site, if not properly configured. This was done using the CURL library.
It simulates some sort of slow-start slashdot-effect.
Best regards,
Roberto Nibali, ratz
--
echo
'[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq' | dc
More information about the lvs-users
mailing list