Limitación de velocidad nginx con encabezado X-Fordered-For

23

Estoy investigando la limitación de velocidad usando HttpLimitReqModule de nginx . Sin embargo, todas las solicitudes provienen de la misma IP (un equilibrador de carga), con la dirección IP real en los encabezados.

¿Hay alguna manera de tener nginx rate-limit basado en la ip en el X-Forwarded-Forencabezado en lugar de la ip de la fuente?

John Brodie
fuente

Respuestas:

28

Sí, la cadena de definición de configuración de limitación de velocidad típica se ve así:

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

¿Dónde $binary_remote_addrestá la clave única para limitador. Debería intentar cambiarlo a $http_x_forwarded_forvariable que obtiene el valor del X-Forwarded-Forencabezado. Aunque esto aumentará el consumo de memoria porque $binary_remote_addrestá utilizando un formato binario comprimido para almacenar direcciones IP y $http_x_forwarded_forno lo está.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Andrei Mikhaltsov
fuente
Acabo de llegar a la misma conclusión, y en una prueba rápida funciona bien. Gracias por señalar el mayor uso de memoria.
John Brodie
2
Tenga en cuenta que puede haber serios problemas de seguridad con esto: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell
Tenga en cuenta que la información en esa publicación de blog sobre Symfony era direcciones con lo siguiente: symfony.com/doc/current/components/http_foundation/…
calumbrodie
55
Si usa el módulo realip, la $binary_remote_addrvariable se configura correctamente.
Cenk Alti
5

La limit_req_zonedirectiva define la variable que se utilizará como clave para la agrupación de solicitudes.
Por lo general, $binary_remote_addrse usa en lugar de $remote_addrporque es más pequeño y ahorra espacio.

Quizás, alternativamente, desee utilizar el RealipModule .
Esto reescribirá las variables de dirección remota a la dirección proporcionada en un encabezado personalizado y también facilitará el registro y el uso de otras variables.

Lukas
fuente
1
+1 para el módulo RealIP. Al usar este módulo, $binary_remote_addry $remote_addrse configuran al valor de su encabezado configurado, por lo general X-Forwarded-For, sus variables estándar ahora son la "dirección IP del cliente real". Ejecute nginx -Vpara ver si NGINX fue construido con --with-http_realip. Entonces config es tan simple como:, set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; donde el rango CIDR es el de su equilibrador de carga ascendente que está configurando el X-Forwarder-Forencabezado.
Markdsievers