Inhaltsverzeichnis
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
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
\; 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 :
