# Netfilter Architecture: Packet Processing Deep Dive
TL;DR / Management Summary Netfilter ist das Herzstück der Netzwerkverarbeitung im Linux-Kernel. Es bietet die Hooks, an denen Tools wie
iptables,nftablesundconntrackansetzen. Wer High-Performance-Networking oder komplexe Firewalls betreibt, muss den Weg eines Pakets durch die Chains (PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING) verstehen. Die moderne Ablösungnftablesoptimiert diesen Prozess durch eine virtuelle Maschine im Kernel-Space, was den Overhead massiv reduziert.
# 1. Einführung & Architektur
Wie Pakete im Kernel ‘atmen’.
Netfilter ist kein einzelnes Tool, sondern ein Framework aus Kernel-Hooks. Jedes Mal, wenn ein Netzwerkpaket die Netzwerkkarte (NIC) erreicht oder verlässt, durchläuft es eine vordefinierte Reise.
# Warum Deep Dive?
Admins, die nur iptables -A INPUT -j ACCEPT kopieren, scheitern, wenn:
- Performance-Probleme auftreten (z.B. zu viele Regeln in einer linearen Kette).
- Komplexes Routing (VRFs, Policy Based Routing) nötig ist.
- Troubleshooting von “Dropped Packets” ohne Logs erfolgen muss.
# Das Hook-System
Es gibt 5 fundamentale Hooks im Kernel:
- NF_IP_PRE_ROUTING: Bevor die Routing-Entscheidung getroffen wird.
- NF_IP_LOCAL_IN: Wenn das Paket für den lokalen Host bestimmt ist.
- NF_IP_FORWARD: Wenn das Paket an ein anderes Interface weitergeleitet wird.
- NF_IP_LOCAL_OUT: Für lokal generierte Pakete.
- NF_IP_POST_ROUTING: Nach der Routing-Entscheidung, kurz vor dem Verlassen des Systems.
# Architektur-Diagramm (Mermaid)
graph TD
NIC_IN[Network Interface IN] --> PRE[PREROUTING Hook]
PRE --> ROUTE{Routing Decision}
ROUTE -->|Local Destination| IN[INPUT Hook]
ROUTE -->|Foreign Destination| FWD[FORWARD Hook]
IN --> APP[Local Process / App]
APP --> OUT[OUTPUT Hook]
FWD --> POST[POSTROUTING Hook]
OUT --> ROUTE_OUT{Routing Decision}
ROUTE_OUT --> POST
POST --> NIC_OUT[Network Interface OUT]
subgraph "Netfilter Kernel Hooks"
PRE
IN
FWD
OUT
POST
end
# 2. Der Weg des Pakets: Schritt für Schritt
Vom Bit zum Byte zur Applikation.
# Ingres & Prerouting
Sobald ein Paket den Treiber verlässt, erreicht es den PREROUTING Hook. Hier findet primär DNAT (Destination NAT) statt. Wenn Sie einen Load Balancer bauen, ist dies der Ort, an dem die Ziel-IP geändert wird, noch bevor der Kernel weiß, wohin das Paket eigentlich soll.
# Die Routing-Entscheidung
Hier prüft der Stack die Routing-Tabelle.
- Gehört die IP mir? -> Weiter zum
INPUTHook. - Gehört sie jemand anderem? -> Weiter zum
FORWARDHook (erfordertnet.ipv4.ip_forward=1).
# Forwarding vs. Local Input
In der FORWARD Chain setzen wir Firewall-Regeln für Transit-Traffic (z.B. Proxmox Host fungiert als Router für VMs). In der INPUT Chain schützen wir den Host selbst (SSH, API-Ports).
# 3. Deep Dive: nftables vs. iptables
Die Evolution der Paketverarbeitung.
# Das Problem mit iptables
Iptables ist linear. Wenn Sie 1000 Regeln haben, muss ein Paket im schlimmsten Fall 1000 Vergleiche durchlaufen. Zudem gibt es Code-Duplizierung zwischen IPv4 (iptables) und IPv6 (ip6tables).
# Die Lösung: nftables
Nftables nutzt eine Netlink-Schnittstelle und eine kleine Virtual Machine (VM) im Kernel.
- Kombinierte Regeln: Eine Regel kann IPv4 und IPv6 gleichzeitig händeln.
- Sets & Maps: Anstatt 100 IPs einzeln zu prüfen, nutzt nftables effiziente Hash-Tabellen (O(1) Komplexität).
- Atomic Updates: Änderungen werden atomar angewendet, keine kurzen “Open Windows” während des Reloads.
# Beispiel: Effizientes Blocken
# nftables Syntax: Nutzt ein Set für High Performance
nft add set inet filter blackhole { type ipv4_addr \; flags interval \; }
nft add element inet filter blackhole { 192.168.1.0/24, 10.0.0.5 }
nft add rule inet filter input ip saddr @blackhole drop
# 4. Day-2 Operations: State Management
Conntrack – Das Gedächtnis des Kernels.
Ohne conntrack wäre Linux eine “Stateless Firewall”. Wir müssten jedes Antwort-Paket explizit erlauben.
# Conntrack Tabelle einsehen
# Zeigt alle aktuell verfolgten Verbindungen
conntrack -L
# Überwachung von State-Änderungen in Echtzeit
conntrack -E
# Problem: Table Full
Auf High-Traffic Systemen (DDoS oder viele Microservices) läuft die conntrack-Tabelle oft voll.
Symptom: nf_conntrack: table full, dropping packet.
Lösung:
# Limit erhöhen (Laufzeit)
sysctl -w net.netfilter.nf_conntrack_max=262144
# Hashsize anpassen (erfordert oft Modul-Reload oder speziellen Parameter)
echo 65536 > /sys/module/nf_conntrack/parameters/hashsize
# 5. Troubleshooting & “War Stories”
Wenn die Firewall zum Kerker wird.
# Top 3 Fehlerbilder
-
Symptom: Ping geht, aber TCP-Verbindungen hängen nach dem Handshake.
- Ursache: MTU-Probleme oder falsche MSS-Clamping Regeln im
POSTROUTING. - Lösung:
nft add rule inet filter forward tcp flags syn tcp option maxseg size set rt mtu.
- Ursache: MTU-Probleme oder falsche MSS-Clamping Regeln im
-
Symptom: Lokale Dienste sind von außen nicht erreichbar, obwohl
INPUToffen ist.- Analyse: Prüfen, ob das Paket im
PREROUTINGdurch ein fehlerhaftes NAT umgeleitet wird. - Tool:
nft monitoroder das alteiptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE.
- Analyse: Prüfen, ob das Paket im
-
Symptom: Massive CPU-Last durch
ksoftirqd.- Ursache: Zu viele Firewall-Regeln ohne Sets/Maps.
- Lösung: Migration auf
nftablesVerzeichnisse (dictionaries).
# “War Story”: Der Geister-Drop
Wir hatten ein System, bei dem Pakete sporadisch verloren gingen. tcpdump am Interface zeigte die Pakete an, aber die Applikation sah sie nie. Die Firewall-Logs waren leer.
Die Entdeckung: Ein RP-Filter (Reverse Path Filtering) im Kernel verwarf die Pakete, weil die Antwort über ein anderes Interface hätte gehen müssen (Asymmetrisches Routing). Netfilter Hooks sind oft unschuldig, aber die Basis für die Diagnose.
# 6. Monitoring & Alerting
Die Firewall im Blick behalten.
# Wichtige Metriken (KPIs)
- Dropped Packets per Second: Ein plötzlicher Anstieg deutet auf einen Angriff oder eine Fehlkonfiguration hin.
- Conntrack Utilization:
node_nf_conntrack_entries / node_nf_conntrack_entries_limit. - Rule Evaluation Time: (Nur via spezieller eBPF Tools messbar).
# Alerting Regel (Prometheus)
- alert: FirewallTableFillingUp
expr: (node_nf_conntrack_entries / node_nf_conntrack_entries_limit) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "Conntrack Tabelle zu 85% voll auf {{ $labels.instance }}"
# 7. Fazit & Empfehlung
Netfilter ist mächtig, aber komplex.
- Empfehlung: Verwenden Sie für alle neuen Setups nftables. Es ist sauberer, schneller und zukunftssicher.
- Vermeiden: Mischen Sie niemals
iptablesundnftablesRegeln auf demselben Host, wenn es sich vermeiden lässt – das führt zu unvorhersehbarem Verhalten, da beide Frameworks die gleichen Hooks nutzen.
# Anhang: Cheatsheet
| Tool | Befehl | Zweck |
|---|---|---|
nft |
nft list ruleset |
Zeigt alle nftables Regeln |
iptables |
iptables -nvL |
Zeigt iptables (mit Counter) |
conntrack |
conntrack -S |
Kurzstatistik der Tabelle |
sysctl |
sysctl net.netfilter.nf_conntrack_count |
Aktuelle Anzahl Einträge |
tcpdump |
tcpdump -i any nflog |
Pakete loggen, die per jump NFLOG markiert wurden |