Aktionen

Ufw Limit gegen Überlastung einstellen

Aus znilwiki

Changelog:

  • 07.06.2026 erste Version

Vorwort

Neulich hatte ich das Problem das mein Webserver auf dem diese Webseite läuft ständig auf 100% CPU lief.
Mit htop konnte ich sehen das es die Prozesse für diese Webseite hier sind (jede meiner Webseiten / Subdomain läuft unter einem eigenen Benutzer).
Im acccess.log konnte ich viele Zugriffe von verschiedenen IP-Adressen sehen.
Per Einzeiler

tail -n 10000 /weg/zu/dem/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 20

zeigt die Top-Adressen der letzten 10.000 Logzeilen.
Im Gegensatz zu früher war es diesmal aber ziemlich verteilt über die Welt. Die Aufrufe an mein Wiki waren dabei maximal Belastend - es wurde Änderungen für bestimmt Zeiträume abgefragt oder vorherige Versionen usw.
Das übliche Sperren von 1 bis 2 IP-Adressen wirkte hier also nicht.
Ich hatte diverse Dinge ausprobiert, was funktionierte war die Begrenzung der Anzahl der Verbindungen pro IP-Adresse.



Die ufw-Regel

sudo ufw limit proto tcp from any to any port 80
sudo ufw limit proto tcp from any to any port 443

Dadurch wird automatisch jede IP-Adresse blockiert die versucht, mehr als 6 Verbindungen innerhalb von 30 Sekunden aufzubauen.
Erfolgt mehr als 30 Sekunden kein Zugriff von der IP, wird diese wieder freigegeben.
Zuschauen kann man dabei im Log:

tail -n 100 -F /var/log/ufw.log




Adressen oder IP-Blöcke whitelisten

sudo ufw allow from 192.168.0.10

nimmt die 192.168.0.10 aus allen Regeln heraus, per

udo ufw allow from 192.168.0.0/24

auch ein ganzes Netzwerksegment.



ufw-Regel wieder löschen

sudo ufw delete limit proto tcp from any to any port 80
sudo ufw delete limit proto tcp from any to any port 443




Eigene Limits statt 6 Versuche in 30 Sekunden setzen

Einen direkten Befehl eigene Limits zu setzen als die 6 Versuche in 30 Sekunden gibt es nicht.
Man muss die Regel zunächst erstellen und dann die folgende Datei bearbeiten:

sudo nano /etc/ufw/user.rules

In der Datei müsste irgendwo ein Abschnitt ähnlich wie diesem hier stehen (2x einmal für Port 80 und einmal für Port 443):

-A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --set --name ufwlimit_443 --rsource
-A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name ufwlimit_443 --rsource -j ufw-user-limit

Wonach Ihr suchen könnt ist --seconds 30 und/oder --hitcount 6, bei --dport sollte 80 oder 443 stehen.
Die beiden Werte passt Ihr einfach an, speichert die Datei und lasst diese per

sudo ufw reload

neu einlesen.

Hinweis:Bei --hitcount ist normalerweise ab Werk im Kernel auf maximal 20 begrenzt!




Kommentare

Loading comments...