iptables - Grundlagen und Beispiele

von Thomas english version


Letztes Update am 16.11.2021

Erstellt am 28.08.2019


Firewall

Server mit der Software-Firewall absichern

Eine Firewall wird zum Schutz von Servern oder Clients verwendet. Sie stellt sicher, dass Unbefugte keinen Zugriff auf gewisse Dienste bekommen können. Ports ohne Dienst dahinter können komplett abgeschottet werden. In diesem Tutorial wirst du lernen, wie du iptables anwendest und das Grundprinzip dahinter verstehen.

iptables Grundlagen

Ist iptables aktiviert, werden alle ankommende, ausgehende und weitergeleitete IP-Pakete von dem Linux-Kernel überwacht. Iptables ist in sogenannte Tables und Chains organisiert. Jeder Table kann ein oder mehrere Chains beinhalten. Chains sind nichts anderes als die Verkettung von Regeln, welche mit jedem IP-Paket abgearbeitet werden. Der Kernel kann dabei entsprechende Aktionen mit einem IP-Paket durchführen. Die vier Hauptaktionen sind dabei folgende:

  • ACCEPT – Das IP-Paket wird akzeptiert und entsprechend weiterverarbeitet.
  • DROP – Das IP-Paket wird nicht akzeptiert und verworfen.
  • REJECT – Das IP-Paket wird nicht akzeptiert und verworfen. Der Sender bekommt jedoch eine Nachricht über den Vorgang, dass das Paket nicht akzeptiert wird.
  • RETURN – Stimmt ein Paket mit diesem Filter überein, wird die default Regel der Hauptkette ausgeführt.

In diesem Tutorial werden wir uns auf die Grundlagen des Haupttables filter beschränken. Weitere Beispiele an Tables wären nat, mangle und raw. Der Table filter hat drei Chains:

  • INPUT – Eingehende Pakete können in dieser Chain gesteuert werden.
  • OUTPUT – Ausgehende Pakete werden in dieser Chain gesteuert.
  • FORWARD – Eingehende Pakete, welche für ein anderes Ziel bestimmt sind, können mit dieser Chain gesteuert werden.
iptables tutorial - table filter

Iptables installieren

Bei den meisten Linux Distributionen ist iptables vorinstalliert. Beachte, dass CentOS mit der Firewall firewallD kommt. Die muss zunächst deinstalliert werden, falls iptables verwendet werden soll.

apt-get update
apt-get install iptables

Den aktuellen iptables Status abrufen

Die Aktuellen Tables und Chains lassen sich mit folgendem Kommando anzeigen:

iptables -L -v

Die Ausgabe des oben genannten Befehls auf einem Server ohne aktuelle Regeln:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Alle drei Chains haben die default policy ACCEPT. Die default Regel steht immer direkt neben dem Chain-Namen und wird ausgeführt wenn keine Regel in der Chain zutrifft.

Regeln mit iptables erstellen

Der Standardbefehl sieht folgendermaßen aus:

iptables -A <chain> -i <interface> -p <protocol (tcp/udp) > -s <source> --dport <port no>  -j <target>

Wobei das -A für append steht und einen Chain-Namen erfordert. Die Regel wird immer an eine Chain angehängt. Das Interface ist optional und beschreibt die NIC, auf die die Regel zutreffen soll. Das Protokoll ist das Netzwerkprotokoll, welches gefiltert werden soll. Hier können weitaus mehr als tcp/udp gefiltert werden. Source beschreibt die Absender-IP des IP-Pakets. Mit der Option --dport kann der eingehende Port gefiltert werden. Zu guter Letzt wird die Aktion mit dem target übergeben.

Beispiel-Regel SSH und HTTP(s)

Wir wollen das Protokoll SSH und HTTP(s) auf den Ports 22, 80 und 443 von anfragenden Clients erlauben. Alle anderen Anfragen sollen per default geblockt werden.
Dazu geben wir zunächst die Ports frei und blocken anschließend den Rest:

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 -P INPUT DROP

Beispiel Output von dem Kommando iptables -L -v nach dem Ausführen der vier Befehle:

Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
 292 31342 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:https

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Etablierte Verbindungen zulassen

Etablierte Verbindungen sind Verbindungen von einem Server zu einem anderem Server oder Client, die von dem Gerät selber aufgebaut wurden. Da die Verbindung von uns etabliert wurde, vertraut der Computer dem eingehenden Traffic dieser Verbindung.

iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT

$WAN muss durch die Bezeichnung der NIC ersetzt werden.
Dabei kann mit der Option --state folgende, meist genutzte Möglichkeiten eingestellt werden:

  • NEW - Das Datenpaket ist dem Server neu, in der Regel durch eine neue Verbindung.
  • ESTABLISHED - Das Datenpaket ist beim Server bereits ein- und ausgegangen.
  • RELATED - Das Datenpaket hat eine neue Verbindung gestartet, ist aber in einer bestehenden Verbindung involviert, z. B. eine FTP-Datenübertragung oder ein ICMP-Fehler.

Weitere Option sind direkt auf der Dokumentationsseite von iptables zu finden.

Pakete anhand der Source-Adresse filtern

Wir wollen alle eingehende Verbindungen der IP 10.10.10.1 komplett sperren:

iptables -A INPUT -s 10.10.10.1 -j DROP

Beachte, hier kann auch mit Ranges gearbeitet werden:

iptables -A INPUT -m iprange --src-range 10.10.10.1-10.10.10.255 -j DROP

Regeln löschen

Alle Regeln können mit folgendem Befehl gelöscht werden:

iptables -F

Einzelne spezifische Regeln werden mit der Option -D gelöscht. Dabei muss zunächst die Nummer der Regel herausgefunden werden:

iptables -L --line-numbers

Anschließend kann eine spezielle Regel gelöscht werden:

iptables -D INPUT 3

Regeln persistent Speichern

Um Regeln persistent zu halten, muss ein extra Tool installiert werden. Iptables-persistent sorgt dafür, dass gespeicherte Regeln bei einem Neustart geladen werden.

apt-get install iptables-persistent

Die Regeln werden in folgenden Dateien gespeichert. Es wird zwischen IPv4 und IPv6 differenziert:

/etc/iptables/rules.v4
/etc/iptables/rules.v6

Um die aktuell geltenden Regeln zu speichern, muss folgender Befehl genutzt werden:

iptables-save > /etc/iptables/rules.v4
### oder
ip6tables-save > /etc/iptables/rules.v6

Bei einem Neustart werden somit die Regeln automatisch geladen.