Oct 182013
 

Pour limiter le nombre de requêtes par IP, vous pouvez installer le vmod throttle.
Voici le fichier compilé pour varnish 3.0.4 à placer sous debian dans /usr/lib/varnish/vmods :
libvmod_throttle.so.3.0.4.tar
MAJ : Voici le fichier compilé pour varnish 3.0.5 à placer sous debian dans /usr/lib/varnish/vmods :
libvmod_throttle.so.3.0.5.tar
MAJ : Voici le fichier compilé pour varnish 3.0.3 à placer sous debian dans /usr/lib/varnish/vmods :
libvmod_throttle.so.3.0.3.tar
Il faut ensuite ajouter dans la configuration en premier lieu:

import throttle;

puis dans le vcl_recv :

if(throttle.is_allowed("ip:" + client.ip, "20req/s") > 0s) {
        error 429 "Calm down";
}

Vous pouvez préciser plusieurs ratios entre les guillemets :

20req/s, 200req/30s, 1000req/5m, 2000req/h

Les unités de temps possibles sont : s,m,h,d

Vous pouvez exclure des IPs en utilisant une acl :

acl allowIP {
        "127.0.0.1";
}
 
sub vcl_recv {
        if (!client.ip ~ allowIP) {
                if(throttle.is_allowed("ip:" + client.ip, "20req/s") > 0s) {
                        error 429 "Calm down";
                }
        }
}

Vous pouvez aussi changer comment il applique le ratio, par exemple par user-agent :

if(throttle.is_allowed(req.http.user-agent, "20req/s") > 0s) {

On peut aussi appliquer le ratio que sur les miss par ip par exemple :

sub vcl_miss {
    if(req.url !~ "\.(jpg|jpeg|png|gif|ico|swf|css|js|html|htm)$") {
         if(throttle.is_allowed("miss:" + client.ip, "20req/s") > 0s) {
               error 429 "Calm down";
         }
    }
}

Lien : https://github.com/nand2/libvmod-throttle

Avr 022012
 

Pour se protéger des attaques SYN FLOOD :

Limiter le nombre de connexions parallèles par IP :

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j DROP

Pour se protéger des attaques par SYN FLOOD et QUERY FLOOD :

Limiter le nombre de connexions par seconde par IP (exemple 20 maximum sur 10 secondes sur le port 80):
Le Hitcount ne doit pas être supérieur à 20

iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --hitcount 20 -j DROP

Plus radical, limiter le nombre de paquet syn par seconde :

iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 13 -j DROP

Ou limiter le nombre de paquet syn par seconde par range d’ip (exemple /28) :

iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -m hashlimit --hashlimit-name Web \
--hashlimit-above 10/second --hashlimit-mode srcip --hashlimit-burst 13 --hashlimit-srcmask 28 -j DROP

Pour bloquer une requête HTTP :

iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t' -j DROP

Pour log les IPs qui flood ajouter :

iptables -N flood
iptables -A flood -j LOG --log-prefix "FLOOD "
iptables -A flood -j DROP

et remplacer DROP par flood aux règles précédentes