Firewall mit Shorewall
Seit Version 2.4 des Linux Kernels gehört Iptables zum Standardumfang.
Mittels Iptables besteht die Möglichkeit Netzwerkpakete abzufangen und zu manipulieren.
Es bildet damit das Herzstück einer Firewall auf Basis von Linux. Weitere Informationen
zu Iptables finden Sie auf der
netfilter Webseite.
Iptables ist äußerst mächtig, aber das fordert unglücklicherweise seinen Preis. Zum Verhängnis wird die, selbst für erfahrene User, meist sehr komplexe Konfiguration. Glücklicherweise, gibt es eine relativ einfache (relativ einfach im Bezug auf Firewallkonfigurationen im Allgemeinen) Möglichkeit um mittels Iptables ein Firewallkonzept zu implementieren: Shorewall.
Shorewall selbst ist keine Firewall, sondern ein Firewall-Konfigurator für das oben besprochene Iptables. Das heißt, dass Shorewall kein Programm per se ist, da es nicht beständig läuft, sondern sich nach der Erstellung der Regeln beendet.
Grundvoraussetzungen
Bevor man sich Gedanken über ein Firewallkonzept oder die Implementierung eines solchen macht, sollte natürlich ein gewisses Verständnis für Netzwerke im Allgemeinen, sowie Firewalls (wie Netfilter/Iptables) im Speziellen vorhanden sei.
An dieser Stelle sei auf zahlreiche Fachbücher, wie bspw.
Building Internet Firewalls
sowie unzählige Seiten im
Netz verwiesen.
Installation
Als erstes muss natürlich das Shorewall-Paket auf dem entsprechenden System
installiert werden. Die Shorewall-Pakete sind für verschiedene Distributionen
verfügbar. Beispielsweise in den
Repository
des RRZE für die gängigen openSUSE- und SLES-Distributionen. Nutzen Sie
dabei ihre bevorzugte Paketverwaltung (z.B. zypper) um die Pakete zu
installieren.
Die Installation könnte folgendermaßen erfolgen:
linux # zypper install shorewall-common shorewall-perl shorewall-shell
Benötigt man noch ip6tables-Support (iptables für ipv6) müssen noch folgende Pakete nachinstalliert werden:
linux # zypper install shorewall6
Hinweis: Standardmäßig wird in den Paketen des RRZE ipv6 geblockt, da es andernfalls zu Sicherheitslücken kommen kann. Folgendes Szenario soll den Sachverhalt näherbringen:
Man hat eine zugewiesene ipv4 und ipv6-Adresse. Installiert man nun Shorewall und konfiguriert ipv4, jedoch aber ipv6 nicht, so kann nachwievor ungeschützt auf den Server zugegriffen werden. Daher werden die Pakete standardmäßig mit einer geblockten ipv6-Adresse konfiguriert.
Konfiguration
Für die reibungslose Konfiguration von Shorewall, werden noch ein paar zusätzliche Tools benötigt, die, jedoch zumeist, auf jeder gängigen Linux-Distributionen zu finden sind. Dies sind:
- Editor (bspw.
nano
oder
vim), um die Konfigurationsdateien zu bearbeiten - iproute/iproute2: (Shorewall benötigt dieses Paket, da das enthaltene Programm ip Informationen über Interfaces, Routing, Policies, etc. auslesen kann. (Ip ersetzt die Programme ifconfig und route in modernen Linux-Distributionen.) Sollten Sie beim Ausführen des Befehls keine oder keine ähnliche Rückmeldung erhalten, müssen Sie iproute/iproute2 nachinstallieren.
linux # which ip /sbin/ip
- iptables: Ohne iptables funktioniert Shorewall natürlich nicht, da sie lediglich ein Firewall-Konfigurator ist und eine installierte Firewall benötigt. Auch hier müssen Sie iptables nachinstallieren, falls Sie keine ähnliche Rückmeldung erhalten.
linux # which iptables /usr/sbin/iptables
Ein Firewallkonzept überlegen
Zu allererst, muss man sich natürlich Gedanken über ein Firewallkonzept machen, um dieses überhaupt umsetzten zu können. Weiterhin sollte bekannt sein, wie die Infrastruktur (Interfaces, Router, ... ) in Ihrem Netz aufgebaut ist.
In diesem Beispiel wird ein relativ einfaches Konzept mit einem Interface realisiert. Dabei wird die Firewall auf einem Desktoprechner installiert und diese soll anderen Rechnern im lokalen Netzwerk Zugriff gewähren und vereinzelt Rechnern im Internet per ssh Zugriff erlauben. Alles andere soll ein REJECT erhalten.
Das Netzwerk in Zonen aufteilen
Ein wesentliches Konzept von Shorewall, ist die Unterteilung des Netzwerks in Zonen. Dabei ist eine Zone ein Verbund aus ein oder mehrere Host(s). Diese werden als individuelle(r) Host(s) oder als gesamtes Netzwerk in /etc/shorewall/hosts eingetragen.
linux # cat /etc/shorewall/hosts #ZONE HOST(S) OPTIONS nzone eth0:192.168.77.247,131.188.78.240,131.188.78.241
Dabei wird unterhalb von ZONE der neue Zonenname definiert. Unterhalb von HOST(S) werden die Hosts (mittels Kommata getrennt) nach dem dazugehörigen Interface eingetragen. Natürlich ist es auch möglich komplette Adressbereiche a la "131.188.3.1-131.188.3.9" zu definieren bzw. festzulegen.
Hier werden die Zonen fw (Firewallsystem), net (öffentliche Internet) und loc (lokales, privates Netzwerk) verwendet, die in die Datei /etc/shorewall/zones eingetragen werden.
linux # cat /etc/shorewall/zones #ZONE TYPE OPTIONS IN OUT fw firewall net ipv4 loc ipv4
Dabei muss sowohl der Zonenname unterhalb von ZONE, als auch der Typ unterhalb von TYPE, in diesem Fall das Protokoll, eingetragen werden. Die Ausnahme stellt dabei die Spezialzone fw dar, ihr TYPE ist firewall. Das ist immer so und muss nicht weiter beachtet werden.
Die Zonen mit dem Interface assoziieren
Als nächstes müssen die definierten Zonen mit dem/den Interface(s) assoziiert bzw. diesem zugewiesen werden. Dies erfolgt in der Datei /etc/shorewall/interfaces.
linux # cat /etc/shorewall/interfaces #ZONE INTERFACE BROADCAST OPTIONS net eth0 detect dhcp,tcpflags
Dabei wird zuerst die Zone angeben und danach das Interface, das dieser zugewiesen werden soll. Verwendet man bei BROADCAST den speziellen Wert detect, versucht Shorewall die Broadcastadresse selbständig zu erfassen (Interface muss vor der Firewall gestartet werden). Alternativ kann die Broadcastadresse auch manuell eingetragen werden.
linux # cat /etc/shorewall/interfaces #ZONE INTERFACE BROADCAST OPTIONS net eth0 131.188.78.239 tcpflags
Standardpolicies erstellen
Nun werden die sehr wichtigen Standardpolicies der Firewall in der Datei /etc/shorewall/policy erstellt. Die Policy ist die Basis, wie Netzwerkverkehr im Netzwerk gehandhabt werden soll.
linux # cat /etc/shorewall/policy #SOURCE DEST POLICY LOG LIMIT: CONNLIMIT: # LEVEL BURST MASK $FW net ACCEPT loc net ACCEPT net all DROP info all all REJECT info
Die oben aufgeführte Standardpolicy wird:
- Alle Verbindungsanfragen des lokalen Netzwerks an das Internet erlauben
- Alle Verbindungsanfragen des Internets an die Firewall oder das lokale Netz ignorieren (drop)
- Alle Verbindunganfragen der Firewall an das Internet erlauben
- Alle weiteren Verbindungsanfragen verwerfen (reject)
WICHTIG: Die letzte Zeile sollte immer mit einem "all all REJECT" enden. In dem Fall, dass man irgendwelche Zonen vergessen haben sollte, werden diese über die letzte Policy abgesichert.
Firewallregeln erstellen
Zum Erstellen der Firewallregeln ist die Datei /etc/shorewall/rules
vorgesehen, in die erlaubte Verbindungen eingetragen werden müssen, wobei
gewisse vordefinierte Macros (anzeigbar über shorewall show macros)
äußerst hilfreich.
Eine Regel, die allen externen ssh-Verbindungen Zugriff auf den konfigurierten
Rechner gewährt, kann mit diversen Optionen (z.B.
Rate Limit(s)) erweitert
werden.
linux # cat /etc/shorewall/rules #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME # PORT PORT(S) DEST LIMIT GROUP SSH/ACCEPT net $FW
Da es sich bei SSH um ein Macro handelt, definiert dieses das Protokoll (tcp) sowie den Eingangsport (22) automatisch.
Letzte Schritte
Starten der Konfiguration
Shorewall bringt eine sehr nützliche Methode mit, um die Konfiguration
auf syntaktische Fehler zu überprüfen (shorewall check).
Das erste Mal sollte die erstellte Konfiguration über shorewall
safe-start gestartet werden, wobei man am Ende gefragt wird, ob alles in
Ordnung ist und erst danach die Firewall wirklich scharf geschalten wird.
linux # shorewall safe-start ... Do you want to accept the new firewall configuration? [y/n] n ...
Verändert man eine bereits existierende Firewallkonfiguration ist es
ratsam shorewall safe-restart verwenden.
Tipp: Sollte widererwartend nichts funktionieren, gehen Sie bitte wie folgt vor
- Werten Sie ihre Logdateien aus
- Lesen Sie den
Troubleshooting Guide - Lesen Sie die
FAQ - Nutzen Sie
Mailinglisten
Logdateien auswerten
Es seien die drei relevanten Befehle zur Auswertung der Logdateien zu nennen:
- "shorewall show log" - Zeigt die letzten 20 netfilter/iptables Log-Nachrichten
- "shorewall logwatch" - Gibt den Log in festlegbaren Zeitintervallen aus
- "shorewall dump" - Gibt einen sehr ausführlichen Bericht aus
Konfigurationsdateien
Dies stellt eine kurze Liste der wichtigsten Konfigurationsdateien dar.
- /etc/shorewall/shorewall.conf - um globale Firewallparameter zu setzen
- /etc/shorewall/zones - Konfigurationsdatei um Zonen zu definieren
- /etc/shorewall/policy - Konfigurationsdatei um Standardpolicies zu implementieren
- /etc/shorewall/rules - legt die Regeln fest, die eine Ausnahme zu /etc/shorewall/policy darstellen
- /etc/shorewall/interfaces - beschreibt die Interfaces des Firewallsystems
- /etc/shorewall/hosts - erlaubt Zonen in Form von individuellen Hosts oder Subnetwerken zu definieren
- /etc/shorewall/nat - definiert one-to-one NAT Regeln
- /etc/shorewall/routestopped - enthält Hosts die Zugriff haben, wenn Shorewall gestoppet wurde
- /usr/share/shorewall/macro.* - Details über die Macros die standardmäßig unter Shorewall zur Verfügung stehen




