Product SiteDocumentation Site

14.2. Firewall oder Paketfilter

Eine Firewall ist ein filternder Netzübergang und nur bei Paketen wirksam, die durch sie hindurchgehen müssen. Deshalb kann sie nur dann wirksam sein, wenn der Weg durch die Firewall für diese Pakete die einzige Route ist.
Da es keine Standardkonfiguration gibt (und das Motto „Prozess, nicht Produkt“ gilt), gibt es auch keine schlüsselfertige Lösung. Es gibt jedoch Hilfsprogramme, die die Konfigurierung der Netfilter-Firewall mit einer grafischen Darstellung der Filterregeln vereinfachen. fwbuilder ist zweifellos unter ihnen eines der besten.
Der Linux Kernel schließt die Netfilter-Firewall ein. Diese kann aus dem Benutzer-Raum mit den Befehlen iptables und ip6tables gesteuert werden. Der Unterschied zwischen diesen beiden Befehlen besteht darin, dass ersterer auf das IPv4-Netzwerk einwirkt, letzterer auf IPv6. Da beide Netzwerk-Protokoll-Stapel wahrscheinlich noch viele Jahre in Gebrauch sein werden, müssen beide Hilfsprogramme parallel verwendet werden.

14.2.1. Verhalten von Netfilter

Netfilter verwendet vier verschiedene Tabellen, in denen Regeln gespeichert werden, die drei Arten von Vorgängen bei Paketen regeln:
  • filter betrifft Filterregeln (ein Paket annehmen, zurückweisen oder ignorieren);
  • nat betrifft die Übersetzung von Quell- oder Zieladressen und der Ports von Paketen; man beachte, dass es diese Tabelle nur für IPv4 gibt;
  • mangle betrifft sonstige Änderungen an den IP-Paketen (einschließlich des ToS — Type of Service — Feldes und seiner Optionen);
  • raw ermöglicht andere manuelle Veränderungen an Paketen, bevor sie das Verbindungsverfolgungssystem erreichen.
Jede Tabelle enthält Regellisten, die Ketten genannt werden. Die Firewall verwendet Standardketten, um Pakete in Abhängigkeit von vorher festgelegten Umständen zu bearbeiten. Der Administrator kann weitere Ketten erstellen, die aber nur benutzt werden, wenn von einer der Standardketten (entweder direkt oder indirekt) auf sie verwiesen wird.
Die Tabelle filter enthält drei Standardketten:
  • INPUT: betrifft Pakete, deren Ziel die Firewall selbst ist;
  • OUTPUT: betrifft Pakete, die von der Firewall ausgesandt werden;
  • FORWARD: betrifft Pakete, die die Firewall durchqueren (die weder ihre Quelle noch ihr Ziel ist).
Die Tabelle nat enthält ebenfalls drei Standardketten:
  • PREROUTING: um Pakete zu verändern, sobald sie eintreffen;
  • POSTROUTING: um Pakete zu verändern, wenn sie für die Versendung bereit sind;
  • OUTPUT: um von der Firewall selbst erzeugte Pakete zu verändern.
Wie Netfilter-Ketten aufgerufen werden

Abbildung 14.1. Wie Netfilter-Ketten aufgerufen werden

