Benutzer-Werkzeuge

Webseiten-Werkzeuge


sammlung:nftables

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

Quellen

sammlung/nftables.txt · Zuletzt geändert: von 127.0.0.1