Letztes Update am 16.11.2021
Erstellt am 28.08.2019
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.
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:
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:
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
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.
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.
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 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:
Weitere Option sind direkt auf der Dokumentationsseite von iptables zu finden.
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
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
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.