IP-Tables Skripte fuer Single Host, SMB-Server und Router: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
Zeile 18: Zeile 18:
  
  
Man erkennt dass der Paketfilter iptables in sogenannten Chains (Ketten) aufgeteilt ist, PREROUTUNG, INPUT, OUTPUT, FORWARD und POSTROUTING. Diese Chains enthalten verschiedene Tables (Tabellen) die iptables ihren Namen geben. Nicht jede Kette enthält alle Tabellen.  
+
Man erkennt dass der Paketfilter iptables in sogenannten Chains (Ketten) aufgeteilt ist, Diese Chains sind in der Abbildiung schraffiert. Zu den Chans gehören: PREROUTUNG, INPUT, OUTPUT, FORWARD und POSTROUTING. Diese Chains enthalten verschiedene Tables (Tabellen) die iptables ihren Namen geben. Nicht jede Kette enthält dabei alle Tabellen. Die Table Mangle ist dafür zuständig Pakete zu markieren, die Table Filter dient dazu Pakete zu filtern, dass bedeutet abzulehnen (deny) oder zu akzeptieren (accept). Die Table Nat schreibt die Ziel oder Quelladressen (und/oder Ports) um, ist also für das Network Adress Translation, das Masquerading (verallgemeinertes Source-NAT: überschrieben privater Pakete mit der zugwiesenen Adresse ders Providers), das Portforwarding (Portumleitung, z. B bei transparenten Proxies) und das Destination NAT (umschreiben der Pakete aus dem Internet, die an einen Server im Netz gedacht sind). Da NAT entweder vor oder nach den eigentlichen Filter einen Sinn ergibt ist auch nur eine NAT Tabl in den Chains PREROUTUNG und POSTROUTING sinnvoll.
 +
Die INPUT Chain ist für Pakete gedacht, die als Ziel lokale Prozessen auf dem Firewallrechner ansteuern, das können zum Beispiel Pakete sein, die zu ssh Verbindungen oder zu DNS-Anfragen gehören. OUTPUT ist die Chain für Pakte deren Uraprung lokale Prozesse des Firewallrechner sind. Die FORWARD Chain ist im Grunde die wichtigste Chain, denn sie ist für die Weiterleitung der Pakete aus dem lokalen Netz ins Internet bzw. umgekeht zuständig.  
  
INPUT ist die Chain, von Paketen die als Ziel lokalen Prozessen auf dem Firewallrechner besitzen, das können zum Beispiel Pakete sein, die zu ssh Verbindungen oder zu DNS-Anfragen gehören. OUTPUT ist die Chain deren Urprung lokale Prozesse sind. Die FORWARD Chain ist die Chain die für die Weiterleitung der Pakete zuständig ist. Die verbleibenden Chains PREROUTING und POSTROUTING sind die verbleibenden Ketten die die beide eine Tabelle Nat enthalten.  
+
Durch Regeln (rules), die in ene Chain eingefügt, angehängt oder gelöscht werden, kann der Anwender definieren welche Pakete durchgelassen werden. Wie man diese Regeln erstellt, das schreibt iptables nicht vor. Der Filter Iptables ist also genaugenommen ein Werkzeug, mit dem sich ein Paketfilter einrichten lässt. Dabei gibt es ganz verschiedene Strategien.  
  
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.  
+
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.
  
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.
 
 
Wir betrachten zunächst das einfache Konzept am Bespiel von http. Irgendwo müssen wir die zu bestehenden Verbindungen gehörende Pakete erlauben
 
  
  
 
  <nowiki>$IPTABLES -A FORWARD -d $LOCAL_NET -p tcp state --state ESTABLISHED,RELATED -j ACCEPT</nowiki>  
 
  <nowiki>$IPTABLES -A FORWARD -d $LOCAL_NET -p tcp state --state ESTABLISHED,RELATED -j ACCEPT</nowiki>  
  