Jede Kette ist eine Liste von Regeln; jede Regel besteht aus einem Satz von Bedingungen und einer Aktion, die ausgeführt wird, wenn die Bedingungen erfüllt sind. Wenn ein Paket bearbeitet wird, fragt die Firewall die passende Kette Regel für Regel ab; wenn die Bedingungen einer Regel erfüllt sind, „springt“ (daher die Option -j für „jump“ in den Befehlen) sie zu der angegebenen Aktion, um die Bearbeitung dort fortzusetzen. Die gebräuchlichsten Verhaltensweisen sind standardisiert, und es gibt fest zugeordnete Aktionen für sie. Die Ausführung einer dieser Standardaktionen bricht die Bearbeitung der Kette ab, da das Schicksal des Pakets bereits besiegelt ist (abgesehen von einer weiter unten genannten Ausnahme):
  • ACCEPT: erlaube dem Paket, seinen Weg fortzusetzen;
  • REJECT: weise das Paket mit einem ICMP-Fehlerpaket zurück (die Option --reject-with Typ in Verbindung mit dem Befehl iptables ermöglicht es, den Fehlertyp auszuwählen);
  • DROP: lösche (ignoriere) das Paket;
  • LOG: protokolliere (mittels syslogd) eine Meldung mit einer Beschreibung des Pakets; man beachte, dass hierdurch die Verarbeitung nicht abgebrochen wird und die Ausführung der Kette mit der nächsten Regel weitergeht, weshalb das Protokollieren zurückgewiesener Pakete sowohl die LOG-Regel als auch die REJECT/DROP-Regel erfordert;
  • ULOG: protokolliere eine Meldung mittels ulogd, das für die Verarbeitung einer hohen Anzahl von Meldungen anpassungsfähiger und effizienter ist als syslogd; man beachte, dass dieser Vorgang, wie bei LOG, die weitere Verarbeitung an die nächste Regel in der aufrufenden Kette zurückgibt;
  • ketten_name: springe zu der angegebenen Kette und werte ihre Regeln aus;
  • RETURN: beende die Verarbeitung der aktuellen Kette und kehre zu der aufrufenden Kette zurück; falls die aktuelle Kette eine Standardkette ist, gibt es keine aufrufende Kette, und so wird stattdessen die voreingestellte Aktion (die durch die Option -P des Befehls iptables festgelegt wird) ausgeführt;
  • SNAT (nur in der Tabelle nat, daher nur in IPv4 bei Wheezy — NAT-Unterstützung für IPv6 kam mit dem Linux-Kernel 3.7 auf): wende Source NAT an (weitere Optionen beschreiben genau die anzuwendenden Änderungen);
  • DNAT (nur in der Tabelle nat, daher nur in IPv4 bei Wheezy): wende Destination NAT an (weitere Optionen beschreiben genau die anzuwendenden Änderungen);
  • MASQUERADE (nur in der Tabelle nat, daher nur in IPv4 bei Wheezy): wende masquerading an (ein Sonderfall von Source NAT);
  • REDIRECT (nur in der Tabelle nat, daher nur in IPv4 bei Wheezy): lenke das Paket an einen vorgegebenen Port der Firewall selbst um; dies kann dazu benutzt werden, einen transparenten Webproxy aufzusetzen, der auf der Clientseite ohne Konfiguration funktioniert, da der Client davon ausgeht, dass er direkt mit dem Empfänger verbunden ist, während der Nachrichtenaustausch in Wirklichkeit durch den Proxy läuft.
Andere Aktionen, insbesondere solche, die die mangle-Tabelle betreffen, liegen außerhalb des Rahmens dieses Textes. Die Handbuchseiten iptables(8) und ip6tables(8) enthalten umfangreiche Auflistungen.

14.2.2. Syntax von iptables und ip6tables

Mit den Befehlen iptables und ip6tables können Tabellen, Ketten und Regeln gehandhabt werden. Ihre Option -t tabelle zeigt an, welche Tabelle bearbeitet werden soll (die Voreinstellung ist filter).

14.2.2.1. Befehle

Die Option -N kette erzeugt eine neue Kette. Die Option -X kette löscht eine leere und unbenutzte Kette. Die Option -A kette_regel fügt am Ende der angegebenen Kette eine Regel an. Die Option -I kette regel_nummerregel fügt eine Regel vor der Regel mit der Nummer regel_nummer ein. Die Option -D ketteregel_nummer (oder -D ketteregel) löscht eine Regel in der Kette; die erste Syntax identifiziert die zu löschende Regel durch ihre Nummer, während letztere sie durch ihren Inhalt identifiziert. Die Option -F kette leert eine Kette (löscht alle ihre Regeln); wenn keine Kette angegeben wird, werden alle Regeln der Tabelle gelöscht. Die Option -L kette listet alle Regeln der Kette auf. Schließlich legt die Option -P kette_aktion die voreingestellte Aktion oder „Richtlinie“ einer gegebenen Kette fest; man beachte, dass nur Standardketten eine derartige Richtlinie haben können.

14.2.2.2. Regeln

Jede Regel wird in der Form bedingungen -j aktionaktions_optionen dargestellt. Werden mehrere Bedingungen in derselben Regel angegeben, dann ist das Kriterium die Verknüpfung (das logische und) der Bedingungen, die wenigstens so restriktiv ist wie jede einzelne Bedingung.
Die Bedingung -p protokoll vergleicht das Protokollfeld des IP-Pakets. Die häufigsten Werte sind tcp, udp, icmp und icmpv6. Ein vorangestelltes Ausrufezeichen kehrt die Bedingung um, die dann dem Ausdruck „alle Pakete mit einem anderen als dem angegebenen Protokoll“ entspricht. Dieser Umkehrungsmechanismus ist nicht auf die Option -p beschränkt, sondern kann auch auf alle anderen Bedingungen angewendet werden.
Die Bedingung -s adresse oder -s network/mask vergleicht die Quelladresse des Pakets. Dementsprechend vergleicht die Bedingung -d adresse oder -d network/mask die Zieladresse.
Die Bedingung -i schnittstelle wählt Pakete, die von der angegebenen Netzwerkschnittstelle kommen. -o schnittstelle wählt Pakete, die von einer bestimmten Schnittstelle abgehen.
Es gibt genauere Bedingungen in Abhängigkeit von den oben beschriebenen allgemeinen Bedingungen. So kann zum Beispiel die Bedingung -p tcp um Bedingungen für die TCP-Ports ergänzt werden durch Ausdrücke wie --source-port port und --destination-port port.
Die Bedingung --state status vergleicht den Status eines Pakets in einer Verbindung (hierbei ist das Kernelmodul ipt_conntrack zur Verbindungsverfolgung erforderlich). Der Status NEW bezeichnet ein Paket, das eine neue Verbindung eröffnet; ESTABLISHED gilt für Pakete, die zu einer bereits bestehenden Verbindung gehören, und RELATED entspricht Paketen, die eine neue Verbindung im Zusammenhang mit einer bestehenden eröffnen (dies ist nützlich für die ftp-data-Verbindungen im „aktiven“ Modus des FTP-Protokolls).
Der vorstehende Abschnitt führt verfügbare Aktionen auf, aber nicht ihre jeweiligen Optionen. Die Aktion LOG hat zum Beispiel folgende Optionen:
  • --log-priority, mit dem voreingestellten Wert warning, gibt die Priorität der syslog-Meldung an;
  • --log-prefix ermöglicht es, einen Text-Vorspann festzulegen, um protokollierte Meldungen unterscheiden zu können;
  • --log-tcp-sequence, --log-tcp-options und --log-ip-options kennzeichnen zusätzliche Daten zur Einbindung in die Meldung, und zwar die TCP-Sequenznummer, die TCP-Optionen und die IP-Optionen.
