TL;DR — Kurzzusammenfassung

nftables ersetzt iptables als moderne Linux-Firewall. Lernen Sie nft-Syntax, Tabellenfamilien, Mengen, NAT, Ratenbegrenzung und Migration von iptables.

nftables ist der offizielle Nachfolger von iptables, ip6tables, arptables und ebtables, die seit Linux-Kernel 4.x in einem einzigen Framework vereint wurden. Wenn Sie noch Firewall-Regeln mit iptables schreiben, zeigt Ihnen dieser Leitfaden, warum nftables besser ist, wie Sie Ihre bestehenden Regeln migrieren und wie Sie mit nft eine vollständige Firewall von Grund auf aufbauen.

Voraussetzungen

  • Linux-Kernel 4.x oder neuer (Ubuntu 20.04+, Debian 10+, RHEL/CentOS 8+, Fedora 32+).
  • Root- oder sudo-Zugriff.
  • Grundlegendes Verständnis von TCP/IP-Netzwerken (Ports, Protokolle, CIDR-Notation).
  • Bestehende iptables-Regeln zum Migrieren (optional, aber hilfreich für den Kontext).

Warum nftables?

Das iptables-Ökosystem bestand aus vier separaten Tools — nftables ersetzt sie alle:

  • Einheitliches IPv4/IPv6 — Die Familie inet behandelt beide in einem einzigen Regelwerk.
  • Atomare Regelersetzung — Das gesamte Regelwerk wird in einer einzigen Kernel-Transaktion angewendet.
  • Bessere Syntax — Eine Regel kann mehrere Ports, Protokolle oder Adressen ohne Wiederholung abgleichen.
  • Mengen und Karten — Speichern Sie Tausende von IPs oder Port-Bereichen als kernel-seitige Mengen für O(1)-Suche.
  • Bessere Leistung — Weniger Kernel-Aufrufe. Große Regelwerke sind deutlich schneller.
  • Ein einziger Befehlnft ersetzt iptables, ip6tables, arptables und ebtables.

Migration von iptables

Die iptables-nft-Kompatibilitätsschicht

Die meisten Distributionen liefern iptables-nft, einen Drop-in-Ersatz, der iptables-Befehle ausführt, aber Regeln im nftables-Kernel-Subsystem speichert:

# Prüfen, welches Backend Ihr iptables verwendet
iptables --version
# iptables v1.8.7 (nf_tables)  ← verwendet bereits nftables-Backend
# iptables v1.8.7 (legacy)     ← verwendet noch iptables-Backend

Regelübersetzung mit iptables-translate

# Eine einzelne Regel übersetzen
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Ausgabe: nft add rule ip filter INPUT tcp dport 22 counter accept

# Ein gespeichertes Regelwerk übersetzen
iptables-save | iptables-restore-translate -f /etc/nftables.conf

Grundlagen des nft-Befehls

# Gesamtes Regelwerk auflisten
nft list ruleset

# Eine spezifische Tabelle auflisten
nft list table inet filter

# Alles leeren (Vorsicht — löscht alle Regeln)
nft flush ruleset

# Regeln aus einer Datei laden
nft -f /etc/nftables.conf

# Eine Tabelle hinzufügen
nft add table inet filter

# Eine Tabelle löschen (und alle ihre Ketten und Regeln)
nft delete table inet filter

Tabellen und Ketten

Tabellenfamilien

FamilieBehandelt
ipNur IPv4-Pakete
ip6Nur IPv6-Pakete
inetIPv4 und IPv6 (empfohlen für die meisten Regeln)
arpARP-Pakete
bridgePakete, die eine Linux-Bridge durchqueren
netdevPakete von einem spezifischen Netzwerkgerät (ingress-Hook)

Kettentypen und Hooks

KettentypGültige HooksÜbliche Priorität
filterprerouting, input, forward, output, postrouting0
natprerouting, input, output, postrouting-100
routeoutput-150
# Basis-Eingangskette mit drop-Policy erstellen
nft add chain inet filter input \
  '{ type filter hook input priority 0 ; policy drop ; }'

# Weiterleitungskette erstellen
nft add chain inet filter forward \
  '{ type filter hook forward priority 0 ; policy drop ; }'

Regelzyntax

Regeln bestehen aus Übereinstimmungen (Bedingungen) und Verdikten (Aktionen).

Häufige Übereinstimmungen

# Nach Quell-IP abgleichen
nft add rule inet filter input ip saddr 192.168.1.0/24 accept

# Nach Zielport abgleichen
nft add rule inet filter input tcp dport 443 accept

# Mehrere Ports in einer Regel
nft add rule inet filter input tcp dport { 80, 443, 8080 } accept

# Nach Verbindungsverfolgungsstatus abgleichen
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop

# Nach Interface abgleichen
nft add rule inet filter input iifname "lo" accept

Häufige Aktionen (Verdikte)

accept          # Paket erlauben
drop            # Stillschweigend verwerfen
reject          # Verwerfen und ICMP unreachable senden
log             # Im Kernel-Log protokollieren (setzt Auswertung fort)
counter         # Pakete zählen (setzt Auswertung fort)
jump name       # Zu einer anderen Kette springen
return          # Aus der aktuellen Kette zurückkehren

Mengen und Karten

Anonyme Mengen (Inline)

# HTTP und HTTPS in einer Regel erlauben
nft add rule inet filter input tcp dport { 80, 443 } accept

Benannte Mengen

