nftables — Die moderne Linux-Firewall mit nft
Praxis-Guide zu nftables — dem modernen iptables-Nachfolger. Tables, Chains, Rules, Sets und NAT mit der nft-Syntax, plus abgesicherte Firewall-Setups.
nftables ist die vereinheitlichte Firewall des Linux-Kernels und löst die alten Werkzeuge iptables, ip6tables, arptables und ebtables unter einem einzigen Befehl ab: nft. Statt vier getrennter Toolsets verwaltest du IPv4, IPv6, ARP und Bridge-Traffic mit einer einheitlichen Syntax aus Tables, Chains, Rules, Sets und Maps. Regeländerungen werden atomar eingespielt, und benannte Sets halten große Adresslisten performant und wartbar. Dieser Guide führt dich vom Auflisten bestehender Regeln über Match-Ausdrücke und NAT bis zum kompletten, abgesicherten Firewall-Setup.
Regeln auflisten
nft list ruleset — Listet alle Regeln über alle Tables und Families hinweg auf.
sudo nft list rulesetnft list tables — Listet alle Tables auf.
sudo nft list tablesnft list table FAMILY TABLE — Listet alle Chains und Rules in einer bestimmten Table auf.
sudo nft list table inet filternft list chain FAMILY TABLE CHAIN — Listet die Rules einer bestimmten Chain auf.
sudo nft list chain inet filter inputnft -a list ruleset — Listet alle Regeln mit Handle-Nummern auf (zum Löschen nötig).
sudo nft -a list rulesetnft -s list ruleset — Listet Regeln ohne String-Übersetzung auf (numerische Protokolle/Ports).
sudo nft -s list rulesetnft -j list ruleset — Gibt die Regeln im JSON-Format aus.
sudo nft -j list rulesetAdressfamilien
ip — Nur IPv4 (entspricht iptables).
ip6 — Nur IPv6 (entspricht ip6tables).
inet — IPv4 und IPv6 in einer Table. Für die meisten Fälle empfohlen.
arp — ARP-Protokoll (entspricht arptables).
bridge — Bridge-/Layer-2-Filterung (entspricht ebtables).
netdev — Ingress-Filterung auf Geräteebene (vor dem Routing).
Tables verwalten
nft add table FAMILY NAME — Legt eine neue Table an.
sudo nft add table inet filternft delete table FAMILY NAME — Löscht eine Table samt allen Chains/Rules.
sudo nft delete table inet filternft flush table FAMILY NAME — Entfernt alle Rules aus einer Table (Chains bleiben erhalten).
sudo nft flush table inet filternft flush ruleset — Entfernt alle Tables, Chains und Rules. Vorsicht: Bei Remote-Zugriff und einer Default-policy drop sperrst du dich damit aus (Lockout) — vorher SSH/established erlauben und nur lokal testen.
sudo nft flush rulesetChains verwalten
nft add chain FAMILY TABLE CHAIN '{ type TYPE hook HOOK priority PRIO; policy POLICY; }' — Legt eine Base-Chain mit Hook, Priority und Policy an. Vorsicht mit policy drop ohne vorherige Accept-Regeln (z. B. für SSH/established) – siehe das abgesicherte Setup unten.
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'nft add chain FAMILY TABLE CHAIN — Legt eine reguläre (Nicht-Base-)Chain zum Organisieren von Rules an.
sudo nft add chain inet filter tcp_chainnft delete chain FAMILY TABLE CHAIN — Löscht eine Chain (muss leer sein).
sudo nft delete chain inet filter tcp_chainnft flush chain FAMILY TABLE CHAIN — Entfernt alle Rules aus einer Chain.
sudo nft flush chain inet filter inputRegeln hinzufügen
nft add rule FAMILY TABLE CHAIN STATEMENT — Hängt eine Rule ans Ende einer Chain an.
sudo nft add rule inet filter input tcp dport 80 acceptnft insert rule FAMILY TABLE CHAIN STATEMENT — Fügt eine Rule am Anfang einer Chain ein.
sudo nft insert rule inet filter input tcp dport 443 acceptnft add rule FAMILY TABLE CHAIN position HANDLE STATEMENT — Fügt eine Rule nach einem bestimmten Handle ein.
sudo nft add rule inet filter input position 8 tcp dport 8080 acceptnft insert rule FAMILY TABLE CHAIN position HANDLE STATEMENT — Fügt eine Rule vor einem bestimmten Handle ein.
sudo nft insert rule inet filter input position 8 tcp dport 22 acceptRegeln löschen
nft delete rule FAMILY TABLE CHAIN handle HANDLE — Löscht eine Rule anhand ihrer Handle-Nummer (Handles mit -a anzeigen).
sudo nft delete rule inet filter input handle 12nft flush chain FAMILY TABLE CHAIN — Löscht alle Rules in einer Chain.
sudo nft flush chain inet filter inputMatch-Ausdrücke
tcp dport PORT — Matcht den TCP-Zielport.
sudo nft add rule inet filter input tcp dport 22 acceptudp dport PORT — Matcht den UDP-Zielport.
sudo nft add rule inet filter input udp dport 53 accepttcp dport { P1, P2, P3 } — Matcht mehrere Ports über anonyme Sets.
sudo nft add rule inet filter input tcp dport { 80, 443, 8080 } accepttcp dport P1-P2 — Matcht einen Port-Bereich.
sudo nft add rule inet filter input tcp dport 8000-9000 acceptip saddr ADDRESS — Matcht die Quell-IPv4-Adresse.
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 acceptip daddr ADDRESS — Matcht die Ziel-IPv4-Adresse.
sudo nft add rule inet filter output ip daddr 10.0.0.0/8 dropip6 saddr ADDRESS — Matcht die Quell-IPv6-Adresse.
sudo nft add rule inet filter input ip6 saddr fd00::/8 acceptip saddr { A1, A2, A3 } — Matcht mehrere Quelladressen.
sudo nft add rule inet filter input ip saddr { 10.0.0.1, 10.0.0.2 } acceptiifname INTERFACE — Matcht den Namen der eingehenden Schnittstelle.
sudo nft add rule inet filter input iifname "eth0" acceptoifname INTERFACE — Matcht den Namen der ausgehenden Schnittstelle.
sudo nft add rule inet filter output oifname "lo" acceptmeta l4proto icmp — Matcht das ICMP-Protokoll.
sudo nft add rule inet filter input meta l4proto icmp acceptct state { established, related } — Matcht den Connection-Tracking-Zustand.
sudo nft add rule inet filter input ct state { established, related } acceptct state invalid — Matcht ungültige Verbindungszustände.
sudo nft add rule inet filter input ct state invalid dropct state new — Matcht neue Verbindungen.
sudo nft add rule inet filter input ct state new tcp dport 22 acceptAktionen (Verdicts)
accept — Lässt das Paket durch.
drop — Verwirft das Paket stillschweigend.
reject — Weist das Paket mit einem ICMP-Fehler zurück.
reject with TYPE — Weist das Paket mit einem bestimmten Nachrichtentyp zurück.
sudo nft add rule inet filter input tcp dport 23 reject with tcp resetlog prefix "TEXT" — Protokolliert das Paket mit einem Präfix.
sudo nft add rule inet filter input tcp dport 22 log prefix "SSH: " acceptcounter — Zählt Pakete und Bytes, die auf diese Rule passen.
sudo nft add rule inet filter input tcp dport 80 counter acceptjump CHAIN — Springt zur weiteren Verarbeitung in eine andere Chain.
sudo nft add rule inet filter input tcp dport { 80, 443 } jump web_chainreturn — Kehrt aus der aktuellen Chain zurück.
limit rate N/TIME — Begrenzt die Trefferrate (z. B. 5/minute, 1/second).
sudo nft add rule inet filter input icmp type echo-request limit rate 1/second acceptNAT
nft add chain ip nat postrouting '{ type nat hook postrouting priority 100; }' — Legt eine NAT-Postrouting-Chain an.
sudo nft add chain ip nat postrouting '{ type nat hook postrouting priority 100; }'masquerade — Maskiert ausgehenden Traffic (dynamisches SNAT).
sudo nft add rule ip nat postrouting oifname "eth0" masqueradednat to ADDRESS:PORT — Destination-NAT (Port-Weiterleitung).
sudo nft add rule ip nat prerouting tcp dport 8080 dnat to 192.168.1.100:80snat to ADDRESS — Source-NAT mit einer statischen IP.
sudo nft add rule ip nat postrouting ip saddr 10.0.0.0/8 snat to 203.0.113.1redirect to :PORT — Leitet auf einen lokalen Port um.
sudo nft add rule ip nat prerouting tcp dport 80 redirect to :8080Benannte Sets
nft add set FAMILY TABLE NAME '{ type TYPE; }' — Legt ein benanntes Set an.
sudo nft add set inet filter blocked_ips '{ type ipv4_addr; }'nft add element FAMILY TABLE SET '{ ELEM1, ELEM2 }' — Fügt einem Set Elemente hinzu.
sudo nft add element inet filter blocked_ips '{ 10.0.0.1, 10.0.0.2 }'nft delete element FAMILY TABLE SET '{ ELEM }' — Entfernt ein Element aus einem Set.
sudo nft delete element inet filter blocked_ips '{ 10.0.0.1 }'nft list set FAMILY TABLE SET — Zeigt den Inhalt eines benannten Sets.
sudo nft list set inet filter blocked_ipsip saddr @SET_NAME drop — Verwendet ein benanntes Set in einer Rule.
sudo nft add rule inet filter input ip saddr @blocked_ips dropSpeichern & Wiederherstellen
nft list ruleset > FILE — Speichert den aktuellen Regelsatz in eine Datei. Ohne /etc/nftables.conf plus aktivierten nftables-Service sind Regeln nicht persistent und gehen beim Neustart verloren.
sudo nft list ruleset > /etc/nftables.confnft -f FILE — Lädt Regeln aus einer Datei.
sudo nft -f /etc/nftables.confnft -c -f FILE — Prüft/validiert eine Regelsatz-Datei, ohne sie anzuwenden.
sudo nft -c -f /etc/nftables.confTypisches Firewall-Setup
nft add table inet filter — Schritt 1: Legt eine Filter-Table für IPv4 und IPv6 an.
sudo nft add table inet filternft add chain inet filter input '{ type filter hook input priority 0; policy drop; }' — Schritt 2: Legt die Input-Chain mit Drop-Policy an. Achtung: Ab jetzt wird alles verworfen, wofür keine Rule existiert — füge die SSH-/established-Regeln (Schritt 4 und 6) zuerst hinzu, sonst sperrst du dich bei Remote-Zugriff aus.
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'nft add rule inet filter input iifname "lo" accept — Schritt 3: Erlaubt Loopback-Traffic.
sudo nft add rule inet filter input iifname "lo" acceptnft add rule inet filter input ct state { established, related } accept — Schritt 4: Erlaubt bestehende Verbindungen.
sudo nft add rule inet filter input ct state { established, related } acceptnft add rule inet filter input ct state invalid drop — Schritt 5: Verwirft ungültige Pakete.
sudo nft add rule inet filter input ct state invalid dropnft add rule inet filter input tcp dport { 22, 80, 443 } accept — Schritt 6: Erlaubt SSH, HTTP, HTTPS.
sudo nft add rule inet filter input tcp dport { 22, 80, 443 } acceptnft add rule inet filter input icmp type echo-request accept — Schritt 7: Erlaubt Ping.
sudo nft add rule inet filter input icmp type echo-request accept Fazit
Mit nftables verwaltest du IPv4, IPv6 und Bridge-Filterung in einem einzigen, konsistenten Framework — statt vier getrennter Legacy-Tools. Plane neue Regelsätze in einer /etc/nftables.conf, validiere sie mit nft -c -f und aktiviere den nftables-Service, damit sie einen Neustart überstehen. Und teste jede Default-policy drop zuerst lokal: Auf einem entfernten Server kostet ein vergessenes SSH-Accept schnell den Zugang.
Weiterführende Links
- nftables-Wiki – offizielle Dokumentation und Anleitungen (englisch)
- nft(8) – Manpage – alle Optionen im Überblick (englisch)
- Netfilter – Wikipedia – Hintergrund zu nftables und seinen Vorgängern