Stateful Firewall: SPI & Conntrack (Artikel 308)
Implementierung von zustandsbehafteten Firewalls mittels Stateful Packet Inspection (SPI). Erfahren Sie alles über das conntrack-Modul und den sicheren Umgang mit Verbindungszuständen.
# Stateful Firewall: Den Kontext der Pakete verstehen
TL;DR / Management Summary Eine einfache Firewall prüft jedes Paket einzeln (Stateless). Eine moderne Stateful Firewall hingegen versteht den Zusammenhang: Sie erkennt, ob ein Paket Teil einer bereits erlaubten Verbindung ist oder ob es eine neue Anfrage startet. Mittels des Conntrack (Connection Tracking) Moduls im Linux-Kernel reduzieren wir die Anzahl der Regeln drastisch und erhöhen die Sicherheit, indem wir unangeforderte oder ungültige Pakete sofort verwerfen.
# 1. Einführung & Architektur
Wie der Kernel sich erinnert.
Das Modul nf_conntrack speichert Informationen über aktive Verbindungen in einer internen Tabelle.
# Die Verbindungs-Zustände (Mermaid)
graph TD
A[Incoming Packet] --> B{Conntrack Lookup}
B -->|First Packet of Session| C[State: NEW]
B -->|Part of existing Session| D[State: ESTABLISHED]
B -->|Helper Triggered: e.g. FTP Data| E[State: RELATED]
B -->|Garbage / Hack| F[State: INVALID]
C/D/E/F --> G[Firewall Rules matching State]
- NEW: Das erste Paket einer TCP-Verbindung (SYN).
- ESTABLISHED: Pakete, die zu einer bereits gesehenen Verbindung gehören.
- RELATED: Ein neues Paket, das logisch mit einer bestehenden Verbindung verknüpft ist (z.B. ICMP-Error oder FTP-Datenkanäle).
- INVALID: Pakete, die keinem bekannten Zustand zugeordnet werden können.
# 2. Implementierung in Iptables
Die ‘Goldene Regel’.
In einem professionellen Setup steht diese Regel ganz am Anfang. Sie deckt 95% des Traffics ab und spart CPU-Zeit.
# Erlaube alles, was bereits bestätigt wurde oder logisch dazu gehört
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Blockiere ungültige Pakete sofort
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 3. Der ‘NEW’ Check: Wer darf anfangen?
Den Zugang kontrollieren.
Nachdem die bestehenden Verbindungen erlaubt wurden, definieren wir, wer neue Verbindungen (NEW) aufbauen darf.
# Nur SSH darf neue Verbindungen starten
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# Alles andere (NEW) wird durch die Default-Policy (DROP) abgefangen
# 4. Day-2 Operations: Die Conntrack-Tabelle
Den Speicher überwachen.
In Hochlast-Umgebungen (z.B. Load Balancer) kann die Conntrack-Tabelle vollaufen.
# Status prüfen
# Wie viele Verbindungen werden aktuell getrackt?
sysctl net.netfilter.nf_conntrack_count
# Was ist das Limit?
sysctl net.netfilter.nf_conntrack_max
# Die Tabelle live beobachten
# Erfordert das Paket 'conntrack'
sudo conntrack -L
# 5. Troubleshooting & “War Stories”
Wenn die Firewall vergisst.
# Story 1: “Der hängende FTP-Download”
Symptom: Der User kann sich einloggen (Port 21), sieht aber keine Dateien.
Ursache: FTP ist ein “Evil Protocol”. Es öffnet für Daten einen neuen Port. Ohne den Zustand RELATED und den passenden Helper (nf_conntrack_ftp) blockiert die Firewall den Datenkanal.
Lösung: Laden Sie das Kernel-Modul modprobe nf_conntrack_ftp und stellen Sie sicher, dass RELATED in den Regeln steht.
# Story 2: “Der DDoS-Zusammenbruch”
Symptom: Der Server ist nicht mehr erreichbar, obwohl die CPU-Last niedrig ist. In den Logs steht nf_conntrack: table full, dropping packet.
Ursache: Ein Angreifer flutet den Server mit tausenden SYN-Paketen. Jedes erzeugt einen NEW Eintrag in der Tabelle, bis das RAM-Limit erreicht ist.
Lösung: Erhöhen Sie das Limit: sysctl -w net.netfilter.nf_conntrack_max=262144. Nutzen Sie alternativ die NOTRACK-Option in der raw Table für Ports mit extrem hoher Last.
# 6. Fazit & Empfehlung
- Pflicht: Nutzen Sie immer
ESTABLISHED,RELATED. Es ist das Sicherheits-Rückgrat moderner Netze. - Performance: Überwachen Sie die Tabellengröße bei Webservern mit > 10.000 parallelen Usern.
- Sicherheit: Droppen Sie
INVALIDPakete immer als eine der ersten Regeln.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Status-Übersicht | conntrack -S |
| Tabelle leeren | conntrack -F |
| Suche nach einer IP | `conntrack -L |
| Limit temporär ändern | echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max |
| Timeouts sehen | `sysctl -a |
| Paket suchen (Arch) | sudo pacman -S conntrack-tools |
| Paket suchen (Alpine) | apk add conntrack-tools |
| Iptables-Modul | -m conntrack --ctstate ... |