sammlung:nftables
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
| sammlung:nftables [2026/01/06 10:31] – [Weitere Informationen] Branislav Zeljak | sammlung:nftables [2026/01/31 09:15] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ===== nftables ===== | ===== nftables ===== | ||
| - | nftables ist der moderne Nachfolger von iptables und bietet | + | **Kurzfassung: |
| - | ==== Merkmale | + | ==== Übersicht |
| + | nftables ist das moderne Firewall-Framework, | ||
| - | | + | ==== Voraussetzungen ==== |
| - | * Einfache Syntax, zentrale Konfiguration | + | * Linux-Kernel 3.13 oder höher (empfohlen: 4.14+) |
| + | * nftables-Paket installiert | ||
| + | | ||
| + | * Grundkenntnisse in Netzwerk-Protokollen | ||
| - | ==== Wichtige Befehle | + | ==== Anleitung |
| - | < | + | === Installation und Grundkonfiguration === |
| + | < | ||
| + | # nftables installieren | ||
| + | sudo apt install nftables | ||
| + | sudo dnf install nftables | ||
| + | sudo pacman -S nftables | ||
| + | |||
| + | # 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 | 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: | ||
| + | <code bash> | ||
| + | # ip - IPv4 | ||
| + | # ip6 - IPv6 | ||
| + | # inet - IPv4 + IPv6 (dual-stack) | ||
| + | # arp - ARP | ||
| + | # bridge - Ethernet-Bridge | ||
| + | # netdev - Ingress (frühe Filterung) | ||
| + | </ | ||
| + | |||
| + | === Tabellen und Chains erstellen === | ||
| + | |||
| + | <code bash> | ||
| + | # 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 === | ||
| + | |||
| + | <code bash> | ||
| + | # SSH erlauben (Port 22) | ||
| sudo nft add rule inet filter input tcp dport 22 accept | sudo nft add rule inet filter input tcp dport 22 accept | ||
| - | sudo nft delete | + | |
| + | # 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, | ||
| + | |||
| + | # 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 | ||
| </ | </ | ||
| - | ==== Beispiel: Freigabe | + | === IP-Adressen und Netzwerke filtern |
| - | < | + | |
| - | # Beispiel-Regeln | + | <code bash> |
| + | # 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/ | ||
| + | |||
| + | # 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, | ||
| + | |||
| + | # IP-Adresse blockieren | ||
| + | sudo nft add rule inet filter input ip saddr 10.0.0.5 drop | ||
| + | |||
| + | # Traffic | ||
| + | sudo nft add rule inet filter input iifname " | ||
| + | </ | ||
| + | |||
| + | === Named Sets (IP-Listen) === | ||
| + | |||
| + | <code bash> | ||
| + | # 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): | ||
| + | <code bash> | ||
| + | # 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 " | ||
| + | |||
| + | # SNAT mit fester IP | ||
| + | sudo nft add rule inet nat postrouting oifname " | ||
| + | </ | ||
| + | |||
| + | **Destination NAT (DNAT / Port-Weiterleitung):** | ||
| + | <code bash> | ||
| + | # PREROUTING Chain | ||
| + | sudo nft add chain inet nat prerouting { type nat hook prerouting priority -100 \; } | ||
| + | |||
| + | # Port-Weiterleitung (80 → 192.168.1.10: | ||
| + | sudo nft add rule inet nat prerouting iifname " | ||
| + | |||
| + | # 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 | ||
| + | |||
| + | <code bash> | ||
| + | # 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 === | ||
| + | |||
| + | <code bash> | ||
| + | # Aktuelle Konfiguration speichern | ||
| + | sudo nft list ruleset > / | ||
| + | |||
| + | # Konfiguration laden | ||
| + | sudo nft -f / | ||
| + | |||
| + | # Beim Systemstart laden (über systemd) | ||
| + | sudo systemctl enable nftables | ||
| + | |||
| + | # Konfigurationsdatei-Pfad (Distribution abhängig) | ||
| + | # Debian/ | ||
| + | # RHEL/ | ||
| + | |||
| + | # Syntax prüfen ohne anzuwenden | ||
| + | sudo nft -c -f / | ||
| + | </ | ||
| + | |||
| + | === Beispiel: Komplette Firewall-Konfiguration === | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | |||
| + | # Alles löschen | ||
| + | flush ruleset | ||
| + | |||
| + | # Tabelle erstellen | ||
| table inet filter { | table inet filter { | ||
| - | | + | # INPUT Chain |
| - | type filter hook input priority 0; | + | |
| - | tcp dport {21,22,80} accept | + | type filter hook input priority 0; policy drop; |
| - | } | + | |
| + | # Loopback erlauben | ||
| + | iif lo accept | ||
| + | |||
| + | # Etablierte Verbindungen | ||
| + | ct state established, | ||
| + | |||
| + | # ICMP | ||
| + | icmp type echo-request limit rate 1/second accept | ||
| + | |||
| + | # SSH | ||
| + | | ||
| + | |||
| + | # HTTP/ | ||
| + | tcp dport { 80, 443 } accept | ||
| + | |||
| + | # Logging für blockierte Pakete | ||
| + | limit rate 5/minute log prefix " | ||
| + | } | ||
| + | |||
| + | # OUTPUT Chain | ||
| + | chain output { | ||
| + | type filter hook output priority 0; policy accept; | ||
| + | } | ||
| + | |||
| + | # FORWARD Chain | ||
| + | chain forward { | ||
| + | type filter hook forward priority 0; policy drop; | ||
| + | | ||
| } | } | ||
| + | </ | ||
| - | # Regeln laden und beim Booten aktivieren: | + | === Rate Limiting (DDoS-Schutz) === |
| + | |||
| + | <code bash> | ||
| + | # 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 === | ||
| + | |||
| + | <code bash> | ||
| + | # Connection Tracking States | ||
| + | # new - Neue Verbindung | ||
| + | # established - Bestehende Verbindung | ||
| + | # related | ||
| + | # invalid | ||
| + | |||
| + | # Nur neue und etablierte Verbindungen | ||
| + | sudo nft add rule inet filter input ct state new, | ||
| + | |||
| + | # 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 === | ||
| + | |||
| + | <code bash> | ||
| + | # 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 > / | ||
| + | |||
| + | # ip6tables auch konvertieren | ||
| + | sudo ip6tables-save | ip6tables-restore-translate >> / | ||
| + | |||
| + | # Konvertierte Regeln prüfen und anwenden | ||
| + | sudo nft -c -f / | ||
| sudo nft -f / | sudo nft -f / | ||
| - | sudo systemctl enable nftables | ||
| </ | </ | ||
| - | ==== Weitere Informationen ==== | + | === Debugging und Troubleshooting |
| + | <code bash> | ||
| + | # 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 / | ||
| + | </ | ||
| + | |||
| + | ==== Hinweise ==== | ||
| + | |||
| + | <note tip> | ||
| + | **Best Practices: | ||
| + | - '' | ||
| + | - Sets verwenden für große IP-Listen (bessere Performance) | ||
| + | - Konfiguration in Datei speichern: ''/ | ||
| + | - Rate Limiting gegen Brute-Force: | ||
| + | - '' | ||
| + | - Named Counters für Monitoring und Statistiken nutzen | ||
| + | - Vor Produktiv-Deployment: | ||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | **Häufige Fehler vermeiden: | ||
| + | - Semikolon in Chain-Definition maskieren: '' | ||
| + | - Sets müssen vor Nutzung definiert werden | ||
| + | - '' | ||
| + | - Handle-Nummern ändern sich nach Löschen von Regeln | ||
| + | - '' | ||
| + | - nftables und iptables nicht parallel nutzen (Konflikte möglich) | ||
| + | - Ranges mit '' | ||
| + | </ | ||
| + | |||
| + | ==== Siehe auch ==== | ||
| + | * [[sammlung: | ||
| * [[sammlung: | * [[sammlung: | ||
| - | * [[sammlung:firewalld|firewalld]] | + | * [[sammlung:ufw|UFW]] |
| + | * [[sammlung: | ||
| + | * [[sammlung: | ||
| + | |||
| + | ==== Quellen ==== | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | {{tag> | ||
| - | {{tag> | + | ---- |
sammlung/nftables.txt · Zuletzt geändert: von 127.0.0.1
