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 User Space 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;
  • 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.
  • security is used for Mandatory Access Control networking rules, implemented by Linux Security Modules such as SELinux.
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;
  • INPUT: to modify packets destined for local sockets;
  • 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;
  • NFLOG: log a message via the loaded logging backend (usually nfnetlink_log), which can be better adapted and more efficient than syslogd for handling large numbers of messages; note that this action, like LOG, also returns processing to the next rule in the calling chain;
  • 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): wende Source NAT an (weitere Optionen beschreiben genau die anzuwendenden Änderungen);
  • DNAT (nur in der Tabelle nat): wende Destination NAT an (weitere Optionen beschreiben genau die anzuwendenden Änderungen);
  • MASQUERADE (nur in der Tabelle nat): wende masquerading an (ein Sonderfall von Source NAT);
  • REDIRECT (nur in der Tabelle nat): 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

The -N chain option creates a new chain. The -X chain deletes an empty and unused chain. The -A chain rule adds a rule at the end of the given chain. The -I chain rule_num rule option inserts a rule before the rule number rule_num. The -D chain rule_num (or -D chain rule) option deletes a rule in a chain; the first syntax identifies the rule to be deleted by its number, while the latter identifies it by its contents. The -F chain option flushes a chain (deletes all its rules); if no chain is mentioned, all the rules in the table are deleted. The -L chain option lists the rules in the chain; if no chain is mentioned, all chains are listed. Finally, the -P chain action option defines the default action, or “policy”, for a given chain; note that only standard chains can have such a policy.

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-level, mit dem voreingestellten Wert warning, gibt die Priorität des syslog-Schweregrads 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 (nur wenn NAT verfügbar ist) 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.
# apt install fwbuilder
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).

14.2.4. Die Regeln bei jedem Rechnerstart installieren

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
Dies setzt natürlich voraus, dass Sie ifupdown verwenden, um die Netzwerk-Schnittstellen zu konfigurieren. Wenn Sie etwas anderes (wie NetworkManager oder Systemd Networkd) verwenden, dann suchen Sie in der Dokumentation Möglichkeiten ein Skript auszuführen, nachdem die Schnittstelle hochgefahren wurde.