IP-Tables Skripte fuer Single Host, SMB-Server und Router

Aus Linupedia.org
Version vom 19. Mai 2007, 06:41 Uhr von Yehudi (Diskussion | Beiträge) (von IP-Netzwerke_und_Internetzugang hier eingefügt)
Wechseln zu: Navigation, Suche

Der Paketfilter iptables ist ein sehr komplexer Paketfilter der viele Möglichkeiten bietet. Ein Paketfilter wie iptables arbeitet grundsätzlich auf der 3. und 4. OSI-Schicht, die auch als Vermittlunsschicht (auch Netzwerkschicht, englisch network layer) und der Transportschicht (eng. transport layer) arbeitet.

Was kann man mit diesen Informationen anfangen? Nun zum einen muss man wissen, dass der gesamte Internetverkehr wie wir ihn kennen über Datenpakete organisiert wird. Ein solches Datenpaket ist einfach ein Folge von Bits die hintereinander gesendet werden und bevor die eigentlichen Daten folgen Steuerindormationen in einem Header besitzt. Auf Grund der Komplexität der im Internet eingestzten Technologien werden dabei diese Datenpakete ineinander geschachtelt wie die russischen Matruschkas, die ineinander verschachtelten Puppen. Das bedeutet einfach das in einem Datenpaket das man empfängt Datenpakete ineinander verschachtelt liegen, in einem typischen Fall sind das von außen nach innen Ethernet-Frame, IP-Datagramm, TCP-Segment, HTTP-Request. Der Paketfilter untersucht also ein IP-Datagramm (oder auch ein ICMP-Datagramm) und das dazugehörige UDP-Datagramme oder TCP-Segment in denen Informationen wie Ziel- und Quell IP-Adresse, die Portnummern und der Zustand einer TCP-Verbindung.

Die Portnummer sagen einem Rechner an welchen lauschenden Dienst er ein TCP-Segment schicken soll, so bedeutet beispielsweise der Port 80 dass eine Anfrage an einen Webserver gestellt wurde. Bevor wir uns aber genau anschauen wie IP-Tables arbeitet müssen wir uns noch den Drei-Wege Handshake betrachten. Wirr wollen dabei nicht zu sehr in die technischen Einzelheiten gehen, das kann man sich in entsprechenden Wickepediaartikeln selbst durchlesen, wichtig ist, das zunöchst eine Anfrage für einen Verbindungsaufbau erfolgt, das entsprechende Bit im TCP-Header ist das syn Bit. Wenn der anderer Rechner diesen Port freigeschaltet hat und ein Dienst an ihm horcht dann sendet dieser Rechner ein TCP-Segment mit einer Bestätigung zurück das sogenannte ack-Bit ist gesetzt (ack=Acknowledgement=Bestätigung). Emfängt der erste Rechner diese Bestätigung beginnt er mit der Übertragung. Das ist ganze ist noch etwas komplexer aber für unsere Zwecke reichen diese Informationen.

Man erkennt, dass für einen Dienst wie http also der Transport in zwei Richtungen notwendig ist. Von einem Client zu einem Server und vom Server zurpck zum Client. In den IP-Headern stehen Quell- und Zieladresse in den UDP- bzw. TCP-Headern die Portnummern und zwar auch 2. Die eine, die Zielportnummer ist meist eine sogenannte well-known Nummer die einen konkreten Dienst wie http, pop3 oder smtp anspricht. Die andere ist mit einem konkreten Prozeß auf dem Client verbunden, zum Beispiel einen Webbrowser.

Es gehören also 4 relevante Informationen zu einem Paket, die Rechner und Prozess adressieren, die Quell-IP, die Ziel-IP, die Quellportnummer und die Zielportnummer. Dabei sind diese Informationen davon abhängig ob das Paket vom Client zum Server oder vom Server zum Client geschickt wird. Betrachten wir das in einem Beispiel. Ein Webbrowser verbindet sich mit einem Webserver um eine Website abzurufen. In dem Paket vom Client mit dem Webbrowser ist die Quell-IP die IP des Client, die Ziel-IP die des Webservers (DNS löst dabei die URL in eine IP auf), die Quell-Portnummer irgendeine Nummer zwischen 1023 und 65525, zum Beispiel 15222 und die Zielportnummer 80. Umgekehrt enthalten dann die Pakete vom Webserver zum Browser als Quell-IP die IP des Webservers, als Ziel-IP die des Webbrowsers, als Quellport den Port 80 und als Zielportnummer in unserem Fall die 15222. Zusätzlich enthält der TCP-Header den Status der Verbindung, ist es eine Anfrage, eine Bestätigung oder ein normales Paket das zu einer aufgebauten Verbindung gehört.

