Apache: Begrenzen Sie die Anzahl der Anfragen / Verkehr pro IP?

12

Ich möchte nur einer IP erlauben, bis zu 1 GB Datenverkehr pro Tag zu verwenden. Wenn dieses Limit überschritten wird, werden alle Anforderungen von dieser IP bis zum nächsten Tag gelöscht. Eine einfachere Lösung, bei der die Verbindung nach einer bestimmten Anzahl von Anforderungen getrennt wird, würde jedoch ausreichen.

Gibt es bereits ein Modul, das dies kann? Oder kann ich das vielleicht durch so etwas wie iptables erreichen?

Vielen Dank


quelle
Apache-Version?
Pehrs
2.2 - Füllen der Zeichenbeschränkung

Antworten:

5

Wenn Sie eine reine Apache-Lösung wünschen, bw_mod für Apache 2.0 und mod_bandwidth für Apache 1.3. Sie können die Bandbreite Ihres Servers drosseln, um die Bandbreitennutzung zu begrenzen.

Es gibt auch mod_limitipconn, das verhindert, dass ein Benutzer viele Verbindungen zu Ihrem Server herstellt. mod_cband ist eine andere Option, aber ich habe sie nie benutzt.

Wenn Sie sich nicht mit Ihrer Apache-Installation anlegen möchten, können Sie einen Squid-Proxy vor Apache platzieren. Es gibt Ihnen mehr Kontrolle auch über die Drosselung.

In den meisten Fällen liegt das Problem jedoch bei einigen großen Objekten, wenn Sie die Bandbreite pro IP begrenzen möchten, und Sie möchten eine vernünftige Fehlermeldung ausgeben, wenn ein Benutzer zu viele Daten abruft und Sie ihn blockieren. In diesem Fall ist es möglicherweise einfacher, ein PHP-Skript zu schreiben und die Zugriffsinformationen in einer temporären Tabelle in einer Datenbank zu speichern.

pehrs
quelle
2
Danke für die Vorschläge. Ich habe mir bereits bw_mod und mod_limitipconn angesehen, aber keiner (soweit ich das beurteilen kann) tut, was ich will. mod_limitipconn beschränkt sie einfach auf jeweils eine Verbindung, und mit bw_mod kann ich nur die Download-Rate pro IP begrenzen. Ich möchte sie nach einer bestimmten Menge an Datenübertragung / Anfragen blockieren. Ich versuche mich tatsächlich gegen bestimmte Benutzer zu verteidigen, die das Bedürfnis haben, meine gesamte Website zu crawlen und alles herunterzuladen. Ich werde einen Blick in den Tintenfisch-Proxy werfen, klingt interessant. Wenn das nicht klappt, werde ich wahrscheinlich die bw_mod-Quelle ändern.
Haben Sie Ihre robots.txt so eingestellt, dass Spinnen nicht zugelassen werden?
Pehrs
1
Das Problem mit robots.txt ist, dass (ähnlich wie beim RFC 3514) nur nette Roboter dies respektieren.
Scott Pack
Stimmt, aber Sie werden feststellen, dass die Mehrheit der Personen, die Ihre Website spinnen, Standardtools verwendet. Und viele von ihnen, wie wget, respektieren robots.txt. Robots.txt ist auch der richtige Weg, um Ihre Benutzer darüber zu informieren, dass sie nicht spinnen sollen.
Pehrs
1
Ich habe das versucht. Zuerst war robots.txt genug, dann sagten sie Wget, sie sollten robots.txt ignorieren, also habe ich "nicht erkannte" Benutzeragenten blockiert, aber dann haben sie den Benutzeragenten gefälscht. Sie neigen dazu, viele Kopfanfragen zu stellen, während legitime Browser dies nicht tun. Daher kann ich versuchen, Kopfanfragen einzuschränken oder ganz zu deaktivieren (weniger wünschenswert).
5

Dies ist meine iptables-Lösung für diese Art von Problem. Passen --seconds --hitcountSie nach Bedarf auch die Tabelle iptables an.

iptables -A FORWARD -m state --state NEW -m recent --rcheck --seconds 600 --hitcount 5 --name ATACK --rsource -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -d 192.168.0.113/32 -o eth1 -p tcp -m tcp --dport 80 -m recent --set --name ATACK --rsource -j ACCEPT

Erklärt:

  1. iptablesÜberprüfen Sie, ob die Quell-IP in der Datei / proc / net / ipt_recent / ATACK mindestens fünfmal im Abstand von 600 Sekunden aufgeführt ist und ob es sich um eine NEUE Anforderung handelt. Wenn dies der Fall ist, lehnen Sie ab. sonst

  2. iptables Überprüfen Sie, ob die Anforderung an Port 80 gerichtet ist. Wenn ja, drucken Sie die IP und den Zeitstempel in / proc / net / ipt_recent / ATACK und leiten Sie das Paket weiter.

Es funktioniert gut für meine Bedürfnisse.

Gustavo Feijo
quelle
3

Haben Sie sich ein Tool wie fail2ban angesehen? Wenn es für Sie etwas schwierig sein könnte, können Sie jedoch die Anzahl der Anforderungen begrenzen, die für eine bestimmte IP zulässig sind. Es funktioniert, indem Sie sich die Protokolle ansehen und Regeln festlegen, wie viele Verstöße pro Zeit zulässig sind. Für Sie sind dies möglicherweise Anforderungen pro Tag. Sobald sie darüber nachdenken, kann es Dinge wie das Blockieren mit IP-Ketten tun.

Ich habe es verwendet, um DDoS-Angriffe gegen einen Mailserver sehr erfolgreich zu blockieren. Es kann jedoch eine erhebliche Menge an Prozessorleistung verbrauchen.

Peter Bagnall
quelle
Ich bin kurz davor, dies selbst umzusetzen. Hoffe es funktioniert
Dark Star1
1

versuchen Sie es mod_dosevasiveodermod_security

mod_dosevasive kann so konfiguriert werden, dass eine IP nach einer bestimmten Anzahl oder Seitenanforderungen an eine Site in einem bestimmten Zeitraum gesperrt wird.

prophet.six
quelle