Firewall iptables und ip6tables unter Debian

Veröffentlicht: / Letztes Update:

Jeder der einen eigenen Server betreibt, muss sich auch mit dem Thema Firewall auseinander setzen.

Die Besonderheit an iptables ist, dass diese nur für IPv4 wirksame Regeln verwaltet und für IPv6 zusätzlich ip6tables konfiguriert werden muss.
Zudem muss man bei den Firewallregeln sehr bedacht vorgehen, da man sich sehr schnell mit nur einem Befehl aus dem eigenen Server aussperren kann.

Iptables kann Verbindungen blockieren, umleiten oder auch in der Anzahl und Geschwindigkeit begrenzen. Aber am häufigsten werden Ports gesperrt oder umgeleitet.

Ich gehe in diesem Blog erst einmal nur auf Befehle ein, die ich selbst bereits häufiger nutze.
Man wird aber schnell feststellen, dass viele Befehle zwischen iptables und ip6tables identisch sind.

Anzeigen aller Regeln

iptables -L
ip6tables -L

Listet alle aktuellen iptables-Regeln auf.

Blockieren des eingehenden Verkehrs auf einem bestimmten Port

iptables -A INPUT -p tcp --dport 80 -j DROP
ip6tables -A INPUT -p tcp --dport 80 -j DROP

Blockiert eingehenden TCP-Verkehr auf Port 80.

Blockieren des gesamten Verkehrs von einer spezifischen IP-Adresse

iptables -A INPUT -s 192.168.1.10 -j DROP
ip6tables -A INPUT -s 2001:db8::1 -j DROP

Blockiert eingehenden Verkehr von der angegebenen IP-Adresse.

Zulassen des eingehenden Verkehrs auf einem bestimmten Port

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

Erlaubt den eingehenden TCP-Verkehr auf Port 22.

Löschen aller Regeln (Zurücksetzen)

iptables -F

Löscht alle iptables--Regeln.

ip6tables -F

Löscht alle ip6tables-Regeln.

Speichern der iptables-Konfiguration

iptables-save > /etc/iptables/rules.v4

Speichert die aktuelle Konfiguration in einer Datei.

ip6tables-save > /etc/iptables/rules.v6

Speichert die aktuelle ip6tables-Konfiguration in einer Datei.

Wiederherstellen der iptables-Konfiguration

iptables-restore < /etc/iptables/rules.v4

Stellt die iptables-Konfiguration aus einer Datei wieder her.

ip6tables-restore < /etc/iptables/rules.v6

Stellt die ip6tables-Konfiguration aus einer Datei wieder her.

Protokollieren des abgelehnten Verkehrs

iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
ip6tables -A INPUT -j LOG --log-prefix "ip6tables-Dropped: " --log-level 4

Protokolliert alle abgelehnten Pakete mit einem spezifischen Präfix im Syslog.

Umleiten des Verkehrs von einem Port auf einen anderen

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
ip6tables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

Leitet jeglichen auf Port 80 eingehenden Verkehr auf Port 8080 um.

Erstellen einer benutzerdefinierten Kette

iptables -N mychain
iptables -A INPUT -p tcp --dport 22 -j mychain
iptables -A mychain -s 192.168.1.1 -j ACCEPT
iptables -A mychain -j DROP


ip6tables -N mychain
ip6tables -A INPUT -p tcp --dport 22 -j mychain
ip6tables -A mychain -s 2001:db8::1 -j ACCEPT
ip6tables -A mychain -j DROP

Erstellt eine neue Kette für spezifische Aufgaben.

Zulassen von Ping-Anfragen

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

Erlaubt Ping-Anfragen an den Host.

Konfiguration des NAT für ein privates Netzwerk

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Ermöglicht Geräten in einem privaten Netzwerk, über eine gemeinsame öffentliche IP-Adresse auf das Internet zuzugreifen.

