Wie funktioniert iptables? so geht’s
iptables ist ein Userspace-Programm für die Linux-Kernel Firewall. Es dient zur Bearbeitung der Paketfilter und der Konfiguration der Linux Firewall, diese den Datenverkehr von und zum Server überwacht, mithilfe von Tabellen. Die Tabellen enthalten Regelsätze, Ketten genannt, die eingehende und ausgehende Datenpakete filtern.
Wenn ein Paket mit einer Regel übereinstimmt, wird es einem Ziel zugewiesen, das eine andere Kette oder einer dieser Werte sein kann:
- ACCEPT – lässt das Paket passieren.
- DROP – lässt das Paket nicht passieren.
- RETURN – hindert das Paket daran, eine Kette zu durchlaufen, und weist es an, zur vorherigen Kette zurückzukehren.
In diesem Tutorial wird mit einer der Standardtabellen namens filter gearbeitet, bestehend aus drei Ketten:
- INPUT – steuert eingehende Pakete zum Server.
- FORWARD – filtert eingehende Pakete, die weitergeleitet werden.
- OUTPUT – Filtern der Pakete, die vom Server ausgehen.
iptables kann mit der Linux Uncomplicated Firewall (ufw), sowie mit firewalld genutzt werden. iptables-Regeln gelten nur für ipv4. Wird die Firewall für das IPv6-Protokoll genutzt, muss stattdessen ip6tables verwendet werden.
iptables Installation
Ein SSH-Terminal zum Server mit Root Zugriff herstellen, oder mit sudo Berechtigung root werden, mit sudo su -
bei Ubuntu/Debian Linux.
iptables ist bei den meisten Linux-Distributionen vorinstalliert. Wenn es jedoch standardmäßig nicht vorliegt, sind bei einem Ubuntu/Debian-System folgende Schritte auszuführen.
$ sudo apt-get update
$ sudo apt-get install iptables
Überprüfe den Status der aktuellen iptables-Konfiguration, mit ausführen des nächsten Kommandos.
$ iptables -vnL
Hier wird die Option –L verwendet, um alle Regeln aufzulisten, die numerische Ausgabe von Adressen und Ports mit -n, und -v dient zum Anzeigen in einem detaillierteren Format. Wie bei dieser Beispielausgabe.
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
An diesem Punkt wird man feststellen, dass alle Ketten (Chain) auf ACCEPT gesetzt sind und keine Regeln definiert sind. Das System ist also nicht geschützt, da jedes Paket ohne Filterung durchkommt.
Keine Sorge! wie Regeln definiert werden, ist im nächsten Schritt dieses iptables-Tutorials zu erfahren.
Kettenregeln definieren
Eine Regel zu definieren bedeutet, sie an die Kette anzuhängen. Dazu muss die Option -A (Append) direkt nach dem Befehl iptables eingefügt werden.
iptables wird angewiesen eine neue Regel in die Kette einzufügen. Es können Optionen kombiniert angewendet werden.
iptables Option | Beschreibung |
---|---|
-i | (interface) Die Netzwerkschnittstelle deren Datenverkehr man filtern möchte, zB. eth0, lo, ppp0 u.a.m. |
-p | (Protokoll) Das Netzwerkprotokoll in dem der Filterprozess stattfindet. Zulässig sind die Protokolle tcp, udp, udplite, icmp, sctp, icmpv6. Alternativ all für jedes Protokoll. |
-s | (Quelle) Die Adresse von der der Datenverkehr kommt. Hostnamen oder IP-Adressen verwenden. |
–dport | (Zielport) Die Zielportnummer eines Protokolls, zum Beispiel: 22 (SSH), 443 (HTTPS) u.a.m. |
-j | (target) Der Zielname (ACCEPT / DROP / RETURN), bei jeder Regel immer am Ende anfügen. |
Der iptable Befehl mit den Optionen setzt sich in dieser Reihenfolge wie folgt zusammen.
$ sudo iptables -A <Kette> -i <Schnittstelle> -p <Protokoll (tcp/udp) > -s <Quelle> --dport <Port-Nr.> -j <Ziel>
Sobald man mit der grundlegenden Syntax vertraut ist, kann man mit der Konfiguration der Firewall beginnen, um dem Server mehr Sicherheit zu verleihen. Hier verwenden wir die INPUT Kette im Beispiel.
Traffic auf Localhost akzeptieren
Für die meisten Anforderungen wird der localhost nicht eingeschränkt. Den Befehl ausführen um den Datenverkehr auf localhost zu erlauben.
$ sudo iptables -A INPUT -i lo -j ACCEPT
Die lo- oder Loopback-Schnittstelle wird für die gesamte Kommunikation auf dem localhost verwendet. Der obige Befehl stellt sicher, dass die Verbindungen zwischen einer Datenbank und einer Webanwendung auf demselben System ordnungsgemäß funktionieren.
Verbindungen auf HTTP, SSH, SSL Port akzeptieren
Als Nächstes möchten wir, dass die Verbindungen zu den Services HTTP (Port 80), HTTPS (Port 443) und SSH (Port 22) wie gewohnt funktionieren. Dazu müssen wir das Protokoll (-p) und den entsprechenden Port (–dport) übergeben. Die Befehle nacheinander ausführen.
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Es ist nun Zeit zu überprüfen, ob die Regeln in iptables angehängt sind.
$ iptables -vnL
Die Anzeige der Regeln mit der Option List in etwa wie diese.
Chain INPUT (1 references)
pkts bytes target prot opt in out source destination
2798K 156M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
114K 5508K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW
65438 2804K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 ctstate NEW
Pakete von Quellen Filtern
Mit iptables können Pakete basierend auf einer IP-Adresse oder einem Bereich von IP-Adressen gefiltert werden. Hierzu muss man die Option -s angeben. Um beispielsweise Pakete von 192.168.2.4 zu akzeptieren, lautet der Befehl.
$ sudo iptables -A INPUT -s 192.168.2.4 -j ACCEPT
Es können auch Pakete von einer bestimmten IP-Adresse abgelehnt werden, indem man das Ziel ACCEPT durch DROP ersetzen.
$ sudo iptables -A INPUT -s 192.168.2.4 -j DROP
Sollen Pakete von einer Reihe von IP-Adressen verworfen werden, muss man die Option -m und das Modul iprange verwenden. Hierbei gibt man den IP-Adressbereich mit –src-range an. Daran denken, dass ein Bindestrich den Bereich der IP-Adressen ohne Leerzeichen trennen sollte, hier wie folgt.
$ sudo iptables -A INPUT -m iprange --src-range 192.168.8.80-192.168.8.90 -j DROP
Verwerfen der gesamten sonstigen Traffic
Es ist wichtig, DROP als Ziel für den gesamten restlichen Datenverkehr zu verwenden, nachdem die –dport Regeln definiert wurden. Dadurch wird verhindert, dass nicht autorisierte Verbindungen über andere offene Ports auf den Server zugreifen. Hierzu einfach Folgendes eingeben.
$ sudo iptables -A INPUT -j DROP
Jetzt werden die Verbindung nachfolgend der Filter abgelehnt.
iptables Regeln löschen
Möchte man alle Regeln entfernen und sauber beginnen, kann die Option -F (Flush) verwendet werden.
$ sudo iptables -F
Dieser Befehl löscht alle aktuellen Regeln. Um jedoch eine bestimmte Regel zu löschen, dient die Option -D. Hierbei werden zuerst alle verfügbaren Regeln anzgezeigt, wie folgender Befehl zeigt.
$ sudo iptables -nL --line-numbers
Es wird eine Liste von Regeln mit Nummern ausgegeben.
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 192.168.8.8 anywhere
2 ACCEPT tcp -- anywhere anywhere tcp dpt:https
3 ACCEPT tcp -- anywhere anywhere tcp dpt:http
4 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Um eine Regel zu löschen, füge die entsprechende Kette mit der Nummer aus der Liste ein. Nehmen wir an, wir wollen für dieses Beispiel die Regel Nummer eins (1) der INPUT Kette löschen. Der Befehl dazu wie folgt.
$ sudo iptables -D INPUT 1
Fazit
iptables ist ein leistungsstarkes Userspace-Utility für die Linux Firewall, um Linux-Server abzusichern. Ein Vorteil ist, dass sich verschiedene Regeln basierend auf eigenen Präferenzen definieren lassen.
In diesem iptables-Tutorial lernt man, wie das Tool installiert und verwendet wird. Wir hoffen, dass hierdurch eigene Regelsätze verwaltet werden können, um eingehende und ausgehende Pakete zu filtern.