# Benannte Menge von IPv4-Adressen erstellen
nft add set inet filter gesperrte_ips { type ipv4_addr ; }
nft add element inet filter gesperrte_ips { 1.2.3.4, 5.6.7.8 }
nft add rule inet filter input ip saddr @gesperrte_ips drop

# Menge mit Intervallen (CIDR-Bereiche)
nft add set inet filter vertrauenswuerdige_netze \
  { type ipv4_addr ; flags interval ; }
nft add element inet filter vertrauenswuerdige_netze \
  { 192.168.0.0/24, 10.0.0.0/8 }

Verdikt-Karten (vmaps)

nft add map inet filter port_verdikt \
  { type inet_service : verdict ; }
nft add element inet filter port_verdikt \
  { 22 : accept, 80 : accept, 443 : accept, 25 : drop }
nft add rule inet filter input tcp dport vmap @port_verdikt

NAT-Konfiguration

nft add table ip nat
nft add chain ip nat prerouting \
  '{ type nat hook prerouting priority -100 ; }'
nft add chain ip nat postrouting \
  '{ type nat hook postrouting priority 100 ; }'

# Masquerade (SNAT für ausgehenden Datenverkehr)
nft add rule ip nat postrouting oifname "eth0" masquerade

# DNAT (Portweiterleitung)
nft add rule ip nat prerouting \
  tcp dport 8080 dnat to 192.168.1.100:80

Ratenbegrenzung

# Neue SSH-Verbindungen auf 3 pro Minute pro Quell-IP begrenzen
nft add rule inet filter input \
  tcp dport 22 ct state new \
  limit rate 3/minute burst 5 packets accept

# ICMP-Ping-Rate begrenzen
nft add rule inet filter input \
  ip protocol icmp icmp type echo-request \
  limit rate 10/second accept

Protokollierung

# Mit benutzerdefiniertem Präfix protokollieren
nft add rule inet filter input \
  log prefix "FIREWALL-DROP: " level warn

# SSH-Zugriff protokollieren und erlauben
nft add rule inet filter input \
  tcp dport 22 log prefix "SSH-ZUGRIFF: " level info accept

Persistenz: Regeln Speichern und Wiederherstellen

# Aktuelles Regelwerk speichern
nft list ruleset > /etc/nftables.conf

# systemd-Dienst aktivieren
systemctl enable --now nftables
systemctl reload nftables

Beispiel /etc/nftables.conf

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set vertrauenswuerdiges_ssh {
        type ipv4_addr
        flags interval
        elements = { 192.168.1.0/24, 10.0.0.0/8 }
    }

    chain input {
        type filter hook input priority 0 ; policy drop ;
        iifname "lo" accept
        ct state established,related accept
        ct state invalid drop
        ip saddr @vertrauenswuerdiges_ssh tcp dport 22 accept
        tcp dport { 80, 443 } accept
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept
    }

    chain forward {
        type filter hook forward priority 0 ; policy drop ;
    }

    chain output {
        type filter hook output priority 0 ; policy accept ;
    }
}

Praktische Beispiele

Webserver (Nginx/Apache)

nft add table inet filter
nft add chain inet filter input \
  '{ type filter hook input priority 0 ; policy drop ; }'
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft add rule inet filter input ip protocol icmp accept

Gateway / Router

sysctl -w net.ipv4.ip_forward=1
nft add table ip nat
nft add chain ip nat postrouting \
  '{ type nat hook postrouting priority 100 ; }'
nft add rule ip nat postrouting oifname "eth0" masquerade
nft add chain inet filter forward \
  '{ type filter hook forward priority 0 ; policy drop ; }'
nft add rule inet filter forward \
  iifname "eth1" oifname "eth0" ct state new,established,related accept
nft add rule inet filter forward \
  iifname "eth0" oifname "eth1" ct state established,related accept

Vergleich: nftables vs iptables vs firewalld vs ufw

Merkmalnftablesiptablesfirewalldufw
IPv4 + IPv6 vereintJa (inet)Nein (separate Tools)Ja (via nftables)Teilweise
Atomare AktualisierungenJaNeinJaNein
Mengen / KartenNativipset (extern)Via Rich-RulesNein
SyntaxModern, prägnantAusführlichXML / CLIEinfaches CLI
Leistung (große Regelwerke)HervorragendSchlecht (lineares Scan)GutAusreichend
Direkte Kernel-IntegrationJaLegacy (veraltet)FrontendFrontend
LernkurveModeratNiedrig (vertraut)NiedrigSehr niedrig

Debugging mit nft monitor und Zählern

# Alle netfilter-Ereignisse in Echtzeit überwachen
nft monitor

# Zählerwerte anzeigen
nft list table inet filter

# Zähler zurücksetzen ohne Regeln zu löschen
nft reset counters table inet filter

# Syntax prüfen ohne zu laden
nft -c -f /etc/nftables.conf

# Paketpfad verfolgen
nft add rule inet filter input meta nftrace set 1
nft monitor trace

Zusammenfassung

  • nftables vereint iptables, ip6tables, arptables und ebtables in einem einzigen nft-Befehl.
  • Verwenden Sie die Familie inet, um IPv4 und IPv6 in einem einzigen Regelwerk zu behandeln.
  • Benannte Mengen und Verdikt-Karten ersetzen ipset und komplexe Mehrfachregel-Muster.
  • Die atomare Regelersetzung via nft -f eliminiert das Teilaktualisierungsfenster, das iptables betrifft.
  • Persistieren Sie Regeln in /etc/nftables.conf und aktivieren Sie nftables.service mit systemd.

Verwandte Artikel