Firewall

Inhaltsverzeichnis

Einleitung

Eine Firewall - in genauerer Admin-Volkssprache auch Paketfilter genannt - kann genau steuern, welche Pakete nun das entsprechende Gerät in welcher Richtung passieren oder nicht passieren dürfen.

Warum

Ich verwende eine Firewall, um nur Zugriffe auf Dienste von außen zuzulassen, die ich möchte. Den Weg von innen nach außen hab ich offengelassen, weil ich meinem Rechner vertraue ;-) Auf reinen Serverumgebungen reguliert man auch den rausgehenden Verkehr, um im Falle eines Hackens den Schaden gering zu halten u.v.a.m.

Funktionsweise

Eine einfache Firewall in Linux wird mit dem Tool iptables realisiert. Diese reguliert die entsprechenden Kernel-Parameter, die standardmäßig auf "alles erlauben" stehen.

Installation

Linux (Debian)

Die Installation erfolgt wie gewohnt, wenn das Paket nicht eh schon standardmäßig drauf ist, mit:

apt-get install iptables

Konfiguration

Policy festlegen

Als erstes muß man festlegen, wie man nun eigentlich den Filter festlegen und welche Dienste man wo zulassen/abblocken möchte. Ich empfehle hier das standardmäßige Blocken und sukzessive Zulassen der entsprechenden Dienste:

iptables -P INPUT DROP

Zulässig sind hier ACCEPT und DROP.

Geräte- und Dienste

Ich denke, wir sind uns einig, daß Verkehr zum lokalen Gerät (localhost) immer erlaubt sein sollte:

iptables -A INPUT -i lo -j ACCEPT

Dann will ich auch reinkommende Pakete erlauben, die aus einer Anfrage meinerseits resultieren, z.B. einen Webserver ansurfen oder Daten von FTP runterladen.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

"Established" sind dabei Pakete, die direkt aus Anfragen resultieren. z.B. Webserver. "Related" sind indirekte Pakete, die eigentlich eigenständig zustandegekommen sind, die jedoch aus einer direkten Aktion resultieren. Beispiel: Ein FTP-Server. Der Log-In erfolgt über den Steuerkanal (meist Port 21), der Datentransfer jedoch extra.

Da ich auf meinen Rechner von außerhalb per SSH zugreife, muß ich natürlich auch SSH (Port 22) erlauben:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Einige ICMP-Typen sollte man auch erlauben, etwa weil ein Server meldet, daß ein TCP-Paket fragmentiert werden muß oder sonst ein Problem besteht:

iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT

Will man, daß man auch von außen pingbar ist, kann man noch

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

machen; ich hab es aus Sicherheitsgründen gelassen ;-)
Natürlich kann man sich beispielsweise nur aus dem LAN pingbar machen, etwa mit

iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.1.0/24 -j ACCEPT

(hierbei dürfen alle, deren IP mit 192.168.1 beginnt, mich pingen)

Wenn man will, kann man dem Absender noch eine freundliche Abweisungsnachricht hinterlassen, daß er also hier nicht raufkann:

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

REJECT heißt hier also, Abweisen mit Fehlermeldung an Absender; DROP würde "Stilles Abweisen", also ignorieren bedeuten. Will man nur DROPpen, kann man diese Zeile weglassen, weil ja standardmäßig - wenn keine Regel hier zutrifft - eh gedroppt wird durch die Default-Policy.

Nutzung von NAT

Soll dieser Rechner ein NAT-Gateway sein, damit andere am Netzwerk angeschlossene Rechner über diesen ins Internet können, muß man diesem das explizit erlauben:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

ACHTUNG: Die Datei /etc/network/options ist deprecated, d.h. dort sollte nicht mehr ip_forward eingestellt werden, überhaupt diese Datei nicht mehr existieren!


Bei Portumleitungen, die von außerhalb auf einen Rechner innerhalb des Netzwerkes stattfinden sollen, muß man etwa folgendes machen:

iptables -A PREROUTING -t nat -p tcp --dport 2200 -j DNAT --to 192.168.1.2:22

würde den Port 2200 auf den Rechner 192.168.1.2 Port 22 umleiten.

iptables -A PREROUTING -t nat -p tcp --dport 4662 -j DNAT --to 192.168.1.2

leitet z.B. für den Esel den Port 4662 TCP auf den Rechner 192.168.1.2 um, um eine High-ID zu erhalten. Läßt man den Zielport hinten weg, wird der selbe Port angenommen.

iptables -A PREROUTING -t nat -p udp --dport 4666 -j DNAT --to 192.168.1.2

analog für UDP.

Speicherung als Skript

Um die Regeln dauerhaft abzuspeichern, sollte man ein Skript erstellen, was wie folgt beginnt:

#!/bin/bash
iptables -F
iptables -t nat -F

Die letzte Zeile nur, wenn auch als Router/NAT verwendet wird. Diese stellen sicher, daß bei einem Start des Skriptes alle evtl. vorher vorhandenen Regeln gelöscht werden.