Mit diesen Kerninformationen arbeitet der Paketfilter iptables. Durch Regeln (rules) kann der Anwender definieren welche Pakete durchgelassen werden. Wie man diese Regeln erstellt, das schreibt iptables nicht vor, es bietet einfach eine Reihe von Möglichkeiten an. Dabei gibt es verschiedene Strategien, die nebeneinander existieren. Der Vorläufer von iptables, das ipchain untersuchte nur die IP-Adressen und Portnummern. Man musste also stets in beiden Richtungen sperren, um in inserem Beispiel zu bleiben, sowohl die Pakete vom Client zum Server als auch visa verce.

Mit iptables lassen sich aber auch die Zustände von Verbindungen betrachten. Durch die gesetzten Bits kann man nämlich Neuanfragen von Paketen die zu bestehenden Verbindungen gehören unterscheiden. Diese Fähigkeit wird als stateful inspection (Betrachtung des Zustandes) bezeichnet. Dadurch ist es möglich alle rückwärtigen Pakete, die also zu bestehenden Verbindungen gehören zu erlauben und den Paketfilter so zu betreiben, indem man sich auf die Pakete konzentriert, die einen Verbindungsaufbau initieren. Dieser einfachen Strategie steht auch eine komplexere Strategie gegenüber die auch die zu einer bestehenden Verbindung gehörenden Pakete nicht generell sondern gezielt erlaubt. Diese etwas sichere aber aufwendige Strategie erwartet pro Dienst zwei Regelsätze, die einfache Strategie ein Regelsatz.

Wir betrachten zunächst das einfache Konzept am Bespiel von http. Irgendwo müssen wir die zu bestehenden Verbindungen gehörende Pakete erlauben


$IPTABLES -A FORWARD -d $LOCAL_NET -p tcp state --state ESTABLISHED,RELATED -j ACCEPT 

Hier steht also: Erlaube (-j accept) alle Paketen den Transport, die über diese Firewall laufen (FORWARD) und ins lokale Netz wollen (-s $LOCAL_NET) und zu bestehenden Verbindungen gehören (--state STABLISHED,RELATED)


Die rückwärtigen Verbindungen alleine erlauben jedoch noch keine Verbindung. Jetzt muss auch noch der Verbindungsaufbau und die Verbindungen vom Client zum Server zugelassen werden:

$IPTABLES -A FORWARD -s $LOCAL_NET -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 

Hier steht also: Erlaube (-j Accept) alle Pakete den Transport, die aus dem lokalen Netz stammen (-s $LOCAL_NET) die einem neuen Verbundungsaufbau einleiten oder zu einer Verbindung gehören ( --state NEW,ESTABLISHED,RELATED) und einen Webserver kontaktieren (--dport http ) und deren Quellportnummern über 1024 liegen ( --sport $PORTS_HIGH).

Dagegen sieht die doppelte Strategie so aus, wobei natürlich klar ist das zu jedem erlaubten Port zwei Regeln notwendig sind:

Verbindungen vom Client zum Server:

$IPTABLES -A FORWARD -s $LOCAL_NET -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Verbindungen vom Server zum Client:

$IPTABLES -A FORWARD -d $LOCAL_NET -p tcp --dport $PORTS_HIGH --sport http -m state --state ESTABLISHED,RELATED -j ACCEPT


In der zweiten Regel werden also explizit nur die Pakete erlaubt die zu bestehenden http Verbindungen gehören, während bei der ersten Methode alle zu bestehenden Verbindungen gehörende Pakete erlaubt sind.

Für heute mache ich Schluss, den Rest erläutere ich später.



TCP/IP-Netzwerke und Internetzugang