Ein direktes NAT ist in ip6tables für IPv6 nicht vorgesehen, es gibt aber Möglichkeiten dies zu realisieren.

Festlegen einer Standardpolitik

iptables -P INPUT DROP
ip6tables -P INPUT DROP

Setzt die Standardpolitik für die INPUT-Kette auf DROP.

Zustandsabhängige Regeln

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Akzeptiert eingehenden Verkehr, wenn die Verbindung bereits etabliert oder verwandt ist.

Zeitbasierte Regeln

iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT

Erlaubt eingehenden Verkehr auf Port 80 nur zwischen 09:00 und 17:00 Uhr.

Verwendung von IP-Bereichen

iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
ip6tables -A INPUT -m iprange --src-range 2001:db8::1-2001:db8::10 -j ACCEPT

Akzeptiert eingehenden Verkehr von einer Reihe von IPv6-Adressen.

Verkehrsratenbegrenzung

iptables -A INPUT -p tcp --dport 80 -m limit --limit 1/second --limit-burst -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -m limit --limit 1/minute --limit-burst 100 -j ACCEPT

Begrenzt die Anzahl der Verbindungen zu Port 80 auf 1 pro Minute nach einer Anfangsflut von 100 Verbindungen für IPv6-Verkehr.

SNAT und DNAT

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source [Neue-IP]
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination [Server-IP]


ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination [Server-IPv6]:[Server-Port]
ip6tables -A FORWARD -p tcp -d [Server-IPv6] --dport [Server-Port] -j ACCEPT

Konfiguriert Source NAT und Destination NAT für das Routing und die Adressübersetzung.

TOS-Feld/Markierungen setzen

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TOS --set-tos Minimize-Delay
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TOS --set-tos Minimize-Delay

Setzt das Type of Service (TOS)-Feld in IP-Paketen für den Port 80, um die Verzögerung zu minimieren.

Kommentare zu Regeln hinzufügen

iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH access"
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH access (IPv6)"

Fügt eine Regel hinzu, um SSH-Zugang zu erlauben, mit einem Kommentar zur Dokumentation.

Verwenden von Modulen für erweiterte Paketprüfung

iptables -A INPUT -p tcp --dport 80 -m string --string "badcontent" --algo bm -j DROP
ip6tables -A INPUT -p tcp --dport 80 -m string --string "badcontent" --algo bm -j DROP

Filtert Pakete, die spezifischen Text enthalten. (Beisiel: badcontent)

Ablehnen von Verkehr mit spezifischem Antwortcode

iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-prohibited
ip6tables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-prohibited

Ablehnung von Verkehr mit einem spezifischen ICMP-Antwortcode.

Erstellen komplexer Bedingungen mit mehreren Kriterien

iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -s 2001:db8::/64 -m state --state NEW -j ACCEPT

Kombiniert mehrere Bedingungen in einer Regel.

Verkehrsumleitung (Port Forwarding)

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80
ip6tables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 2001:db8::2:80

Leitet eingehenden Verkehr auf Port 8080 einer anderen IP-Adresse und Port um.

Kombinieren von IPTables mit IPSet für effizientes Filtern

IPv4:

ipset create testset hash:ip
ipset add testset 192.168.1.100
iptables -A INPUT -m set --match-set testset src -j DROP

IPv6:

ipset create testset6 hash:ip
ipset add testset6 2001:db8::1
ip6tables -A INPUT -m set --match-set testset6 src -j DROP

Verwendet IPSet für effizientes Filtern von IP-Adressgruppen.

Loggen von Paketen mit spezifischen Kriterien

iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
ip6tables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "

Loggt Pakete, die spezifische Kriterien erfüllen.

Verwenden der `owner`-Option

iptables -A OUTPUT -m owner --uid-owner 1000 -j REJECT
ip6tables -A OUTPUT -m owner --uid-owner 1000 -j REJECT

Regeln basierend auf dem Eigentümer des Prozesses, der die Verbindung initiiert.