Inhaltsverzeichnis
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 <<EOF net.netfilter.nf_conntrack_max = 131072 net.netfilter.nf_conntrack_tcp_timeout_established = 7200 EOF sudo sysctl -p
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
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)
