linux-security security firewall iptables conntrack networking advanced

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 INVALID Pakete 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 ...