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

Mar 062012
 

Vous pouvez limiter l’accès à un site ou une partie du site avec Varnish.
C’est utile car les limitations par IP au niveau Apache2 ne fonctionne pas avec Varnish, car les IPs clients détectées sont celle du Varnish.
Ajoutez une acl avec la liste de vos IPs autorisées.

acl iplimit {
        {"1.2.3.4"};
        {"9.8.7.6"};
}

Ensuite ajoutez dans le vcl_recv par exemple :

if (!(client.ip ~ iplimit)) {
        return(error);
}