Hier steht also: Erlaube (<nowiki>-j accept</nowiki>) alle Paketen den Transport, die über diese Firewall laufen (<nowiki>FORWARD</nowiki>) und ins lokale Netz wollen (<nowiki>-s $LOCAL_NET</nowiki>) und zu bestehenden Verbindungen gehören (<nowiki>--state STABLISHED,RELATED</nowiki>)
+
Anhand dieser Regel lassen sich Gundprinzipien erläutern. Zunächst wird das Programm iptables hier nicht direkt, sondern über eine Variable ($IPTABLES) angesprochen. Damit lassen sich solche Skripte unabhöngig von dem genauen Location erstellen. Man kann dann am Anfang eines solchen Skriptes das Programm zuordnen (z.B: <nowiki>IPTABLES=/sbin/siptable</nowiki>s)und muss nicht alle Regeln korrigieren. Das -A bedeutet appand, also hänge diese Regel an den bestehenden Regelkatalog an und zwar in der Chain FORWARD. Die weiteren bestandteile der Regel lassen sich wie folgt beschreiben: Erlaube (<nowiki>-j accept</nowiki>) alle Paketen den Transport, die über diese Firewall laufen (<nowiki>FORWARD</nowiki>), ins lokale Netz wollen (<nowiki>-s $LOCAL_NET</nowiki>) und zu bestehenden Verbindungen oder in Contrackkingmodulen zugeordneten Verbindungen gehören (<nowiki>--state STABLISHED,RELATED</nowiki>)
  
  
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:
+
Die rückwärtigen Verbindungen alleine erlauben jedoch noch keine Verbindung, weil dazu muss ein Verbindunsgaufbau ermögliocht werden. Mit der ffolgenden Regel wird der Verbindungsaufbau und die Verbindungen von einem Client zu einem Webserver zugelassen:
  
 
  <nowiki>$IPTABLES -A FORWARD -s $LOCAL_NET -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT</nowiki>  
 
  <nowiki>$IPTABLES -A FORWARD -s $LOCAL_NET -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT</nowiki>  
  
Hier steht also: Erlaube (<nowiki>-j Accept</nowiki>)  alle Pakete den Transport, die aus dem lokalen Netz stammen (<nowiki>-s $LOCAL_NET</nowiki>) die einem neuen Verbundungsaufbau einleiten oder zu einer Verbindung gehören (<nowiki> --state NEW,ESTABLISHED,RELATED</nowiki>) und einen Webserver kontaktieren (<nowiki>--dport http</nowiki> ) und deren Quellportnummern über 1024 liegen (<nowiki> --sport $PORTS_HIGH</nowiki>).
+
Hier steht also: Erlaube (<nowiki>-j Accept</nowiki>)  alle Pakete den Transport, die aus dem lokalen Netz stammen (<nowiki>-s $LOCAL_NET</nowiki>) die einem neuen Verbundungsaufbau einleiten oder zu einer Verbindung gehören, oder einer zugeordnet sind (<nowiki> --state NEW,ESTABLISHED,RELATED</nowiki>)einen Webserver kontaktieren (<nowiki>--dport http</nowiki> ) und deren Quellportnummern über 1024 liegen (<nowiki> --sport $PORTS_HIGH</nowiki>).
 +
 
 +
Erst beide Regeln erlauben einen Rechner im lokalen Netz eine Website im Internet aufzurufen. In dieser einfachen Strategie wird allen rückläufigen Paketen, das Forwarding mit der ersten Regel erlaubt. Der Zugang wird über über die Erlaubnis geregelt eine neue Verbindung einzugehen.
 +
 +
 
  
 
Dagegen sieht die doppelte Strategie so aus, wobei natürlich klar ist das zu jedem erlaubten Port zwei Regeln notwendig sind:
 
Dagegen sieht die doppelte Strategie so aus, wobei natürlich klar ist das zu jedem erlaubten Port zwei Regeln notwendig sind:

Version vom 23. Mai 2007, 16:24 Uhr

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.


Bevor wir nun in media res gehen (Für Nichtlateiner zum Pudels Kern vorstoßen) müssen wir uns die grundsätzlichen Verlauf der Pakete in iptables betrachten. In der Abbildung ist der Weg durch den Paketfilter im Linuxkernel vorgezeichnet, im linken Bild Pakete die ins LAN gelangen, entweder aus dem Außennetz (oft das Internet) oder von dem Firewallrechner selbst, im rechten Bild ist der Weg vom LAN ins Außennetz dargestellt

