iptables — Linux-Firewall mit netfilter steuern
Praxis-Guide zu iptables — die Linux-Firewall über netfilter steuern, mit Chains, Tables, Targets, NAT, Connection Tracking und persistenten Regeln.
iptables ist das klassische Frontend für die netfilter-Firewall im Linux-Kernel: Mit einem einzigen Befehl filterst du Pakete, baust NAT-Regeln oder schließt offene Ports ab. Regeln organisierst du in Tables (filter, nat, mangle, raw) und Chains (INPUT, OUTPUT, FORWARD), die jedes Paket der Reihe nach durchläuft, bis ein Target wie ACCEPT, DROP oder REJECT greift. Auf modernen Systemen löst nftables das Tool zunehmend ab – über iptables-nft bleibt die gewohnte Syntax aber als Kompatibilitätsschicht erhalten. Dieser Guide zeigt dir die wichtigsten Optionen für den Alltag, vom Auflisten der Regeln bis zur stateful Firewall mit Connection Tracking.
Regeln auflisten
iptables -L — Listet alle Regeln der filter-Table auf.
sudo iptables -Liptables -L -n — Listet Regeln mit numerischen Adressen und Ports auf (keine DNS-Auflösung).
sudo iptables -L -niptables -L -v — Listet Regeln mit Paket-/Byte-Zählern auf.
sudo iptables -L -viptables -L -n -v --line-numbers — Listet Regeln mit Zeilennummern, numerisch und ausführlich auf. Das nützlichste Format.
sudo iptables -L -n -v --line-numbersiptables -L CHAIN — Listet die Regeln einer bestimmten Chain auf (INPUT, OUTPUT, FORWARD).
sudo iptables -L INPUT -niptables -t TABLE -L — Listet die Regeln einer bestimmten Table auf (filter, nat, mangle, raw).
sudo iptables -t nat -L -niptables -S — Listet Regeln im iptables-save-Format auf (leichter zu lesen und erneut anzuwenden).
sudo iptables -Siptables -S CHAIN — Listet die Regeln einer bestimmten Chain im Save-Format auf.
sudo iptables -S INPUTGrundlegende Regelverwaltung
iptables -A CHAIN RULE — Hängt eine Regel ans Ende einer Chain an.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -I CHAIN RULE — Fügt eine Regel am Anfang einer Chain ein.
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPTiptables -I CHAIN NUM RULE — Fügt eine Regel an einer bestimmten Position ein (Zeilennummer).
sudo iptables -I INPUT 3 -p tcp --dport 8080 -j ACCEPTiptables -D CHAIN RULE — Löscht eine Regel anhand ihrer Spezifikation.
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPTiptables -D CHAIN NUM — Löscht eine Regel anhand ihrer Zeilennummer.
sudo iptables -D INPUT 3iptables -R CHAIN NUM RULE — Ersetzt eine Regel an einer bestimmten Zeilennummer.
sudo iptables -R INPUT 2 -p tcp --dport 8443 -j ACCEPTChains verwalten
iptables -P CHAIN TARGET — Setzt die Default-Policy einer eingebauten Chain (ACCEPT oder DROP). Vorsicht: -P INPUT DROP über SSH sperrt dich aus, wenn keine ACCEPT-Regel für deine Verbindung existiert – setze sie vorher.
sudo iptables -P INPUT DROPiptables -F — Leert (löscht) alle Regeln in allen Chains. Steht die Policy auf DROP, kann ein Flush eine Remote-/SSH-Sitzung aussperren – idealerweise lokal an der Konsole ausführen.
sudo iptables -Fiptables -F CHAIN — Leert alle Regeln einer bestimmten Chain.
sudo iptables -F INPUTiptables -Z — Setzt alle Paket- und Byte-Zähler auf null.
sudo iptables -Ziptables -N CHAIN — Erstellt eine neue benutzerdefinierte Chain.
sudo iptables -N MY_CHAINiptables -X CHAIN — Löscht eine benutzerdefinierte Chain (muss leer und unreferenziert sein).
sudo iptables -X MY_CHAINiptables -E OLD NEW — Benennt eine benutzerdefinierte Chain um.
sudo iptables -E MY_CHAIN NEW_CHAINMatch-Kriterien
-p PROTOCOL — Filtert nach Protokoll: tcp, udp, icmp, all.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT-s SOURCE/MASK — Filtert nach Quell-IP oder -Netz.
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT-d DEST/MASK — Filtert nach Ziel-IP oder -Netz.
sudo iptables -A OUTPUT -d 10.0.0.0/8 -j DROP--dport PORT — Filtert nach Ziel-Port (erfordert -p tcp oder -p udp).
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT--sport PORT — Filtert nach Quell-Port.
sudo iptables -A INPUT -p tcp --sport 1024:65535 -j ACCEPT--dport PORT1:PORT2 — Filtert einen Bereich von Ziel-Ports.
sudo iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT-i INTERFACE — Filtert nach eingehendem Interface (für INPUT und FORWARD).
sudo iptables -A INPUT -i eth0 -j ACCEPT-o INTERFACE — Filtert nach ausgehendem Interface (für OUTPUT und FORWARD).
sudo iptables -A OUTPUT -o lo -j ACCEPT! -s SOURCE — Negiert einen Match (NOT).
sudo iptables -A INPUT ! -s 192.168.1.0/24 -j DROPTargets (Aktionen)
-j ACCEPT — Lässt das Paket durch.
-j DROP — Verwirft das Paket stillschweigend (keine Antwort).
-j REJECT — Weist das Paket ab und sendet einen ICMP-Fehler.
-j REJECT --reject-with TYPE — Weist mit einem bestimmten ICMP-Typ ab: icmp-port-unreachable, tcp-reset usw.
sudo iptables -A INPUT -p tcp --dport 23 -j REJECT --reject-with tcp-reset-j LOG — Protokolliert das Paket in syslog/journal und verarbeitet es danach weiter.
sudo iptables -A INPUT -j LOG --log-prefix 'IPT-DROP: '-j LOG --log-prefix 'PREFIX' — Protokolliert mit einem eigenen Präfix zur leichten Identifikation in den Logs.
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix 'SSH: '-j RETURN — Kehrt aus der aktuellen Chain in die aufrufende Chain zurück.
Connection Tracking (Stateful)
-m conntrack --ctstate STATE — Filtert nach Verbindungsstatus: NEW, ESTABLISHED, RELATED, INVALID.
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT-m conntrack --ctstate NEW — Filtert nur neue Verbindungen.
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT-m conntrack --ctstate INVALID — Filtert Pakete, die zu keiner bekannten Verbindung gehören.
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROPErweiterte Module
-m multiport --dports P1,P2,P3 — Filtert mehrere Ports in einer einzigen Regel.
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT-m iprange --src-range IP1-IP2 — Filtert einen Bereich von Quell-IPs.
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT-m limit --limit RATE — Begrenzt die Trefferrate (z. B. 5/min, 1/sec).
sudo iptables -A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT-m limit --limit-burst N — Setzt das Burst-Limit für die Ratenbegrenzung.
sudo iptables -A INPUT -p icmp -m limit --limit 1/sec --limit-burst 4 -j ACCEPT-m recent --name LIST --set — Fügt die Quell-IP einer benannten Tracking-Liste hinzu.
sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set-m recent --name LIST --rcheck --seconds S --hitcount N — Prüft, ob die Quell-IP N-mal in S Sekunden aufgetreten ist.
sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --rcheck --seconds 60 --hitcount 4 -j DROP-m comment --comment 'TEXT' — Fügt einer Regel einen Kommentar zur Dokumentation hinzu.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT -m comment --comment 'Allow HTTP'NAT-Table
iptables -t nat -A POSTROUTING -o IFACE -j MASQUERADE — Aktiviert NAT/Masquerading für Internet-Sharing.
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEiptables -t nat -A PREROUTING -p tcp --dport PORT -j DNAT --to-destination IP:PORT — Port-Forwarding: leitet eingehenden Verkehr an einen anderen Host/Port weiter.
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80iptables -t nat -A PREROUTING -p tcp --dport PORT -j REDIRECT --to-port PORT — Leitet Verkehr auf einen anderen lokalen Port um.
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080iptables -t nat -A POSTROUTING -s NETWORK -j SNAT --to-source IP — Source NAT: ändert die Quell-IP für ausgehende Pakete.
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j SNAT --to-source 203.0.113.1Sichern & Wiederherstellen
iptables-save — Gibt alle aktuellen Regeln in einem wiederherstellbaren Format aus. Regeln sind nicht persistent – ohne diesen Schritt (oder netfilter-persistent) gehen sie beim Reboot verloren.
sudo iptables-save > /etc/iptables/rules.v4iptables-restore < FILE — Stellt Regeln aus einer gespeicherten Datei wieder her.
sudo iptables-restore < /etc/iptables/rules.v4iptables-save -t TABLE — Sichert nur die Regeln einer bestimmten Table.
sudo iptables-save -t filteriptables-save -c — Sichert die Regeln inklusive Paket-/Byte-Zähler.
sudo iptables-save -c > rules-with-counters.v4Typische Firewall-Muster
iptables -A INPUT -i lo -j ACCEPT — Lässt jeglichen Loopback-Verkehr zu (essenziell).
sudo iptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT — Lässt bestehende und zugehörige Verbindungen zu (Basisregel einer stateful Firewall).
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT — Lässt SSH, HTTP und HTTPS zu.
sudo iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPTiptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT — Lässt Ping-Anfragen zu.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTiptables -P INPUT DROP — Setzt die Default-Policy auf DROP (verweigert alles nicht ausdrücklich Erlaubte). Erst nach den ACCEPT-Regeln oben setzen, sonst sperrst du dich per SSH aus; die Regeln anschließend mit iptables-save persistieren.
sudo iptables -P INPUT DROP Fazit
iptables wirkt durch seine Optionsflut zunächst sperrig, folgt aber einer klaren Logik: Pakete durchlaufen Chains, bis ein Target über ihr Schicksal entscheidet. Wer die Reihenfolge der Regeln und das Zusammenspiel von Connection Tracking und Default-Policy verstanden hat, baut damit robuste Firewalls. Denk daran, deine Regeln mit iptables-save oder netfilter-persistent zu sichern – sonst sind sie nach dem nächsten Reboot verloren. Und teste eine Default-Policy DROP nach Möglichkeit lokal oder über eine zweite Sitzung, bevor du dich selbst aussperrst.
Weiterführende Links
- iptables(8) – Manpage – vollständige Optionsreferenz (englisch)
- iptables – Arch Wiki – ausführlicher Praxis-Guide (englisch)
- iptables – Wikipedia – Hintergrund und Geschichte