===== netfilter =====
**Kurzfassung:** netfilter ist das Firewall-Framework im Linux-Kernel, das Paketfilterung, NAT und Port-Weiterleitung ermöglicht. Es bildet die Grundlage für Tools wie iptables, nftables und UFW. Zielgruppe: Systemadministratoren zur Netzwerksicherheit und -verwaltung.
==== Übersicht ====
netfilter ist ein Framework im Linux-Kernel (seit Kernel 2.4), das Hooks zur Paketmanipulation bereitstellt. Es ermöglicht das Filtern, Modifizieren und Weiterleiten von Netzwerkpaketen auf verschiedenen Ebenen des Netzwerk-Stacks. netfilter arbeitet im Kernel-Space, während die Verwaltungstools (iptables, nftables, UFW) im User-Space laufen und Regeln an netfilter übergeben.
==== Voraussetzungen ====
* Linux-Kernel mit netfilter-Unterstützung (Standard seit 2.4)
* Root-Privilegien für Konfiguration
* Verständnis von TCP/IP-Netzwerken
* Kenntnis von Paket-Flow und Routing
==== Anleitung ====
=== Architektur und Komponenten ===
netfilter besteht aus mehreren Subsystemen:
**Hauptkomponenten:**
* **ip_tables**: IPv4-Paketfilterung
* **ip6_tables**: IPv6-Paketfilterung
* **arp_tables**: ARP-Paketfilterung
* **ebtables**: Ethernet-Bridge-Filterung
* **nf_tables**: Modernes, vereinheitlichtes Framework
**Kernel-Module:**
# Geladene netfilter-Module anzeigen
lsmod | grep -E "nf_|ip_tables|iptable_|nf_conntrack"
# Häufige Module:
# nf_conntrack - Connection Tracking
# nf_nat - Network Address Translation
# iptable_filter - Paketfilterung
# iptable_nat - NAT-Tabelle
# iptable_mangle - Paketmanipulation
# nf_tables - Modernes nftables Backend
=== netfilter Hooks (Einhängepunkte) ===
netfilter bietet 5 Hook-Punkte im Paket-Flow:
┌──────────┐
│ PREROUTING│ ← Eingehende Pakete (vor Routing)
└──────────┘
↓
Routing-
Entscheidung
↙ ↘
┌───────┐ ┌────────┐
│ INPUT │ │FORWARD │ ← Weiterleitungspakete
└───────┘ └────────┘
↓ ↓
Lokaler Prozess ┌──────────┐
↓ │POSTROUTING│ ← Ausgehende Pakete (nach Routing)
┌────────┐ └──────────┘
│ OUTPUT │
└────────┘
**Hook-Beschreibungen:**
* **PREROUTING**: Pakete bevor Routing-Entscheidung (NAT, Portweiterleitung)
* **INPUT**: Pakete für lokale Prozesse
* **FORWARD**: Pakete, die weitergeleitet werden (Router)
* **OUTPUT**: Lokal erzeugte Pakete
* **POSTROUTING**: Pakete nach Routing-Entscheidung (Source NAT)
=== Tabellen und Chains ===
netfilter organisiert Regeln in Tabellen:
**filter** (Standard-Tabelle):
# Filterung von Paketen
# Chains: INPUT, FORWARD, OUTPUT
sudo iptables -t filter -L -v
**nat** (Network Address Translation):
# NAT und Port-Weiterleitung
# Chains: PREROUTING, OUTPUT, POSTROUTING
sudo iptables -t nat -L -v
**mangle** (Paketmanipulation):
# Ändern von TOS, TTL, MARK
# Chains: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
sudo iptables -t mangle -L -v
**raw** (Vor Connection Tracking):
# Bypass Connection Tracking
# Chains: PREROUTING, OUTPUT
sudo iptables -t raw -L -v
**security** (SELinux):
# Mandatory Access Control
# Chains: INPUT, FORWARD, OUTPUT
sudo iptables -t security -L -v
=== Connection Tracking (conntrack) ===
Connection Tracking verfolgt Verbindungszustände:
# Aktive Verbindungen anzeigen
sudo conntrack -L
# Verbindungsstatus:
# NEW - Neue Verbindung
# ESTABLISHED - Bestehende Verbindung
# RELATED - Verwandte Verbindung (z.B. FTP-Data)
# INVALID - Ungültiges Paket
# Conntrack-Tabelle leeren
sudo conntrack -F
# Maximale Conntrack-Einträge
cat /proc/sys/net/netfilter/nf_conntrack_max
# Aktuelle Anzahl
cat /proc/sys/net/netfilter/nf_conntrack_count
# Timeout-Werte anzeigen
cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
=== netfilter Module verwalten ===
# Alle netfilter-Module anzeigen
find /lib/modules/$(uname -r) -type f -name '*netfilter*' -o -name 'nf_*' -o -name 'xt_*' | sort
# Modul manuell laden
sudo modprobe nf_conntrack
sudo modprobe nf_nat
# Modul entfernen
sudo modprobe -r nf_conntrack
# Permanente Module in /etc/modules
echo "nf_conntrack" | sudo tee -a /etc/modules
# Modul-Parameter setzen
sudo modprobe nf_conntrack hashsize=32768
=== netfilter Log-System ===
# Log-Regel mit iptables
sudo iptables -A INPUT -j LOG --log-prefix "NETFILTER: " --log-level 4
# Logs anzeigen (Kernel-Log)
sudo dmesg | grep NETFILTER
sudo journalctl -k | grep NETFILTER
# Systemlogs
sudo tail -f /var/log/kern.log | grep NETFILTER
# nftables Logging
sudo nft add rule ip filter input log prefix \"NFT-LOG: \"
=== Statistiken und Monitoring ===
# netfilter Statistiken
cat /proc/net/netfilter/nf_conntrack
# Kernel-Statistiken
cat /proc/net/stat/nf_conntrack
# Performance-Metriken
sudo iptables -t filter -L -v -n -x
# -v: verbose (Paket/Byte-Zähler)
# -n: numerisch (keine DNS-Auflösung)
# -x: exakte Zahlen
# Zähler zurücksetzen
sudo iptables -Z
# nftables Statistiken
sudo nft list ruleset -a
=== Debugging und Troubleshooting ===
# netfilter Debug-Modus (raw-Tabelle)
sudo iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
sudo iptables -t raw -A OUTPUT -p tcp --dport 80 -j TRACE
# Trace-Logs anzeigen (erfordert iptables-extensions)
sudo xtables-monitor --trace
# Connection Tracking Events monitoren
sudo conntrack -E
# Kernel-Parameter für Debugging
echo 1 | sudo tee /proc/sys/net/netfilter/nf_log_all_netns
# Performance-Probleme analysieren
sudo perf record -a -g -e 'nf:*'
sudo perf report
=== Kernel-Parameter optimieren ===
# Conntrack-Tabellengröße erhöhen
sudo sysctl -w net.netfilter.nf_conntrack_max=131072
# Hashsize anpassen (nf_conntrack_buckets)
echo 32768 | sudo tee /sys/module/nf_conntrack/parameters/hashsize
# TCP Timeouts anpassen
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=7200
# Permanente Änderungen in /etc/sysctl.conf
sudo tee -a /etc/sysctl.conf <
=== Tools zur Verwaltung ===
**User-Space-Tools:**
# iptables - Klassisches Tool
sudo iptables -L -v
# nftables - Modernes Tool
sudo nft list ruleset
# UFW - Benutzerfreundlich
sudo ufw status
# firewalld - Dynamische Firewall
sudo firewall-cmd --list-all
# conntrack - Connection-Tracking-Tool
sudo conntrack -L
==== Hinweise ====
**Best Practices:**
- netfilter ist Kernel-Framework, nicht direkt konfigurierbar - immer Tools nutzen
- Connection Tracking erhöht Overhead - bei Bedbedarf deaktivierbar
- nf_conntrack_max an verfügbaren RAM anpassen (128MB pro 64k Einträge)
- Hashsize = nf_conntrack_max / 4 (Faustregel)
- Module lazy-loading - nur benötigte Module laden
- Log-Regeln sparsam einsetzen (Performance!)
**Häufige Probleme vermeiden:**
- ''nf_conntrack: table full'' → ''nf_conntrack_max'' erhöhen
- Zu kleine Hashsize → Performance-Einbußen bei vielen Connections
- TRACE-Regeln in Produktion → massive Log-Flut!
- Connection Tracking für High-Traffic-Server → kann Bottleneck sein
- Module-Reihenfolge wichtig: nf_conntrack vor nf_nat laden
- IPv4/IPv6 getrennt behandeln (ip_tables vs ip6_tables)
==== Siehe auch ====
* [[sammlung:iptables|iptables]]
* [[sammlung:nftables|nftables]]
* [[sammlung:ufw|UFW]]
* [[sammlung:firewall|Firewall]]
* [[sammlung:conntrack|conntrack]]
==== Quellen ====
* [[https://www.netfilter.org/|netfilter.org - Official Website]]
* [[https://www.kernel.org/doc/Documentation/networking/netfilter-hacking.txt|Kernel Netfilter Documentation]]
* [[https://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.html|Netfilter Hacking HOWTO]]
----
{{tag>netfilter kernel firewall iptables nftables network}}
----