Limiter le trafic externe mais autoriser le trafic interne sur nginx

Le tuto nginx est plutôt « léger » sur l’explication concrète de cette configuration de limitation, voici donc quelques compléments d’explication :

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;

server {
    location / {
        limit_req zone=req_zone burst=10 nodelay;

        # ...
    }
}

L’instruction geo créé un variable $limit qui aura pour valeur 0 ou 1 en fonction de l’adresse IP du client. Ici les 2 réseaux privés 10.0… et 192.168.. vont valoriser la variable $limit avec un 0, sinon $limit sera valorisée à 1.

L’instruction map va définir une variable $limit_key, sa valeur va dépendre de la valeur de la variable $limit. Si geo a identifié une IP publique, $limit contiendra 1, donc $limit_key sera valorisé à « $binary_remote_addr se qui va entraîner l’instruction limit_req_zone à s’appliquer sur l’IP du client. Si le client a une IP privée dans ce cas $limit_key sera valorisé à zéro et l’instruction limit_req_zone ne va pas s’exécuter.

La balise limit_req_zone applique une limitation à 5 requêtes par seconde si $limit_key est valorisé à 1.

Dans l’instruction limit_req, un burst (un bonus) de 10 est ajouté. Le nodelay va amener des réponses 503 à partir de la requête 16 si elles arrivent dans la même seconde. En supprimant le nodelay, le navigateur affichera une page qui se charge lentement.

Les liens vers le détail technique des commandes :