¿Cómo puedo implementar la limitación de velocidad con Apache? (solicitudes por segundo)

84

¿Qué técnicas y / o módulos están disponibles para implementar una limitación de velocidad robusta (solicitudes | bytes / ip / unidad de tiempo) en apache?

bd808
fuente
Estoy usando tc de Linux en el servidor web, porque Red Hat 6 solo tiene Apache 2.2.
partir

Respuestas:

55

El mejor

  • mod_evasive (más centrado en reducir la exposición al DoS)
  • mod_cband (Mejor característica para el control de ancho de banda 'normal')

y el resto

Vinko Vrsalovic
fuente
10
No pude encontrar nada para limitar las conexiones por día por dirección IP. Pasé toda la noche buscando, es una pena.
Greg
1
¿Alguien sabe si hay una manera de hacer que mod_evasive mire un encabezado en lugar de la IP, para cuando se ejecuta detrás de un proxy inverso?
Stavros Korokithakis
6
4 años después, ¿mod_evasive sigue siendo "el mejor"?
Zac Thompson
6
Respalde su reclamo. ¿Por qué _evasive y _cband son los mejores?
Reed
4
mod_evasiverecibe muchas recomendaciones en línea pero, a mediados de 2017, parece haber sido abandonado por su autor, Jonathan Zdziarski, quien extrañamente eliminó todas las referencias a él de su blog, aunque el código fuente todavía está disponible como carga . Ninguno de los otros proyectos se ha actualizado en los últimos 6 años (o 15 años en el caso de mod_limitipconn).
Anthony Geoghegan
19

Como se indica en esta publicación de blog , parece posible usar mod_security para implementar un límite de velocidad por segundo.

La configuración es algo como esto:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"
Diego Fernández Durán
fuente
3
Esto fue perfecto para mí, con modsec2 ya ejecutándose. Solo tuve que agregar identificadores a las reglas para que coincidieran con la versión de modsec, así: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "fase: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" fase: 2, pause: 300, deny, status: 509, setenv: RATELIMITED, skip: 1, nolog, id: 10000003 "SecAction" fase: 2, pass, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "El encabezado siempre se establece Retry-After" 10 "env = RATELIMITED </LocationMatch>
Nathan Stretch
2
También tenga en cuenta que puede cambiar la cantidad de solicitudes de ráfagas iniciales permitidas editando el "@gt 60", así como la rapidez con la que "recarga" el límite editando el ip.somepathcounter = 1/1 bit. 1/1 permite una solicitud adicional por segundo. 1/2 permite una solicitud adicional cada 2 segundos, etc.
Nathan Stretch
3
Apache 2.4 se quejará del 509 en ErrorDocument, una opción es cambiarlo a 429 (que, por supuesto, no es compatible con Apache 2.2). Además, todas las SecAction y SecRule-s necesitan una identificación desde mod_security 2.7.
Mrten
1
FYI mod_securityno es un proyecto de Apache.
Christopher Schultz
12

Hay numerosas formas de incluir firewalls de aplicaciones web, pero la más fácil de implementar si se usa un mod de Apache.

Uno de esos mod que me gusta recomendar es mod_qos . Es un módulo gratuito muy eficaz contra ataques de tipo certin DOS, Bruteforce y Slowloris. Esto aliviará bastante la carga de su servidor.

Es muy poderoso .

La versión actual del módulo mod_qos implementa mecanismos de control para administrar:

  • El número máximo de solicitudes simultáneas a una ubicación / recurso (URL) o host virtual.

  • Limitación del ancho de banda, como el número máximo permitido de solicitudes por segundo a una URL o el máximo / mínimo de kbytes descargados por segundo.

  • Limita el número de eventos de solicitud por segundo (condiciones de solicitud especiales).

  • Limita el número de eventos de solicitud dentro de un período de tiempo definido.
  • También puede detectar personas muy importantes (VIP) que pueden acceder al servidor web sin o con menos restricciones.
  • Línea de solicitud genérica y filtro de encabezado para denegar operaciones no autorizadas.

  • Solicitar limitación y filtrado de datos corporales (requiere mod_parp).

  • Limita el número de eventos de solicitud para clientes individuales (IP).

  • Limitaciones en el nivel de conexión TCP, por ejemplo, el número máximo de conexiones permitidas desde una única dirección de origen IP o control dinámico de mantenimiento.

  • Prefiere direcciones IP conocidas cuando el servidor se queda sin conexiones TCP libres.

Esta es una configuración de muestra de para qué puede usarla. Hay cientos de configuraciones posibles para satisfacer sus necesidades. Visite el sitio para obtener más información sobre los controles.

Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate                                 120

# limits the connections for this virtual host:
QS_SrvMaxConn                                     800

# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP                                 50

# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP                    172.18.3.32
QS_SrvMaxConnExcludeIP                    192.168.10.

http://opensource.adnovum.ch/mod_qos/

Panama Jack
fuente
este solo funciona en el antiguo apache2.2 no funciona en apache2.4 +, ¿verdad?
infiniteloop
@infiniteloop la página mod_quos sourceforge dice que funciona bien con apache2.4. Pero hay una discusión específica sobre un par de características que no funcionan aquí: stackoverflow.com/a/15726540/1402498
JamesHoux
6

En Apache 2.4, hay un nuevo módulo de stock llamado mod_ratelimit . Para emular velocidades de módem, puede usar mod_dialup . Aunque no veo por qué no puedes usar mod_ratelimit para todo.

Janus Troelsen
fuente
Tenga en cuenta que mod_dialup utiliza un SUSPENDEDestado asincrónico , sin desperdiciar hilos en espera, mientras que mod_ratelimit, a partir de ahora, es estrictamente hilo por conexión. cf. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr
6

Lamentablemente, mod_evasiveno funcionará como se esperaba cuando se use en configuraciones que no sean prefork (las configuraciones recientes de Apache son principalmente MPM)

wuzer
fuente
1

Depende de por qué desea limitar la tasa.

Si se trata de proteger contra la sobrecarga del servidor, en realidad tiene sentido poner NGINX delante y configurar la limitación de velocidad allí. Tiene sentido porque NGINX usa muchos menos recursos, algo así como unos pocos MB por cada diez mil conexiones. Entonces, si el servidor está inundado, NGINX hará la limitación de velocidad (usando una cantidad insignificante de recursos) y solo pasará el tráfico permitido a Apache.

Si lo único que busca es simplicidad, utilice algo como mod_evasive.

Como de costumbre, si es para protegerse contra ataques DDoS o DoS, use un servicio como Cloudflare que también tiene limitación de velocidad.

NerdOfLinux
fuente