limitation du débit nginx avec en-tête X-Forwarded-For

23

J'examine la limitation de débit en utilisant HttpLimitReqModule de nginx . Cependant, les demandes proviennent toutes de la même IP (un équilibreur de charge), avec la véritable adresse IP dans les en-têtes.

Existe-t-il un moyen d'avoir nginx rate-limit basé sur l'ip dans l'en- X-Forwarded-Fortête au lieu de l'ip de la source?

John Brodie
la source

Réponses:

28

Oui, la chaîne de définition de configuration à limitation de débit type ressemble à:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

$binary_remote_addrest la clé unique pour le limiteur. Vous devriez essayer de le changer en $http_x_forwarded_forvariable qui obtient la valeur de l'en- X-Forwarded-Fortête. Bien que cela augmentera la consommation de mémoire car $binary_remote_addrutilise le format binaire compressé pour stocker les adresses IP et $http_x_forwarded_forne l'est pas.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Andrei Mikhaltsov
la source
Je suis juste arrivé à la même conclusion, et dans un test rapide, cela fonctionne bien. Merci d'avoir souligné l'utilisation accrue de la mémoire.
John Brodie
2
Attention, cela peut poser de graves problèmes de sécurité: blog.ircmaxell.com/2012/11/11/anatomy-of-attack-how-i-hacked.html
ircmaxell
Notez que les informations contenues dans ce blog concernant symfony étaient des adresses avec les éléments suivants: symfony.com/doc/current/components/http_foundation/…
calumbrodie
5
Si vous utilisez le module realip, la $binary_remote_addrvariable est définie correctement.
Cenk Alti
5

La limit_req_zonedirective définit la variable à utiliser comme clé pour le regroupement des demandes.
Habituellement, le $binary_remote_addrest utilisé plutôt que $remote_addrparce qu'il est plus petit et économise de l'espace.

Vous souhaitez peut-être également utiliser le RealipModule .
Cela réécrira les variables d'adresse distante à l'adresse fournie dans un en-tête personnalisé et facilitera également la journalisation et l'utilisation d'autres variables.

Lukas
la source
1
+1 pour le module RealIP. Lorsque vous utilisez ce module, $binary_remote_addret $remote_addrsont définis sur la valeur de votre en-tête configuré, généralement X-Forwarded-For- de sorte que vos variables standard sont désormais la «véritable adresse IP du client». Exécutez nginx -Vpour voir si NGINX a été construit avec --with-http_realip. La configuration est alors aussi simple que set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; :, où la plage CIDR est celle de votre équilibreur de charge en amont qui définit l'en- X-Forwarder-Fortête.
markdsievers