Welche Techniken und / oder Module stehen zur Verfügung, um eine robuste Ratenbegrenzung (Anforderungen | Bytes / IP / Zeiteinheit) in Apache zu implementieren?
Antworten:
Das beste
und der Rest
mod_evasive
erhält viele Online-Empfehlungen, aber ab Mitte 2017 scheint es von seinem Autor Jonathan Zdziarski aufgegeben worden zu sein, der seltsamerweise alle Verweise darauf aus seinem Blog gelöscht hat - obwohl der Quellcode immer noch als Upload verfügbar ist . Keines der anderen Projekte wurde in den letzten 6 Jahren (oder im Fall von 15 Jahren mod_limitipconn
) aktualisiert .
Wie in diesem Blog- Beitrag angegeben, scheint es möglich zu sein, mit mod_security ein Ratenlimit pro Sekunde zu implementieren.
Die Konfiguration sieht ungefähr so aus:
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"
mod_security
ist kein Apache-Projekt.
Es gibt zahlreiche Möglichkeiten, einschließlich Webanwendungs-Firewalls, aber die einfachste Implementierung, wenn Sie einen Apache-Mod verwenden.
Ein solcher Mod, den ich empfehlen möchte, ist mod_qos . Es ist ein kostenloses Modul, das sehr effektiv gegen Angriffe vom Typ Certin DOS, Bruteforce und Slowloris ist. Dies wird Ihre Serverlast erheblich entlasten.
Es ist sehr mächtig .
Die aktuelle Version des Moduls mod_qos implementiert Kontrollmechanismen zur Verwaltung von:
Die maximale Anzahl gleichzeitiger Anforderungen an einen Standort / eine Ressource (URL) oder einen virtuellen Host.
Begrenzung der Bandbreite, z. B. die maximal zulässige Anzahl von Anforderungen pro Sekunde an eine URL oder die maximale / minimale Anzahl heruntergeladener KByte pro Sekunde.
Begrenzt die Anzahl der Anforderungsereignisse pro Sekunde (spezielle Anforderungsbedingungen).
Generischer Anforderungszeilen- und Headerfilter, um nicht autorisierte Vorgänge zu verweigern.
Beschränkung und Filterung von Körperdaten anfordern (erfordert mod_parp).
Begrenzt die Anzahl der Anforderungsereignisse für einzelne Clients (IP).
Einschränkungen auf der TCP-Verbindungsebene, z. B. die maximal zulässige Anzahl von Verbindungen von einer einzelnen IP-Quelladresse oder die dynamische Keep-Alive-Steuerung.
Dies ist eine Beispielkonfiguration dessen, wofür Sie es verwenden können. Es gibt Hunderte von möglichen Konfigurationen, die Ihren Anforderungen entsprechen. Besuchen Sie die Website für weitere Informationen zu Steuerelementen.
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.
In Apache 2.4 gibt es ein neues Aktienmodul namens mod_ratelimit . Zum Emulieren von Modemgeschwindigkeiten können Sie mod_dialup verwenden . Obwohl ich nicht verstehe, warum Sie mod_ratelimit einfach nicht für alles verwenden können.
SUSPENDED
Status verwendet und keine Threads beim Warten verschwendet, während mod_ratelimit ab sofort ausschließlich Thread-per-Connection ist. vgl. thread.gmane.org/gmane.comp.apache.cvs/20490
Eine weitere Option - mod_qos
Nicht einfach zu konfigurieren - aber leistungsstark.
Hängt davon ab, warum Sie das Limit bewerten möchten.
Um den Server vor Überlastung zu schützen, ist es tatsächlich sinnvoll, NGINX davor zu stellen und dort die Ratenbegrenzung zu konfigurieren . Dies ist sinnvoll, da NGINX viel weniger Ressourcen verbraucht, beispielsweise einige MB pro zehntausend Verbindungen. Wenn der Server überflutet ist, führt NGINX die Ratenbegrenzung durch (unter Verwendung einer unbedeutenden Menge an Ressourcen) und leitet den zulässigen Datenverkehr nur an Apache weiter.
Wenn Sie nur nach Einfachheit suchen, verwenden Sie so etwas wie mod_evasive.
Verwenden Sie zum Schutz vor DDoS- oder DoS-Angriffen wie gewohnt einen Dienst wie Cloudflare, der ebenfalls eine Ratenbegrenzung aufweist.