iptables ist das klassische Firewall-Tool unter Linux. Es filtert Netzwerkpakete basierend auf Regeln, die Sie definieren.
Grundkonzept
iptables arbeitet mit:
- Tabellen: Verschiedene Funktionsbereiche (filter, nat, mangle)
- Chains: Regelketten (INPUT, OUTPUT, FORWARD)
- Regeln: Bedingungen und Aktionen
Die wichtigsten Chains
| Chain | Beschreibung | |-------|--------------| | INPUT | Eingehende Pakete zum Server | | OUTPUT | Ausgehende Pakete vom Server | | FORWARD | Pakete, die durch den Server geroutet werden |
Aktuelle Regeln anzeigen
# Alle Regeln
iptables -L
# Mit Zeilennummern
iptables -L --line-numbers
# Detailliert
iptables -L -v
# Als Befehle (zum Kopieren)
iptables -S
# Für NAT-Tabelle
iptables -t nat -LRegeln erstellen
Syntax
iptables -A CHAIN -p PROTOKOLL --dport PORT -j AKTION| Option | Bedeutung | |--------|-----------| | -A | Append (Regel anhängen) | | -I | Insert (am Anfang einfügen) | | -D | Delete (Regel löschen) | | -p | Protokoll (tcp, udp, icmp) | | --dport | Zielport | | --sport | Quellport | | -s | Quell-IP | | -d | Ziel-IP | | -j | Jump (Aktion) | | -i | Input-Interface | | -o | Output-Interface |
Aktionen
| Aktion | Beschreibung | |--------|--------------| | ACCEPT | Paket erlauben | | DROP | Paket verwerfen (still) | | REJECT | Paket ablehnen (mit Antwort) | | LOG | Paket protokollieren |
Grundlegende Firewall einrichten
Schritt 1: Loopback erlauben
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPTSchritt 2: Bestehende Verbindungen erlauben
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTSchritt 3: SSH erlauben
iptables -A INPUT -p tcp --dport 22 -j ACCEPTSchritt 4: Weitere Dienste
# HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPTSchritt 5: Ping erlauben (optional)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTSchritt 6: Alles andere blockieren
iptables -A INPUT -j DROPKomplettes Beispiel
#!/bin/bash
# Firewall-Skript
# Alle Regeln löschen
iptables -F
iptables -X
# Standardrichtlinien
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback
iptables -A INPUT -i lo -j ACCEPT
# Bestehende Verbindungen
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH (nur von bestimmter IP)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Ping begrenzt
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Logging für abgelehnte Pakete
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "Regeln verwalten
Regel löschen
# Nach Nummer
iptables -D INPUT 3
# Nach Spezifikation
iptables -D INPUT -p tcp --dport 80 -j ACCEPTRegel einfügen
# An Position 2
iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPTAlle Regeln löschen
iptables -FChain leeren und Standardrichtlinie
iptables -F INPUT
iptables -P INPUT ACCEPTIP-Adressen
Einzelne IP erlauben
iptables -A INPUT -s 192.168.1.100 -j ACCEPTIP-Bereich erlauben
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPTIP blockieren
iptables -A INPUT -s 10.20.30.40 -j DROPPort-Bereiche
# Port-Bereich
iptables -A INPUT -p tcp --dport 6000:6100 -j ACCEPT
# Mehrere Ports
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPTRate Limiting
SSH-Brute-Force-Schutz
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROPPing-Limit
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPTLogging
# Alle gedroppten Pakete loggen
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
# Log in /var/log/kern.log oder /var/log/messagesLogs anzeigen:
grep "IPT-DROP" /var/log/kern.logNAT (Network Address Translation)
SNAT/Masquerading
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPort-Weiterleitung
# Eingehend Port 8080 auf internen Server 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPTRegeln speichern
Ubuntu/Debian mit iptables-persistent
apt install iptables-persistent
netfilter-persistent saveManuell speichern/laden
# Speichern
iptables-save > /etc/iptables.rules
# Laden
iptables-restore < /etc/iptables.rulesBeim Boot laden
In /etc/rc.local oder als systemd-Service:
#!/bin/bash
iptables-restore < /etc/iptables.rulesIPv6 (ip6tables)
Gleiche Syntax wie iptables:
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A INPUT -j DROPDebugging
Pakete zählen
iptables -L -vZeigt Pakete und Bytes pro Regel.
Testen ohne Aussperren
# Temporäre Regel mit Timeout
at now + 5 minutes <<< "iptables -F"Falls Sie sich aussperren, werden Regeln nach 5 Minuten gelöscht.
iptables vs. nftables vs. ufw
| Tool | Beschreibung | |------|--------------| | iptables | Klassisch, weit verbreitet | | nftables | Nachfolger von iptables | | ufw | Einfaches Frontend für iptables | | firewalld | Frontend mit Zonen (CentOS/RHEL) |
Für Einsteiger ist ufw einfacher:
ufw enable
ufw allow ssh
ufw allow httpFazit
iptables ist mächtig, aber komplex. Für einfache Server-Firewalls ist ufw komfortabler. Bei komplexen Setups (NAT, Port-Forwarding) ist iptables-Wissen unverzichtbar. Speichern Sie Regeln immer, damit sie einen Neustart überleben.