Iptables.jpg


Man erkennt dass der Paketfilter iptables in sogenannten Chains (Ketten) aufgeteilt ist, Diese Chains sind in der Abbildiung schraffiert. Zu den Chans gehören: PREROUTUNG, INPUT, OUTPUT, FORWARD und POSTROUTING. Diese Chains enthalten verschiedene Tables (Tabellen) die iptables ihren Namen geben. Nicht jede Kette enthält dabei alle Tabellen. Die Table Mangle ist dafür zuständig Pakete zu markieren, die Table Filter dient dazu Pakete zu filtern, dass bedeutet abzulehnen (deny) oder zu akzeptieren (accept). Die Table Nat schreibt die Ziel oder Quelladressen (und/oder Ports) um, ist also für das Network Adress Translation, das Masquerading (verallgemeinertes Source-NAT: überschrieben privater Pakete mit der zugwiesenen Adresse ders Providers), das Portforwarding (Portumleitung, z. B bei transparenten Proxies) und das Destination NAT (umschreiben der Pakete aus dem Internet, die an einen Server im Netz gedacht sind). Da NAT entweder vor oder nach den eigentlichen Filter einen Sinn ergibt ist auch nur eine NAT Tabl in den Chains PREROUTUNG und POSTROUTING sinnvoll. Die INPUT Chain ist für Pakete gedacht, die als Ziel lokale Prozessen auf dem Firewallrechner ansteuern, das können zum Beispiel Pakete sein, die zu ssh Verbindungen oder zu DNS-Anfragen gehören. OUTPUT ist die Chain für Pakte deren Uraprung lokale Prozesse des Firewallrechner sind. Die FORWARD Chain ist im Grunde die wichtigste Chain, denn sie ist für die Weiterleitung der Pakete aus dem lokalen Netz ins Internet bzw. umgekeht zuständig.

Durch Regeln (rules), die in ene Chain eingefügt, angehängt oder gelöscht werden, kann der Anwender definieren welche Pakete durchgelassen werden. Wie man diese Regeln erstellt, das schreibt iptables nicht vor. Der Filter Iptables ist also genaugenommen ein Werkzeug, mit dem sich ein Paketfilter einrichten lässt. Dabei gibt es ganz verschiedene Strategien.

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 

Anhand dieser Regel lassen sich Gundprinzipien erläutern. Zunächst wird das Programm iptables hier nicht direkt, sondern über eine Variable ($IPTABLES) angesprochen. Damit lassen sich solche Skripte unabhöngig von dem genauen Location erstellen. Man kann dann am Anfang eines solchen Skriptes das Programm zuordnen (z.B: IPTABLES=/sbin/siptables)und muss nicht alle Regeln korrigieren. Das -A bedeutet appand, also hänge diese Regel an den bestehenden Regelkatalog an und zwar in der Chain FORWARD. Die weiteren bestandteile der Regel lassen sich wie folgt beschreiben: Erlaube (-j accept) alle Paketen den Transport, die über diese Firewall laufen (FORWARD), ins lokale Netz wollen (-s $LOCAL_NET) und zu bestehenden Verbindungen oder in Contrackkingmodulen zugeordneten Verbindungen gehören (--state STABLISHED,RELATED)


Die rückwärtigen Verbindungen alleine erlauben jedoch noch keine Verbindung, weil dazu muss ein Verbindunsgaufbau ermögliocht werden. Mit der ffolgenden Regel wird der Verbindungsaufbau und die Verbindungen von einem Client zu einem Webserver zugelassen:

$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, oder einer zugeordnet sind ( --state NEW,ESTABLISHED,RELATED), einen Webserver kontaktieren (--dport http ) und deren Quellportnummern über 1024 liegen ( --sport $PORTS_HIGH).

Erst beide Regeln erlauben einen Rechner im lokalen Netz eine Website im Internet aufzurufen. In dieser einfachen Strategie wird allen rückläufigen Paketen, das Forwarding mit der ersten Regel erlaubt. Der Zugang wird über über die Erlaubnis geregelt eine neue Verbindung einzugehen.


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.



Wenn ich wieder etwas Zeit habe gehts weiter....


zurück zum Netzwerk