Danach folgen die anderen Befehle gemäß 5.2 und 5.3.


HINWEIS: Man kann mittels iptables auch Pakete markieren; näheres dazu unter Trafficshaping.

Parameterübersicht

Für Selbstbastler, die alle Parameter von iptables kennenlernen wollen oder schlicht eine schnelle Zusammenfassung ansehen möchten, hier eine Übersicht:

-A Kette Syntax: fügt eine Regel in die "Kette" ein, und zwar an letzter Stelle. Sollte die Regel an anderer Position eingefügt werden, ist stattdessen -I zu verwenden. Standardmäßig verfügbare Ketten sind FORWARD, INPUT und OUTPUT. In Verbindung mit dem Parameter -t nat gibt es FORWARD, PREROUTING und POSTROUTING.
-D Kette Syntax/Nummer: löscht eine Regel aus einer "Kette", und zwar die bezeichnete spezifische Regel, die man auch als Syntax bei -A angegeben hätte. Alternativ kann man auch eine "Nummer" angeben, die als Positionsnummer von der ersten Regel an beginnend gezählt wird, diese Regel wird dann gelöscht.
-E Kette: benennt eine mit -N erstellte "Kette" um, dabei werden eventuell in dieser Kette vorhandenen Regeln ebenfalls mit dem neuen Kettennamen verknüpft.
-F (Kette): löscht alle Regeln in einer "Kette" oder allen Ketten, falls der Kettenparameter fehlt.
-I Kette Syntax (Nummer): fügt eine Regel in die "Kette" ein, und zwar im Gegensatz zum Parameter -A an eine spezifizierte Position an der Stelle "Nummer". Fehlt diese Angabe, wird die Regel ganz am Anfang der Kette eingefügt (also als Defaultwert für Nummer 1).
-L (Kette): listet alle momentanen Regeln einer "Kette" oder allen Ketten auf, falls der Kettenparameter fehlt.
-N Kette: erstellt eine neue "Kette".
-P Kette Ziel: gibt die Standard-Policy (Standard"ziel") für eine "Kette" an, wenn beim Durchlaufen einer entsprechenden Kette keine passende Regel mit dem Parameter -j ACCEPT, DROP oder REJECT zur Anwendung kommt. Als "Ziel" in Verbindung mit dem Parameter -P sind ACCEPT oder DROP zulässig.
-R Kette Nummer Syntax: ersetzt an der Positionsnummer "Nummer" in der entsprechende "Kette" die folgende Regel.
-X Kette: löscht eine mit -N erstellte "Kette".
-Z (Kette): setzt die übertragenen Bytes/Pakete für eine "Kette" oder allen Ketten, falls der Kettenparameter fehlt, auf Null.

-d (!) Adresse(/Maske): gibt die Zieladresse an, an die das Paket gerichtet ist. Dies kann eine schlichte IP, ein Netzwerk (z.B. 192.168.0.0/24) oder eine Adresse sein. Ein Ausrufezeichen negiert die Aussage, d.h. diese Regel würde dann zutreffen, wenn das Ziel NICHT dem angegebenen "Ziel" entspricht.
-g Kette: springt zu einer "Kette" ohne Wiederkehr.
-i (!) Gerät(+): gibt das Eingangsgerät an. Das Plus ist ein Wildcard für eine Gerätereihe, z.B. eth+ würde auf alle im System vorhandenen Netzwerkkarten, die mit eth0, eth1... bezeichnet sind, zutreffen.
-j Ziel: gibt das Ziel für die Regel an. Standardmäßig sind ACCEPT und DROP und in Verbindung mit -p tcp auch REJECT erlaubt. In Verbindung mit -t nat und -A POSTROUTING gibt es MASQUERADE, in Verbindung mit -A PREROUTING DNAT und SNAT.
-m passend: gibt eine erweiteret Passung an, wie z.B. state oder length für den Status eines Pakets oder eine Paketgröße.
-n: gibt in Verbindung mit -L die IP-Adressen und Portnummern aus anstelle von Namen.
-o (!) Gerät(+): gibt das Ausgangsgerät an.
-p (!) Protokoll: gibt das "Protokoll" an, z.B. tcp, udp, icmp oder die jeweilige Protokollnummer.
-s (!) Adresse(/Maske): gibt die Quelladresse an, von der das Paket gesendet wurde.
-t (Tabelle): bezeichnet die entsprechende "Tabelle", ohne Anabe des Parameters wird "filter" angenommen. Z.B. nat, mangle
-v: gibt in Verbindung mit -L eine erweiterte Ausgabe an.

Von "http://lug-wr.de/wiki/index.php/Firewall"

Diese Seite wurde bisher 7318 mal abgerufen. Diese Seite wurde zuletzt geändert um 04:34, 20. Nov 2006. Inhalt ist verfügbar unter der GNU Free Documentation License 1.2.