IPTables - from scratch
Die Verwendung von Firewalls mit iptables
Der Linux-Kernel enthält fortgeschrittene Tools für Packet-Filtering, der Prozess für die Kontrolle von Netzwerkpaketen bei ihrem Versuch einzudringen, durch und aus dem System hinaus zu dringen. Kernels vor der 2.4 Version konnten Pakete mit ipchains manipulieren, die Listen von Regeln verwendeten, die für Pakete in jeder Phase des Filterungsprozesses angewandt werden. Die Einführung des 2.4-Kernels hat iptables mit sich gebracht, die den ipchains gleichen, aber deren Wirkungsbereich und Kontrollmöglichkeiten bei der Filterung von Paketen erweitern.
iptables
Iptables beinhaltet das englische Wort tables, was für Tabellen steht, und genauso kann man es sich auch vorstellen, denn in seinen 3 Tabellen: Filter, NAT und mangle die jeweils maßgebend für eine Aktion auf ein Paket sind, sammeln sich die Ketten in denen Regeln zum Kontrollieren, Manipulieren oder Extrahieren von Paketen angegeben werden.
Somit funktioniert es wie eine Art Sammlung von Schablonen die nacheinander auf ein Paket abgebildet werden und bei einem Treffer eine bestimmte Aktion auf das Paket ausführen. Falls keine der Schablonen passen sollte wird eine Standard Aktion ausgeführt die für alle Pakete gilt die nicht auf eine Schablone passen.
Die Momentan gesetzten Regeln kann man sich mit
root@hutze:~# iptables -L
ausgeben lassen, wobei man die Ausgabe noch mit den Operanden
-n # für numerical -v # für verbose
erweitern kann.
Wenn alle Regeln leer sind sollte das so aussehen:
root@hutze:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Die Tabellen und Regeln von iptables könnte man theoretisch auch alle einzeln nacheinander in der Konsole eingeben was aber nicht ganz Sinn der Sache ist. Also bedienen wir uns für unsere Firewall einem simplen Bash-Skript.
Syntax
Wie schon zu erwarten bedient man iptables mit dem Befehl "iptables". Folgende Dinge sind dabei zu beachten:
Die 3 Tabellen von iptables spricht man jeweils mit
iptables -t filter iptables -t nat iptables -t mangle
an.
Dabei ist es wichtig zu bemerken das jede iptables zeile ohne "-t" option von einem "-t filter" ausgeht. Was bedeutet das es in die Filter Tabelle geschrieben wird. Um in die anderen Tabellen zu schreiben braucht man "-t nat" und "-t mangle"
Positionierung der Firewall
Eine Firewall kann man unter Linux ganz einfach mit einem vi-Dokument beginnen. Damit die daraus entstehende Firewall auch ausgeführt wird müssen wir es in den entsprechenden Verzeichnissen vermerken. Das Skript selbst sollte nach /etc/init.d/ mit einem softlink mit dem prefix "S99" in /etc/rc2.d damit es beim Starten automatisch ausgeführt wird.
root@hutze:~# touch firewall root@hutze:~# mv firewall /etc/init.d root@hutze:~# ln -s /etc/init.d/firewall /etc/rc2.d/S99firewall
Der Rumpf
Zuerst wird in dem firewall-Skript ein case start - stop Block angelegt:
#!/bin/bash case $1 in start) echo "starte firewall" ;; stop) echo "stoppe firewall" ;; *) echo "usage: $0 start|stop|restart" ;; esac
"flushing" und "default policy"
Bevor wir unsere eigenen Regeln entwerfen sollten wir sichergehen das sich keine alten Regeln einschleichen und zu unerwarteten Komplikationen führen. Dieses wird durch das sogenannte "flushing" erreicht, welches mit folgender Zeile geschieht:
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F ;; stop) echo "stoppe firewall" iptables -F ;; *) echo "usage: $0 start|stop|restart" ;; esac
Ohne flushing kann es auch passieren das sich unsere Regeln bei jedem Neustart der Firewall addieren.
Als nächst
Syntax Erläuterung
Vorab ist es wichtig zu bemerken das jede iptables zeile ohne andere "-t" option von einem "-t filter" ausgeht. Was bedeutet das es in die Filter Tabelle geschrieben wird. Um in die anderen Tabellen benutzt man "-t nat" und "-t mangle"