Ufw Limit gegen Überlastung einstellen: Unterschied zwischen den Versionen
Aus znilwiki
BLinz (Diskussion | Beiträge) Die Seite wurde neu angelegt: „<u>'''Changelog:'''</u><br> * 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.<br> Mit {{code|htop}} konnte ich sehen das es die Prozesse für diese Webseite hier sind (jede meiner Webseiten / Subdomain läuft unter einem eigenen Benutzer).<br> Im {{code|acccess.log}} konnte ich viele Zugriffe von verschiedenen IP-Adressen sehen.<br> Per Einzeiler tail -n…“ |
BLinz (Diskussion | Beiträge) |
||
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 43: | Zeile 43: | ||
Man muss die Regel zunächst erstellen und dann die folgende Datei bearbeiten:<br> | Man muss die Regel zunächst erstellen und dann die folgende Datei bearbeiten:<br> | ||
sudo nano /etc/ufw/user.rules | sudo nano /etc/ufw/user.rules | ||
In der Datei müsste irgendwo ein Abschnitt ähnlich wie diesem hier stehen:<br> | 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):<br> | ||
-A ufw-user-input -p tcp --dport | ### tuple ### limit tcp 80 0.0.0.0/0 any 0.0.0.0/0 in | ||
-A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -- | -A ufw-user-input -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --set | ||
-A ufw-user-input -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -j ufw-user-limit | |||
-A ufw-user-input -p tcp --dport 80 -j ufw-user-limit-accept | |||
### tuple ### limit tcp 443 0.0.0.0/0 any 0.0.0.0/0 in | |||
-A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --set | |||
-A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -j ufw-user-limit | |||
-A ufw-user-input -p tcp --dport 443 -j ufw-user-limit-accept | |||
Wonach Ihr suchen könnt ist {{code|--seconds 30}} und/oder {{code|--hitcount 6}}, bei {{code|--dport}} sollte 80 oder 443 stehen.<br> | Wonach Ihr suchen könnt ist {{code|--seconds 30}} und/oder {{code|--hitcount 6}}, bei {{code|--dport}} sollte 80 oder 443 stehen.<br> | ||
Die beiden Werte passt Ihr einfach an, speichert die Datei und lasst diese per<br> | Die beiden Werte passt Ihr einfach an, speichert die Datei und lasst diese per<br> | ||
sudo ufw reload | sudo ufw reload | ||
neu einlesen.<br> | neu einlesen.<br> | ||
{{Hinweis|Bei {{code|--hitcount}} ist normalerweise ab Werk im Kernel auf maximal 20 begrenzt!}} | |||
<br> | <br> | ||
<br> | <br> | ||
---- | ---- | ||
==Kommentare== | ==Kommentare== | ||
<comments /> | <comments /> | ||
Aktuelle Version vom 7. Juni 2026, 16:55 Uhr
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):
### tuple ### limit tcp 80 0.0.0.0/0 any 0.0.0.0/0 in -A ufw-user-input -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --set -A ufw-user-input -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -j ufw-user-limit -A ufw-user-input -p tcp --dport 80 -j ufw-user-limit-accept ### tuple ### limit tcp 443 0.0.0.0/0 any 0.0.0.0/0 in -A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --set -A ufw-user-input -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -j ufw-user-limit -A ufw-user-input -p tcp --dport 443 -j ufw-user-limit-accept
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.
