Wie kann ich mit Apache eine Ratenbegrenzung implementieren? (Anfragen pro Sekunde)


84

Welche Techniken und / oder Module stehen zur Verfügung, um eine robuste Ratenbegrenzung (Anforderungen | Bytes / IP / Zeiteinheit) in Apache zu implementieren?


Ich verwende Linux tc auf dem Webserver, da Red Hat 6 nur Apache 2.2 hat.
Ceving

Antworten:


55

Das beste

und der Rest


10
Ich konnte nichts finden, um die Verbindungen pro Tag nach IP-Adresse zu begrenzen. Ich habe die ganze Nacht gesucht, das ist eine Schande.
Greg

1
Weiß jemand, ob es eine Möglichkeit gibt, mod_evasive dazu zu bringen, einen Header anstelle der IP zu betrachten, wenn er hinter einem Reverse-Proxy ausgeführt wird?
Stavros Korokithakis

6
Ist mod_evasive 4 Jahre später immer noch "das Beste"?
Zac Thompson

5
Sichern Sie Ihren Anspruch. Warum sind _evasive und _cband die besten?
Reed

3
mod_evasiveerhä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 .
Anthony Geoghegan

18

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"

3
Das war perfekt für mich, da modsec2 bereits läuft. Musste nur IDs zu den Regeln hinzufügen, um mit der Modsec-Version übereinzustimmen, wie folgt: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "Phase: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" Phase: 2, Pause: 300, Verweigern, Status: 509, setenv: RATELIMITED, Überspringen: 1, nolog, id: 10000003 "SecAction" -Phase: 2, pass, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Header immer Retry-After setzen" 10 "env = RATELIMITED </ LocationMatch>
Nathan Stretch

2
Beachten Sie auch, dass Sie durch Bearbeiten des "@gt 60" ändern können, wie viele anfängliche Burst-Anforderungen zulässig sind, und wie schnell das Limit durch Bearbeiten des Bits "ip.somepathcounter = 1/1" "aufgeladen" wird. 1/1 erlaubt eine zusätzliche Anfrage pro Sekunde. 1/2 erlaubt eine zusätzliche Anfrage alle 2 Sekunden usw.
Nathan Stretch

3
Apache 2.4 beschwert sich über das 509 in ErrorDocument, eine Option ändert es in 429 (was in Apache 2.2 natürlich nicht unterstützt wird). Außerdem benötigen alle SecAction und SecRule-s eine ID seit mod_security 2.7.
Mrten

1
Zu Ihrer Information mod_securityist kein Apache-Projekt.
Christopher Schultz

12

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).

  • Begrenzt die Anzahl der Anforderungsereignisse innerhalb eines definierten Zeitraums.
  • Es kann auch sehr wichtige Personen (VIP) erkennen, die ohne oder mit weniger Einschränkungen auf den Webserver zugreifen können.
  • 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.

  • Bevorzugt bekannte IP-Adressen, wenn der Server keine freien TCP-Verbindungen mehr hat.

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.

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


Dieser funktioniert nur in altem Apache2.2, nicht in Apache2.4 +, oder?
Infiniteloop

@infiniteloop Auf der SourceForge-Seite von mod_quos heißt es, dass es mit Apache2.4 gut funktioniert. Es gibt jedoch eine spezielle Diskussion über einige Funktionen, die hier nicht funktionieren: stackoverflow.com/a/15726540/1402498
JamesHoux

6

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.


Beachten Sie, dass mod_dialup einen asynchronen SUSPENDEDStatus 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
ArtemGr

6

Funktioniert mod_evasiveleider nicht wie erwartet, wenn es in Konfigurationen ohne Prefork verwendet wird (neuere Apache-Setups sind hauptsächlich MPM).



1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.