Frage Wie blockiere ich automatisch und vorübergehend eine IP-Adresse, die in kurzer Zeit zu viele Treffer auf dem Server verursacht?


Einer meiner LAMP-Server wurde vor kurzem von einer Art Skript-Bot heruntergebracht, der nach Exploits suchte. So wie es aussah, machte es eine Sekunde lang so viele Anfragen, dass es den RAM auf dem Server überlastete und meine gesamte Seite für eine Stunde abstellte. Dieser "Attack" kam von einer einzigen IP-Adresse.

Wie kann ich eine IP-Adresse automatisch und vorübergehend blockieren, wodurch in kurzer Zeit zu viele Zugriffe auf meinen LAMP-Server erfolgen? Was ist das beste Werkzeug für den Job, und sollte ich das auf Betriebssystemebene oder über PHP lösen?


18
2017-08-21 19:57


Ursprung




Antworten:


Fail2Ban. Der Goldstandard / Standardlösung für dieses Problem auf der Linux-Plattform.


24
2017-08-21 20:01



Interessant, danke. Wie geht das mit Webcrawlern wie Google um? - ProgrammerGirl
@Programmer Hängt davon ab, wie Sie das Ding konfigurieren, aber Sie würden nicht erwarten, dass ein Web-Crawler schlechte Passwörter eingibt, nach Exploits sucht oder genug Treffer generiert, um einen wohldefinierten Schwellenwert auszulösen - also prüfen Sie einfach Ihre Protokolle, um herauszufinden Wofür definieren Sie Ihre Schwellenwerte? - HopelessN00b


Sie sollten es vermeiden, dies mit PHP zu versuchen. Wenn PHP involviert ist, ist es schon zu spät - der Speicher ist bereits vergeben.

Sie können IP-Adressen auf jeder Ebene verbieten, aber die niedrigste Ebene, die die geringste Menge an Ressourcen verwendet, ist die Route, die Sie verwenden möchten. Dies ist normalerweise die Firewall. Zumindest ist Iptables (Linux-Firewall), was Sie verwenden möchten. Es gibt Tools, die andere erwähnt haben, wie Fail2Ban, die das für Sie automatisieren können. Externe Firewall wäre besser.

Neben dem Versuch, anstößige IP-Adressen zu verbieten, sollten Sie versuchen, Ihre Ressourcen besser zu nutzen. Wenn eine Anfrage weniger Ressourcen benötigt, dauert es länger, bis ein Angriff erfolgreich ist.

Apache verwendet auch viel Speicher. Wenn Sie mod_php verwenden, ist es noch schlimmer, weil PHP in jedem Apache-Kindprozess geladen wird. Dies bedeutet, dass selbst Anfragen an statische Inhalte (css / js / images) PHP laden, auch wenn PHP nicht verwendet wird. Sie können dieses Problem lösen, indem Sie stattdessen FastCGI verwenden. mod_fcgid ist eine gute Option.

Es gibt auch andere Webserver, die ressourceneffizienter sind. Nginx ist mein Favorit. Es gibt auch Lighttpd. Viele Leute mögen Litespeed (fallen als Ersatz für Apache).

Wenn Sie bei Apache bleiben möchten, sollten Sie es so gut wie möglich einstellen. Ziehen Sie in Betracht, .htaccess zu deaktivieren. Hier ist eine gute Erklärung warum.


4
2017-09-15 19:03





Um den HTTP-Datenverkehr zu steuern oder zu blockieren, können Sie Folgendes verwenden:

Beachten Sie jedoch, dass dieses Tool Webspider auch blockieren / verlangsamen kann und somit Auswirkungen auf SEO hat.


1
2017-08-21 20:27





iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

Ossek kann diese Art von Sache automatisch und transparent basierend auf den Syslogs tun.


1
2017-08-21 20:10



Können Sie bitte erklären, was die erste Codezeile genau macht? Wie vergleicht Ossec mit fail2ban? Vielen Dank. - ProgrammerGirl
Es ist eine Iptables-Regel. Ich glaube, es zählt, wie viele neue Verbindungsversuche unternommen werden, und lässt sie fallen, nachdem sie 4 Versuche innerhalb von 60 Sekunden überschritten haben. Ich ermutige dich anzuschauen man iptables und sehen, was jede Flagge bedeutet und wie sie zusammenarbeiten. - Luke


Nein, BS,

--- Flut ---

iptables -N logdrop iptables -A logdrop -m recent --set --name blacklist

iptables -A logdrop -m limit - Grenzwert 1 / s - Grenzwert-Burst 1 -j LOG --log-Präfix "Flood:"

iptables -A Logdrop -j DROP

iptables -N ddos iptables -A ddos ​​-m recent --rcheck --name blacklist --seconds 300 --hitcount 1 -j logdrop iptables -A ddos ​​-m recent --set --name erneut iptables -A ddos ​​-m recent --update --name erneut --seconds 60 --hitcount 2 -j logdrop iptables -A ddos ​​-j RÜCKKEHR


-3
2018-04-11 12:45