===== 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}} ----