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.
