iptables – Teil 2: Fortgeschrittene

By | 7. November 2016

iptables Fortgeschrittene – Im 2. Teil der iptables Reihe soll es nicht mehr um die Grundlagen gehen, sondern sich an diejenigen richten, welche ihr Wissen vertiefen wollen. Hierzu sehen wir uns einige Beispiele und typische Fallstricke an.

Im 1. Teil iptables – Teil 1: Einführung ging es um die Installation und grundlegende Befehle/Regeln von iptables zur Konfiguration der Linux Firewall. Nun soll es um komplexere Regeln gehen und unterschiedliche Herangehensweisen zur Erstellung von iptables Firewallregeln.

1. iptables Pakete verwerfen

Wie bereits im 1. Teil erläutert, macht eine Firewall erst dann Sinn, wenn wir auch Pakete verwerfen. Um einen Server abzusichern, haben wir als letzte Regel für den eingehenden bzw. den ausgehenden Datenverkehr folgendes in die INPUT- bzw. OUTPUT-Kette eingefügt.

iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP

Eine weitere Möglichkeit Pakete zu verwerfen besteht in der Änderung der Policy für die jeweilige Kette. Diese legt fest, wie mit Paketen umgegangen wird, wenn keine Regel auf diese zutrifft.

Sehen wir uns hierzu die Policy der INPUT Kette an.

-P INPUT ACCEPT

Die Policy besagt also, dass wenn keine von uns definierte Regel auf ein Paket in dieser Kette zutrifft, dass Paket akzeptiert werden soll. Aus diesem Grund ist es auch wichtig als letzte Regel eine DROP Regel einzufügen, weil ansonsten die Pakete von der Firewall durch die Policy akzeptiert werden würden.

Nun ändern wir die Policy für die INPUT Kette wie folgt ab.

iptables -P INPUT DROP

Trifft nun keine von uns erstellte Regel auf ein Paket zu, so wird das Paket verworfen. Benutzen wird diese Methode zum verwerfen von Paketen, benötigen wir folglich keine DROP Regel mehr in unserer Kette, da das Paket durch die Policy der Kette verworfen wird. Wir müssen also nicht mehr darauf achten, dass eine neue Regel vor der DROP Regel eingefügt wird, da diese sonst nicht mehr ausgeführt werden würde.

ABER es ist besondere Vorsicht geboten. Würden wir zum Löschen der von uns erstellten Regeln nun wie gewohnt …

iptables -F

… ausführen, würde was passieren?

Wir hätten uns ausgesperrt. Warum? Weil nun keine Regeln mehr vorhanden sind und unsere Policy besagt, dass wenn auf ein Paket keine Regel zutrifft, dieses verworfen werden soll. Wir müssen also vor dem Löschen von allen Regeln einer bestimmten Kette die Policy wieder auf ACCEPT stellen bzw. wenn wir noch keine Regeln in unserer Kette erstellt haben, zuerst die Regeln erstellen und dann erst die Policy auf DROP setzen.

Bezogen auf die INPUT Kette führen wir nun also diesen Befehl aus bevor wir alle Regeln aus dieser Kette löschen:

iptables -P INPUT ACCEPT

Hierzu könnten wir auch ein Skript erstellen oder über ein Deployment Tool die entsprechenden Kommandos ausführen.

2. iptables Regeln erstellen

Wie wir einfache Regeln erstellen, haben wir bereits im 1. Teil iptables – Teil 1: Einführung gesehen. Nun wollen wir die Regeln detaillierter erstellen. Es gibt schließlich unterschiedliche Protokolle, Interfaces, Ports und Zustände von Verbindungen.

2.1 Protokolle

Wir unterscheiden zwischen TCP Protokollen und UDP Protokollen. Hierfür gibt es die iptables Option -p .

iptables -p tcp -j ACCEPT
iptables -p udp -j DROP

 

2.2 iptables Interfaces

Wir haben in der Regel mehrere Interfaces in einem Gerät. Das fängt damit an, dass es immer ein Loopback Interface gibt und zumindest eine weiteres Interface. Bei LAN Schnittstellen meist eth0. Um gezielt Interfaces anzusprechen existieren die iptables Optionen -i (incoming) und -o (outgoing). Erweitern wir nun unsere Regeln zu den Protokollen um die Interfaces.

iptables -A OUTPUT -p tcp -o eth0 -j ACCEPT
iptables -A INPUT -p udp -i eth0 -j DROP

2.3 iptables Ports

Eine der wichtigsten Optionen sind mit Sicherheit die Optionen für die Angabe der Ports. In der Regel möchten wir bestimmte Ports öffnen, um über diese Dienste anbieten zu können oder auch bestimmte Dienste zu verbieten. Wir haben bereits im 1. Teil der Reihe den Port für den SSH Dienst freigegeben. Nun wollen wir den Port 80 für einen Webserver in unser Beispiel mit aufnehmen. Wir erweitern also unsere bisherigen Regeln um Ports.

iptables -A INPUT -p tcp -i eth0 --dstport 80 -j ACCEPT

Wollen wir mehrere Ports angeben, z.B. um den HTTP und HTTPS Port zu öffnen, so nutzen wir die Option -m multiports in Kombination mit --dstports, nicht --dstport.

iptables -A INPUT -p tcp -i eth0 -m multiport --dstports 80,443 -j ACCEPT

2.2 iptables Verbindungszustände

Als letztes wollen wir über Verbindungszustände sprechen. An dieser Stelle seien nur die geläufigsten genannt.

  • NEW
  • ESTABLISHED
  • RELATED

Die Nutzung der Verbindungszustände kann uns das Leben erleichtern. Erinnern wir uns an die Regel zur Freigabe des SSH Ports bei ansonsten geschossenen Ports für die Ketten INPUT und OUTPUT.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Stattdessen können wir auch folgende Regeln verwenden.

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

Wir lassen bestehende und neue SSH Verbindungen (Port 22) durch die Firewall für eingehende Pakete zu und zusätzlich generell alle ausgehenden Pakete von bestehenden Verbindungen. Wir beziehen uns also bei den ausgehenden Verbindungen nicht mehr direkt auf den Port 22, sondern lassen diese generell zu. Dies ist von Vorteil, da wir das nur einmal machen müssen. Würden wir nun zusätzlich die Ports 80 und 443 öffnen, so würden wir die zweite Regel nur einmal hinter den anderen Regeln (Hierarchie) benötigen und hätten uns somit die einzelnen OUTPUT Regeln für die Ports gespart. Außerdem müssen wir nicht mehr jedes mal daran denken die Ports in der OUTPUT Kette zu öffnen. Dies ist in der Regel auch kein Sicherheitsrisiko, da die Regel ja nur greift, wenn wir bereits in der INPUT Kette einen Port für einen Dienst geöffnet haben.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.