Quelles techniques et/ou quels modules sont disponibles pour implémenter une limitation de débit robuste (requêtes | octets/ip/unité de temps) dans apache?
Le meilleur
et le reste
Comme indiqué dans ce blog post, il semble possible d’utiliser mod_security pour mettre en œuvre une limite de débit par seconde.
La configuration ressemble à ceci:
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"
Il existe de nombreuses façons, y compris les pare-feu d'applications Web, mais la chose la plus simple à mettre en œuvre si vous utilisez un mod Apache.
Un de ces mods que je voudrais recommander est mod_qos . C'est un module gratuit très efficace contre les attaques de type DOS, Bruteforce et Slowloris. Cela facilitera un peu la charge de votre serveur.
C'est très puissant.
La version actuelle du module mod_qos implémente des mécanismes de contrôle pour gérer:
Nombre maximal de demandes simultanées adressées à un emplacement/une ressource (URL) ou à un hôte virtuel.
Limitation de la bande passante, telle que le nombre maximal autorisé de requêtes par seconde pour une URL ou le nombre maximum/minimum de kilo-octets téléchargés par seconde.
Limite le nombre d'événements de requête par seconde (requête spéciale Conditions).
Ligne de requête générique et filtre d’entête pour refuser les opérations Non autorisées.
Demande de limitation et de filtrage des données du corps (requiert mod_parp).
Limite le nombre d'événements de demande pour des clients individuels (IP).
Limitations sur le niveau de connexion TCP, par exemple, le nombre maximal de connexions autorisées pour À partir d'une adresse IP unique ou d'un contrôle dynamique Keep-alive.
Ceci est un exemple de configuration de ce que vous pouvez utiliser. Il existe des centaines de configurations possibles pour répondre à vos besoins. Visitez le site pour plus d'informations sur les contrôles.
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.
Dans Apache 2.4, il y a un nouveau module de stock appelé mod_ratelimit . Pour émuler les vitesses de modem, vous pouvez utiliser mod_dialup . Bien que je ne vois pas pourquoi vous ne pouviez pas utiliser mod_ratelimit pour tout.
Malheureusement, mod_evasive
ne fonctionnera pas comme prévu lorsqu'il est utilisé dans des configurations autres que celles de Prefork (les dernières configurations Apache sont principalement MPM)
Une autre option - mod_qos
Pas simple à configurer - mais puissant.
Cela dépend de la raison pour laquelle vous souhaitez évaluer la limite.
Si vous voulez éviter de surcharger le serveur, placez NGINX devant vous et configurez limitant le taux ici. Cela a du sens car NGINX utilise beaucoup moins de ressources, de l’ordre de quelques Mo par dix mille connexions. Ainsi, si le serveur est saturé, NGINX fera la limitation de débit (en utilisant une quantité non significative de ressources) et ne transmettra que le trafic autorisé à Apache.
Si vous ne recherchez que la simplicité, utilisez quelque chose comme mod_evasive.
Comme d'habitude, si vous souhaitez vous protéger contre les attaques par DDoS ou DoS, utilisez un service comme Cloudflare, qui offre également une limitation de débit.
Regardez Apache 2.4 mod_ratelimit .
Fournit un filtre nommé RATE_LIMIT pour limiter la bande passante du client. Le La limitation est appliquée à chaque réponse HTTP lorsqu’elle est transférée à le client, et non agrégé au niveau IP/client. La connexion la vitesse à simuler est spécifiée, en Ko/s, en utilisant l'environnement limite de taux variable.
<Location "/downloads">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400
SetEnv rate-initial-burst 512
</Location>