Die Aktion DNAT bietet die Option --to-destination addresse:port an, mit der die neue IP-Zieladresse und der neue Zielport gekennzeichnet werden. Genauso bietet SNAT die Option --to-source addresse:port an, mit der die neue IP-Quelladresse und der neue Quellport gekennzeichnet werden.
Die Aktion REDIRECT (bei Wheezy nur für NAT verfügbar — also nur für IPv4 verfügbar) bietet die Option --to-ports port(s) an, mit der der Port oder der Portbereich gekennzeichnet werden, an den die Pakete umgelenkt werden sollen.

14.2.3. Regeln erstellen

Für jede erstellte Regel muss jedes Mal iptables/ip6tables aufgerufen werden. Da es mühsam ist, diese Befehle von Hand einzugeben, werden sie normalerweise in einem Skript gespeichert, so dass bei jedem Rechnerstart automatisch dieselbe Konfiguration eingerichtet wird. Dieses Skript kann von Hand geschrieben werden, aber es kann auch interessant sein, es mit einem hochentwickelten Hilfsprogramm wie fwbuilder zu erstellen.
Das Prinzip ist einfach. Zunächst müssen alle Elemente beschrieben werden, die in den eigentlichen Regeln enthalten sein werden:
  • die Firewall selbst mit ihren Netzwerkschnittstellen;
  • die Netzwerke mit ihren jeweiligen IP-Bereichen;
  • die Server;
  • die Ports, die zu den auf den Servern untergebrachten Diensten gehören.
Die Regeln werden dann durch einfaches Ziehen und Ablegen auf die Objekte erstellt. Über einige kontextbezogene Menüs kann die Bedingung geändert (zum Beispiel umgekehrt) werden. Anschließend muss die Aktion ausgewählt und konfiguriert werden.
Was IPv6 betrifft, so kann man entweder zwei verschiedene Regelsätze für IPv4 und IPv6 erstellen, oder nur einen und fwbuilder die Regeln je nach den Adressen, die den Objekten zugewiesen sind, übersetzen lassen.
Das Hauptfenster des Fwbuilder

Abbildung 14.2. Das Hauptfenster des Fwbuilder

fwbuilder kann dann ein Skript zur Konfigurierung der Firewall in Übereinstimmung mit den festgelegten Regeln erstellen. Seine modulare Architekt bietet die Möglichkeit, Skripte für unterschiedliche Systeme zu erstellen (iptables für Linux, ipf für FreeBSD und pf für OpenBSD).
Die Versionen des Pakets fwbuilder enthalten seit Squeeze sowohl die grafische Schnittstelle als auch die Module für jedes Firewall-System (vorher waren sie auf mehrere Pakete verteilt, je eins für jedes Zielsystem):
# aptitude install fwbuilder

14.2.4. Die Regeln bei jedem Rechnerstart installieren

Falls die Firewall eine zeitweilige PPP-Netzwerkverbindung schützen soll, besteht der einfachste Weg zur Anwendung des Skripts darin, es als /etc/ppp/ip-up.d/0iptables zu installieren (man beachte, dass nur Dateien ohne Punkt in ihrem Namen berücksichtigt werden). Die Firewall wird auf diese Weise jedes Mal wieder geladen, wenn eine PPP-Verbindung hergestellt wird.
In anderen Fällen besteht der empfohlene Weg darin, das Konfigurationsskript in einer up-Anweisung der Datei /etc/network/interfaces einzutragen. Im folgenden Beispiel ist das Skript unter /usr/local/etc/arrakis.fw gespeichert.

Beispiel 14.1. Aufruf eines Firewallskripts durch eine interfaces-Datei

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw