Pa­ket­fil­te­rung ist eine ent­schei­den­de Kom­po­nen­te des Si­cher­heits­kon­zepts aller Com­pu­ter­sys­te­me, die sich in einem Netzwerk befinden. Die Kontrolle und Ver­wal­tung des ein- und aus­ge­hen­den Da­ten­ver­kehrs – häufig als Be­stand­teil einer Firewall – soll si­cher­stel­len, dass nur solche Da­ten­pa­ke­te empfangen oder versendet werden, die frei von Malware und Spam sind. Im Linux-Kernel ist stan­dard­mä­ßig ein solcher Pa­ket­fil­ter in­te­griert, der durch Module des Software-Pakets Netfilter be­reit­ge­stellt wird. Al­ler­dings ist ein zu­sätz­li­ches Programm notwendig, um diesen zu kon­fi­gu­rie­ren. Für die Linux-Kernel 2.4 und 2.6 benötigen Sie die freie Software iptables, die ebenfalls vom Netfilter-Projekt-Team ent­wi­ckelt wurde.

Als Ad­mi­nis­tra­tor verwenden Sie iptables, um Regeln auf­zu­stel­len, zu verändern oder zu löschen, wobei die Ein­stel­lun­gen al­ler­dings beim Sys­tem­neu­start verloren gehen. Mithilfe der zu iptables ge­hö­ren­den Tools iptables-save und iptables-restore können Sie angelegte Re­gel­wer­ke speichern und wie­der­her­stel­len. Mit einem so­ge­nann­ten Init-Script gelingt dies sogar ganz au­to­ma­tisch im Laufe des Boot­pro­zes­ses. iptables ist auf das Protokoll IPv4 be­schränkt, für die weiteren Pro­to­kol­le gibt es ent­spre­chen­de Varianten wie ip6tables für IPv6 oder ebtables für Ethernet-Pakete, die ebenfalls im Kernel-Modul enthalten sind.

Im folgenden iptables-Tutorial stellen wir Ihnen die Ba­sis­funk­tio­nen und -optionen der Pa­ket­fil­ter-Software vor. An­schlie­ßend erklären wir auch die Kon­fi­gu­ra­ti­on der Tabellen anhand ver­schie­de­ner Beispiele.

So funk­tio­niert iptables

Unter Linux ist iptables für ge­wöhn­lich bereits vor­in­stal­liert. Wenn dies nicht der Fall ist oder Sie si­cher­ge­hen wollen, dass Sie die aktuelle Software-Version verwenden, können Sie zum Updaten bzw. In­stal­lie­ren auch den Weg über den je­wei­li­gen Paket-Manager Ihrer Dis­tri­bu­ti­on wählen. Geben Sie dazu einfach den folgenden Befehl ins Terminal ein:

sudo apt-get install iptables

Es gibt ver­schie­de­ne grafische Ober­flä­chen für iptables, z. B. Webmin, wobei die Bedienung des Programms über die Kom­man­do­zei­le relativ un­kom­pli­ziert und schnell zu erlernen ist.

iptables setzt er­wei­ter­te Sys­tem­pri­vi­le­gi­en voraus und kann daher nur als Root oder mit ent­spre­chen­den Ad­mi­nis­tra­tor-Rechten aus­ge­führt werden. Die mit dem Programm geladenen und zuvor vom Kernel erzeugten Tabellen (tables) enthalten Ketten (chains) von Regeln (rules), die aussagen, wie ein­ge­hen­de und ver­schick­te Da­ten­pa­ke­te behandelt werden sollen. Diese Pakete werden innerhalb einer Kette von Regel zu Regel wei­ter­ge­reicht, wobei jede Regel eine Aktion her­vor­ru­fen (jump target) oder einen Wechsel in eine andere Kette bewirken (goto chain) kann.

Aktionen, die eintreten, wenn eine Regel auf das jeweilige Da­ten­pa­ket zutrifft, können folgende sein:

  • ACCEPT: Das Paket wird an­ge­nom­men.
  • DROP: Das Paket wird verworfen.
  • QUEUE: Ver­schiebt das Paket in die Be­nut­zer­pro­zes­se; setzt einen Ver­mitt­ler (queue handler) voraus, der die Pakete an eine Anwendung wei­ter­lei­tet.
  • RETURN: Das Paket wird in die vor­an­ge­gan­ge­ne Kette zu­rück­ge­schickt, wenn es sich um eine be­nut­zer­de­fi­nier­te Kette handelt. In Stan­dard­ket­ten wird die Richt­li­nie (policy) der Kette aus­ge­führt (ohne Kon­fi­gu­ra­ti­on stan­dard­mä­ßig: ACCEPT).

Die bei der RETURN-Aktion erwähnten Stan­dard­ket­ten sind in der iptables-Fil­ter­ta­bel­le vor­ge­ge­ben. Es handelt sich um die drei Ketten INPUT, FORWARD und OUTPUT. Erstere behandelt Pakete, die dem System zu­ge­stellt werden sollen, während die zweite an­kom­men­de Da­ten­pa­ke­te be­ar­bei­tet, die für die Wei­ter­lei­tung bestimmt sind. Die OUTPUT-Kette hingegen kon­trol­liert den Da­ten­ver­kehr, der vom eigenen Computer erzeugt wird. Neben der Fil­ter­ta­bel­le exis­tie­ren im Übrigen eine NAT-Tabelle zur Über­set­zung der Netz­werk­adres­sen sowie eine MANGLE-Tabelle zur Pa­ket­ma­ni­pu­la­ti­on. Eine de­tail­lier­te Übersicht über die Funk­ti­ons­wei­se der Pa­ket­fil­ter-Software bietet die Man-Page, die Sie jederzeit mit dem Kommando

man iptables

aufrufen können. Al­ter­na­tiv finden Sie auf netfilter.org zahl­rei­che iptables-How-tos in diversen Sprachen.

An dieser Stelle des iptables-Tutorials gehen wir auf die Fil­ter­ta­bel­le und deren Regelwerk ein. Die un­ten­ste­hen­de Tabelle enthält die einzelnen Befehle zum Erstellen und Verwalten von Ketten. Zur Re­gu­lie­rung des Da­ten­ver­kehrs können Sie entweder eine eigene Kette erstellen oder auf die drei Stan­dard­ket­ten INPUT, OUTPUT und FORWARD zu­rück­grei­fen. Das sind die wich­tigs­ten Kon­fi­gu­ra­ti­ons­op­tio­nen:

iptables-CommandsBeispielErklärung
-N "Name der Kette"sudo iptables -N testErstellt eine neue Kette mit dem Namen "test".
-X "Name der Kette"sudo iptables -X testLöscht die leere Kette mit dem Namen "test"; funk­tio­niert nicht mit den Stan­dard­ket­ten INPUT, OUTPUT und FORWARD.
-L "Name der Kette"sudo iptables -L testListet die Regeln der Kette mit dem Namen "test" auf.
-F "Name der Kette"sudo iptables -F testLöscht alle Regeln der Kette mit dem Namen "test".
-P "Name der Kette" "Aktion"sudo iptables -P INPUT ACCEPTLegt die Policy für die Kette fest. Im Beispiel wird das Paket au­to­ma­tisch an­ge­nom­men, wenn die Fil­ter­re­geln der Kette INPUT nicht greifen.
-A "Name der Kette" "Regel"sudo iptables -A test -s 127.0.0.1 -j DROPHängt eine neue Regel an die aus­ge­wähl­te Kette an. Im Beispiel wird die Regel, Da­ten­pa­ke­te von der IP-Adresse 127.0.0.1 zu verwerfen, der Kette "test" hin­zu­ge­fügt.
-D "Name der Kette" "Regel"sudo iptables -D test -s 127.0.0.1 -j DROPLöscht die an­ge­ge­be­ne Regel der aus­ge­wähl­ten Kette.
-I "Name der Kette" "Position" "Regel"sudo iptables -I test 1 -s 127.0.0.1 -j DROPFügt die neue Regel an die aus­ge­wähl­te Position der Kette ein; im Beispiel an Position 1.
-D "Name der Kette" "Position"sudo iptables -D test 1Löscht die Regel der aus­ge­wähl­ten Kette unter Angabe der Position dieser Regel; im Beispiel ebenfalls an Position 1.

Wie iptables mit Fil­ter­re­geln zum Sys­tem­schutz beiträgt

Nun zeigen wir Ihnen die Mög­lich­kei­ten von iptables bei­spiel­haft anhand der Ein­rich­tung einer ru­di­men­tä­ren Firewall. Da die drei Stan­dard­ket­ten INPUT, OUTPUT und FORWARD je nach Dis­tri­bu­ti­on schon vor­de­fi­nier­te Regeln aufweisen, gilt es zunächst, diese zu löschen:

sudo iptables -F

Im zweiten Schritt fügen Sie für jede der drei Ketten die DROP-Policy hinzu, um si­cher­zu­stel­len, dass Da­ten­pa­ke­te in jedem Fall blockiert werden, insofern keine der auf­ge­stell­ten Fil­ter­re­geln zu einem positiven Ergebnis führt:

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP

Als nächstes schalten Sie das eigene System, den localhost (lo), für den ein­ge­hen­den (-i) und aus­ge­hen­den (-o) Da­ten­ver­kehr frei (ACCEPT), indem Sie sowohl die INPUT- als auch die OUTPUT-Kette durch die ent­spre­chen­de Regel erweitern (-A):

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

An­schlie­ßend geben Sie die Freigabe für aus­ge­hen­de HTTP- und HTTPS-Ver­bin­dun­gen (Port 80 und Port 443) für die gängigen TCP-Ports 1024 bis 65535:

sudo iptables -A OUTPUT -o eth0 -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 --sport 1024:65535 -j ACCEPT

Im letzten Schritt lassen Sie alle ein­ge­hen­den und aus­ge­hen­den Da­ten­pa­ke­te zu, die zu einer bereits be­stehen­den Ver­bin­dung gehören (--state ES­TAB­LISHED) oder sich auf eine bereits be­stehen­de Ver­bin­dung beziehen (--state RELATED):

sudo iptables -A INPUT -i eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT

Da das mit iptables erstellte Regelwerk flüchtig ist und nur bis zum Aus­schal­ten des Computers erhalten bleibt, sollten Sie Ihre Ein­stel­lun­gen mithilfe von iptables-save in der .rules-Datei im je­wei­li­gen iptables-Ver­zeich­nis sichern. Der passende Befehl lautet z. B. für Ubuntu-Systeme:

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

Mit der Eingabe des Befehls

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

laden Sie diese Datei nun manuell nach jedem Neustart Ihres Systems. Al­ter­na­tiv können Sie ein ent­spre­chen­des Skript erstellen, damit die Pa­ket­fil­ter-Anwendung au­to­ma­tisch aus­ge­führt wird.

Für weitere In­for­ma­tio­nen zu Netz­werk­fil­tern und iptables empfehlen wir Ihnen einen Blick in das iptables-Tutorial „Linux-Pra­xis­buch: Linux Firewall mit IP-Tables“ in der freien Wikibooks-Bi­blio­thek.

Zum Hauptmenü