===== nftables =====
**Kurzfassung:** nftables ist der moderne Nachfolger von iptables und vereinheitlicht die Firewall-Verwaltung für IPv4, IPv6, ARP und Bridge-Filterung. Es bietet bessere Performance, vereinfachte Syntax und ist seit Kernel 3.13 verfügbar. Zielgruppe: Systemadministratoren für moderne Firewall-Konfiguration.
==== Übersicht ====
nftables ist das moderne Firewall-Framework, das iptables, ip6tables, arptables und ebtables in einem einzigen Tool vereint. Es nutzt das netfilter-Framework im Kernel, bietet aber eine neue Infrastruktur mit besserer Performance und flexiblerer Syntax. nftables verwendet ein neues Kernel-Modul (nf_tables) und das Userspace-Tool ''nft''. Es ist der designierte Nachfolger und wird in modernen Linux-Distributionen zum Standard.
==== Voraussetzungen ====
* Linux-Kernel 3.13 oder höher (empfohlen: 4.14+)
* nftables-Paket installiert
* Root-Privilegien oder Sudo-Zugriff
* Grundkenntnisse in Netzwerk-Protokollen
==== Anleitung ====
=== Installation und Grundkonfiguration ===
# nftables installieren
sudo apt install nftables # Debian/Ubuntu
sudo dnf install nftables # Fedora/RHEL
sudo pacman -S nftables # Arch Linux
# Service aktivieren und starten
sudo systemctl enable nftables
sudo systemctl start nftables
# Status prüfen
sudo systemctl status nftables
# Aktuelle Regeln anzeigen
sudo nft list ruleset
# Alle Regeln löschen (flush)
sudo nft flush ruleset
=== Grundlegende Konzepte ===
nftables organisiert sich in:
* **Tables** (Tabellen): Container für Chains
* **Chains** (Ketten): Container für Rules
* **Rules** (Regeln): Filteranweisungen
**Tabellen-Familien:**
# ip - IPv4
# ip6 - IPv6
# inet - IPv4 + IPv6 (dual-stack)
# arp - ARP
# bridge - Ethernet-Bridge
# netdev - Ingress (frühe Filterung)
=== Tabellen und Chains erstellen ===
# Tabelle erstellen (inet = IPv4 + IPv6)
sudo nft add table inet filter
# Chain für eingehenden Traffic erstellen
# type filter: Filterung
# hook input: Am INPUT-Hook
# priority 0: Priorität (0 = default)
# policy drop: Standard-Aktion
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
# Chain für ausgehenden Traffic
sudo nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
# Chain für weitergeleiteten Traffic
sudo nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
# Alle Tabellen anzeigen
sudo nft list tables
# Spezifische Tabelle anzeigen
sudo nft list table inet filter
=== Regeln hinzufügen ===
# SSH erlauben (Port 22)
sudo nft add rule inet filter input tcp dport 22 accept
# HTTP und HTTPS erlauben
sudo nft add rule inet filter input tcp dport { 80, 443 } accept
# DNS erlauben (TCP und UDP)
sudo nft add rule inet filter input tcp dport 53 accept
sudo nft add rule inet filter input udp dport 53 accept
# Loopback-Interface erlauben
sudo nft add rule inet filter input iif lo accept
# Etablierte Verbindungen erlauben
sudo nft add rule inet filter input ct state established,related accept
# ICMP erlauben (Ping)
sudo nft add rule inet filter input icmp type echo-request accept
sudo nft add rule inet filter input icmpv6 type echo-request accept
# Port-Bereich erlauben
sudo nft add rule inet filter input tcp dport 6000-6007 accept
=== IP-Adressen und Netzwerke filtern ===
# Traffic von bestimmter IP erlauben
sudo nft add rule inet filter input ip saddr 192.168.1.100 accept
# Traffic von ganzen Netzwerk
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 accept
# IPv6-Adresse
sudo nft add rule inet filter input ip6 saddr 2001:db8::/32 accept
# Mehrere IPs als Set
sudo nft add rule inet filter input ip saddr { 192.168.1.10, 192.168.1.20, 192.168.1.30 } accept
# IP-Adresse blockieren
sudo nft add rule inet filter input ip saddr 10.0.0.5 drop
# Traffic von Interface
sudo nft add rule inet filter input iifname "eth0" accept
=== Named Sets (IP-Listen) ===
# Set erstellen
sudo nft add set inet filter blacklist { type ipv4_addr \; }
# IPs zum Set hinzufügen
sudo nft add element inet filter blacklist { 192.168.1.50, 192.168.1.51 }
# Set in Regel verwenden
sudo nft add rule inet filter input ip saddr @blacklist drop
# Set anzeigen
sudo nft list set inet filter blacklist
# Elemente aus Set entfernen
sudo nft delete element inet filter blacklist { 192.168.1.50 }
=== NAT-Konfiguration ===
**Source NAT (SNAT / Masquerading):**
# NAT-Tabelle erstellen
sudo nft add table inet nat
# POSTROUTING Chain
sudo nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; }
# Masquerading für ausgehenden Traffic
sudo nft add rule inet nat postrouting oifname "eth0" masquerade
# SNAT mit fester IP
sudo nft add rule inet nat postrouting oifname "eth0" snat to 203.0.113.1
**Destination NAT (DNAT / Port-Weiterleitung):**
# PREROUTING Chain
sudo nft add chain inet nat prerouting { type nat hook prerouting priority -100 \; }
# Port-Weiterleitung (80 → 192.168.1.10:8080)
sudo nft add rule inet nat prerouting iifname "eth0" tcp dport 80 dnat to 192.168.1.10:8080
# Port-Bereich weiterleiten
sudo nft add rule inet nat prerouting tcp dport 8000-8100 dnat to 192.168.1.20
=== Logging und Counter ===
# Logging aktivieren
sudo nft add rule inet filter input tcp dport 22 log prefix \"SSH-Access: \" accept
# Counter für Regel
sudo nft add rule inet filter input tcp dport 80 counter accept
# Named Counter
sudo nft add counter inet filter http_counter
sudo nft add rule inet filter input tcp dport 80 counter name http_counter accept
# Counter anzeigen
sudo nft list counters
=== Regeln löschen und ändern ===
# Regeln mit Handle-Nummern anzeigen
sudo nft -a list ruleset
# Regel per Handle löschen
sudo nft delete rule inet filter input handle 5
# Chain löschen
sudo nft delete chain inet filter input
# Tabelle löschen
sudo nft delete table inet filter
# Komplettes Ruleset löschen
sudo nft flush ruleset
# Nur eine Tabelle leeren
sudo nft flush table inet filter
=== Konfiguration speichern und laden ===
# Aktuelle Konfiguration speichern
sudo nft list ruleset > /etc/nftables.conf
# Konfiguration laden
sudo nft -f /etc/nftables.conf
# Beim Systemstart laden (über systemd)
sudo systemctl enable nftables
# Konfigurationsdatei-Pfad (Distribution abhängig)
# Debian/Ubuntu: /etc/nftables.conf
# RHEL/Fedora: /etc/sysconfig/nftables.conf
# Syntax prüfen ohne anzuwenden
sudo nft -c -f /etc/nftables.conf
=== Beispiel: Komplette Firewall-Konfiguration ===
#!/usr/sbin/nft -f
# Alles löschen
flush ruleset
# Tabelle erstellen
table inet filter {
# INPUT Chain
chain input {
type filter hook input priority 0; policy drop;
# Loopback erlauben
iif lo accept
# Etablierte Verbindungen
ct state established,related accept
# ICMP
icmp type echo-request limit rate 1/second accept
# SSH
tcp dport 22 accept
# HTTP/HTTPS
tcp dport { 80, 443 } accept
# Logging für blockierte Pakete
limit rate 5/minute log prefix "nftables-drop: "
}
# OUTPUT Chain
chain output {
type filter hook output priority 0; policy accept;
}
# FORWARD Chain
chain forward {
type filter hook forward priority 0; policy drop;
}
}
=== Rate Limiting (DDoS-Schutz) ===
# Rate Limit für SSH
sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 3/minute accept
# Burst erlauben
sudo nft add rule inet filter input tcp dport 80 limit rate over 100/second burst 200 packets drop
# Pro Source-IP limitieren
sudo nft add rule inet filter input tcp dport 22 meter ssh_meter { ip saddr limit rate 3/minute } accept
=== Verbindungsmanagement ===
# Connection Tracking States
# new - Neue Verbindung
# established - Bestehende Verbindung
# related - Verwandte Verbindung (z.B. FTP-Data)
# invalid - Ungültige Pakete
# Nur neue und etablierte Verbindungen
sudo nft add rule inet filter input ct state new,established accept
# Invalide Pakete blockieren
sudo nft add rule inet filter input ct state invalid drop
# Related Verbindungen (z.B. FTP)
sudo nft add rule inet filter input ct state related accept
=== Migration von iptables ===
# iptables-Regeln nach nftables konvertieren
sudo iptables-save > iptables-rules.txt
sudo iptables-restore-translate -f iptables-rules.txt > nftables-rules.nft
# Oder direkt:
sudo iptables-save | iptables-restore-translate > /etc/nftables.conf
# ip6tables auch konvertieren
sudo ip6tables-save | ip6tables-restore-translate >> /etc/nftables.conf
# Konvertierte Regeln prüfen und anwenden
sudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.conf
=== Debugging und Troubleshooting ===
# Alle Regeln mit Details
sudo nft -a list ruleset
# Nur eine Familie
sudo nft list ruleset inet
# Mit Statistiken
sudo nft list table inet filter
# Monitor-Modus (live)
sudo nft monitor
# Trace aktivieren (Packet-Tracing)
sudo nft add rule inet filter input meta nftrace set 1
# Trace-Log anzeigen
sudo nft monitor trace
# Performance-Statistiken
time sudo nft -f /etc/nftables.conf
==== Hinweise ====
**Best Practices:**
- ''inet'' Familie nutzen für dual-stack (IPv4 + IPv6 gleichzeitig)
- Sets verwenden für große IP-Listen (bessere Performance)
- Konfiguration in Datei speichern: ''/etc/nftables.conf''
- Rate Limiting gegen Brute-Force: ''limit rate 3/minute''
- ''ct state established,related'' früh in Chain für Performance
- Named Counters für Monitoring und Statistiken nutzen
- Vor Produktiv-Deployment: ''nft -c -f'' zum Syntax-Check
**Häufige Fehler vermeiden:**
- Semikolon in Chain-Definition maskieren: ''\;'' nicht '';''
- Sets müssen vor Nutzung definiert werden
- ''policy drop'' + ''ct state established'' = keine neue Verbindung möglich!
- Handle-Nummern ändern sich nach Löschen von Regeln
- ''flush ruleset'' löscht ALLES - auch SSH-Zugriff auf Remote-Systemen!
- nftables und iptables nicht parallel nutzen (Konflikte möglich)
- Ranges mit ''-'': ''6000-6007'' nicht '':''
==== Siehe auch ====
* [[sammlung:netfilter|netfilter]]
* [[sammlung:iptables|iptables]]
* [[sammlung:ufw|UFW]]
* [[sammlung:firewall|Firewall]]
* [[sammlung:conntrack|conntrack]]
==== Quellen ====
* [[https://wiki.nftables.org/|nftables Wiki]]
* [[https://netfilter.org/projects/nftables/|nftables auf netfilter.org]]
* [[https://wiki.archlinux.org/title/Nftables|Arch Linux nftables Guide]]
* [[https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/getting-started-with-nftables_configuring-and-managing-networking|RHEL nftables Documentation]]
----
{{tag>nftables firewall netfilter iptables network security}}
----