DoS-Mitigation mit iptables auf Linux

iptables ist die Standard-Firewall-Management-Utility auf den meisten Linux-Distributionen. Sie ermöglicht es Ihnen, Verbindungen zu limitieren (Rate-Limit) und wiederholte, verdächtige Zugriffe auf spezifische Ports zu erkennen und zu blockieren.

Achtung: Unkorrekt konfigurierte iptables-Regeln können dazu führen, dass Sie den Zugriff auf Ihren eigenen Server verlieren (Lockout). Testen Sie alle Regeln sorgfältig, insbesondere Regeln, die SSH (Port 22) betreffen.

Grundprinzip: Limiting und Blocking

Um Denial-of-Service (DoS)-Angriffe auf Anwendungsebene zu verhindern, nutzen wir die limit- und recent-Module von iptables.


1. Schutz des SSH-Ports (22)

Der SSH-Port ist ein häufiges Ziel für Brute-Force-Angriffe. Wir limitieren die Anzahl der neuen Verbindungen pro Zeiteinheit.

PowerShell (SSH-Limiter)
# Erlaubt maximal 3 neue Verbindungen pro Minute (3/m) # Nach Erreichen des Limits werden weitere Verbindungen für 1 Minute gedroppt iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/m --limit-burst 5 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
  • --limit 3/m: Stellt die durchschnittliche Rate auf 3 Verbindungen pro Minute ein.
  • --limit-burst 5: Erlaubt zu Beginn einen kurzen "Burst" von 5 Verbindungen, bevor die Rate aktiv wird.

2. Schutz des Webserver-Ports (80/443)

Dieser Mechanismus ist ideal, um langsame HTTP-Angriffe (Slowloris) oder schnelle, sich wiederholende Requests zu verhindern. Die Regel wendet ein Limit auf bestehende Verbindungen an, um eine Überlastung zu vermeiden.

PowerShell (Webserver-Limiter)
# HTTP (Port 80) # Erlaubt maximal 20 Verbindungen pro Sekunde (20/s) für eine Quell-IP. iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED -m limit --limit 20/s --limit-burst 100 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP # HTTPS (Port 443) # Erlaubt maximal 20 Verbindungen pro Sekunde (20/s) für eine Quell-IP. iptables -A INPUT -p tcp --dport 443 -m state --state ESTABLISHED -m limit --limit 20/s --limit-burst 100 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j DROP
  • --state ESTABLISHED: Beschränkt das Limiting auf bereits bestehende, aktive Verbindungen.
  • Wichtig: Passen Sie die Werte (20/s, 100) unbedingt an den normalen, erwarteten Traffic Ihrer Anwendung an.

3. Persistent Blocking mit dem recent-Modul

Das recent-Modul ist leistungsfähiger, da es die Quell-IPs, die zu oft versucht haben, eine Verbindung herzustellen, temporär blockiert.

PowerShell (Temporäres Blocken von IPs)
# 1. Hinzufügen zu einer Liste ("BAD_GUYS"), wenn die IP 15 neue Pakete innerhalb von 60 Sekunden sendet. # Hier auf Port 80 angewendet. iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set # 2. Wenn eine IP bereits auf der "BAD_GUYS"-Liste steht und in den letzten 60 Sekunden mehr als 15 neue Pakete gesendet hat, wird sie gedroppt. iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 15 -j DROP # 3. Der verbleibende, legitime Traffic wird akzeptiert. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  • --set: Fügt die Quell-IP der recent-Liste hinzu.
  • --update: Aktualisiert den Zeitstempel für die IP und prüft gegen hitcount und seconds.
  • Ergebnis: Eine IP, die zu aggressiv Pakete sendet (z.B. ein Bot oder ein einfacher DoS-Angriff), wird für die Dauer von 60 Sekunden blockiert, sobald sie 15 Pakete überschreitet.

4. Regeln dauerhaft speichern

Nachdem Sie die Regeln erfolgreich getestet haben, müssen diese gespeichert werden, da sie sonst nach einem Neustart des Servers verloren gehen.

Bei Debian/Ubuntu (iptables-persistent)

apt install und speichern
# Installation des Tools apt install iptables-persistent # Speichern der aktuellen Regeln netfilter-persistent save

Bei CentOS/RHEL (iptables-services)

Service starten und speichern
# Speichern der aktuellen Regeln iptables-save > /etc/sysconfig/iptables # Neustart des Dienstes systemctl restart iptables