Private Feuerwände
Paketfilter-Firewall
Abschluss
Die vorletzten Regeln, die wir in unsere Firewall schreiben, sorgen für eine Protokollierung auffälliger Ereignisse. Von manchen Paketen möchten wir gar nichts wissen: Verbindungsversuche zu NetBIOS-Ports für die Windows-Netzwerkumgebung schicken wir kommentarlos ins Nirwana (-j DROP). Alle anderen unerlaubten Pakete zeichnen wir erst einmal auf (-j LOG).
iptables -A INPUT -p udp --dport netbios-ns -j DROP iptables -A INPUT -p udp --dport netbios-dgm -j DROP iptables -A INPUT -p tcp --dport netbios-ssn -j DROP iptables -A INPUT -j LOG iptables -A OUTPUT -j LOG
Zum Schluss verwerfen wir alle Pakete, die noch nicht als erlaubt erkannt und so explizit angenommen wurden. Dabei stehen in INPUT- und OUTPUT-Chain unterschiedliche Regeln: Unerwünschte ankommende Pakete ignorieren wir stillschweigend: Wenn uns jemand angreift, wollen wir ihm möglichst wenig Informationen über unser System zukommen lassen. Einzige Ausnahme sind Pakete für den Auth-Port: Dieser dient z. B. FTP-Servern zu einem legitimen Identifikationsversuch. Wir erlauben ihn zwar nicht, wollen aber auch nicht lange warten, bis der fremde Rechner entnervt aufgibt:
iptables -A INPUT -p tcp --dport auth -j REJECT --reject-with tcp-reset iptables -A INPUT -j DROP
Bei abgehenden Paketen liegt eine andere Situation vor: Egal, ob es sich um einen Fehler in der Firewall oder in der Anwendersoftware handelt, wir sind es selbst, die vor dem Computer sitzen und das gesperrte Paket verursacht haben. Über diese Situation soll der Computer uns sofort informieren. Deshalb werden abgehende TCP- und UDP-Pakete mit einer Fehlermeldung an das Anwenderprogramm zurückgewiesen:
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset iptables -A OUTPUT -p udp -j REJECT iptables -A OUTPUT -j DROP
Zusammensetzen
Und wie kommen Sie jetzt zu Ihrer fertigen Firewall? Suchen Sie sich alle Regeln heraus, die für Ihren Computer passen, und schreiben Sie sie in eine Datei, beispielsweise /etc/rc.d/rc.firewall.
Nun sorgen Sie dafür, dass Ihr Computer dieses Skript automatisch aufruft. Wenn Sie exakt arbeiten möchten, erstellen Sie dafür ein eigenes Init-Skript in /etc/rc.d/rc*.d, das noch vor der Initialisierung Ihrer Netzwerkschnittstellen abgearbeitet wird, etwa /etc/rc.d/rc3.d/S01firewall. Wenn Sie es nicht ganz so genau nehmen oder ohnehin keine ständige Internet-Anbindung besitzen, hängen Sie eine Zeile . /etc/rc.d/rc.firewall an die Datei /etc/rc.d/rc.local o. ä. an.
Deaktivieren Sie die Firewall-Automatik Ihrer Distribution, wenn Sie eine eigene Firewall installieren! Bei Red Hat und verwandten Distributionen löschen Sie die beiden Konfigurationsdateien ipchains und iptables im Verzeichnis /etc/sysconfig.
Theoretisch können Sie beim Testen einzelne Regeln per Hand setzen und auch wieder löschen. Da es vor allem am Anfang schwer ist, dabei den Überblick zu behalten, korrigieren Sie lieber Ihr Skript und rufen es neu auf, wenn Sie eine Änderung vornehmen.
Bei einer etwaigen Fehlersuche hilft Ihnen am besten das syslog; Meldungen der Firewall über abgewiesene Datenpakete landen bei den meisten Distributionen in der Datei /var/log/messages.
Weitere Einblicke in die Firewall-Konfiguration bietet z. B. [2]. Dort erfahren Sie auch mehr über benutzerdefinierte Ketten, mit denen Sie Ihre Firewall optimieren und beschleunigen können.
Kasten 3: Firewalls und lokale Netze
Viele Linux-Anwender betreiben zu Hause ein eigenes lokales Netzwerk. Oft dient dabei ein Linux-Rechner als zentraler Router für den Internet-Zugang, den mehrere Computer mit verschiedenen Betriebssystemen benutzen.
Die Firewall muss in dieser Situation etwas anders konfiguriert werden. Für Pakete, die aus dem LAN ins Internet (und umgekehrt) weitergeleitet werden, existiert eine eigene Firewall-Chain namens FORWARD. Abbildung 3 zeigt die neue Architektur.
Wenn ein Paket – egal ob aus dem Internet oder aus dem LAN – direkt an den Computer mit der Firewall geschickt wird, durchläuft es die INPUT-Chain. Wird eines auf dem Firewall-Rechner generiert, muss es die OUTPUT-Chain passieren. Für Pakete, die lediglich zwischen LAN und Internet weitergeleitet werden, ist hingegen ausschließlich die FORWARD-Chain zuständig. Dies ist ein wichtiger Unterschied zu den Firewall-Implementationen älterer Kernel-Serien!
Die Minimalregeln für weitergeleitete Pakete sehen etwa so aus:
# Abgehende Pakete iptables -A FORWARD -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Ankommende Pakete iptables -A FORWARD -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
Die FORWARD-Chain kann im Prinzip ganz ähnliche (oder manchmal sogar identische) Regeln enthalten wie INPUT- und OUTPUT-Chains. Tatsächlich lege ich Ihnen auch dringend ans Herz, hier einen entsprechenden Aufwand zu treiben: Nur so können Sie das Maximum an Sicherheit für Ihr LAN herausholen. Besonders Windows-Maschinen werden es Ihnen zu danken wissen. Ein Minimalsystem wie die zwei hier gezeigten Regeln ist heute nicht mehr ausreichend!
Sofern sich Ihr lokales Netz eine gemeinsame IP-Adresse teilen muss, erfüllt die Firewall noch eine weitere Funktion. Sie befördert nicht nur Pakete zwischen LAN und Internet, sondern korrigiert auch die IP-Adressen auf unserer Seite. Diese Funktionalität heißt NAT oder "Network Address Translation" (Netzadressübersetzung).
Dank NAT sieht es für die Computer im LAN so aus, als hätten sie eine direkte Internet-Anbindung ohne Komplikationen. Für Rechner im Internet hingegen wirkt das gesamte LAN wie ein einziger, besonders aktiver Computer mit einer einzigen IP-Adresse.
Statt der lokalen Netzwerkadresse eines angeschlossenen Computers wird in abgehenden Paketen die offiziell zugewiesene IP-Adresse des Routers eingetragen, die zum Beispiel über PPP ausgehandelt wurde. Gleichzeitig wechselt die Firewall die Port-Nummer aus und ersetzt sie durch einen freien Port auf dem Firewall-Computer.
Bei ankommenden Paketen geschieht das Umgekehrte: Diese Pakete sind an die IP-Adresse der Firewall adressiert und tragen auch eine entsprechende Port-Nummer im Header. Anhand dieser erkennt die NAT-Implementation, welchem Computer im LAN die entsprechende Verbindung gehört. Sie trägt wieder seine IP-Adresse und die ursprüngliche Port-Nummer als Empfänger ein und schickt das Paket weiter.
Das Schönste an NAT ist die Einfachheit, mit der man es einschaltet. Dafür reicht nämlich – zusätzlich zu den normalen Weiterleitungsregeln - eine einzige Zeile im Firewall-Skript:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Statt ppp0 tragen Sie natürlich das Netzwerk-Interface ein, über das Sie Ihre Internet-Verbindung herstellen: ppp0 für Modemverbindungen, ippp0 für ISDN oder eth0 beziehungsweise ein anderes Ethernet-Interface für DSL.
Glossar
IP
Das paketbasierte "Internet Protocol" bildet die Grundlage jeder Kommunikation über das Internet. Jedes IP-Paket enthält u. a. die numerischen Adressen von Absender und Empfänger. Verschiedenste Protokolle setzen auf IP auf und bieten zusätzliche Features.
Port-Nummern
Sie kennzeichnet Programme eindeutig, sowohl Server- als auch Client-Software. Wenn ein Client eine Verbindung aufbaut, weist ihm der Kernel automatisch eine Port-Nummer zu. Dabei gilt unter Unix die Grundregel, dass alle normalen Programme Ports im Bereich ab 1024 erhalten. Die darunterliegenden bleiben für Server reserviert, die root startet. Jedes TCP- und UDP-Paket enthält also zwei Port-Nummern, einen für den Absender und einen für den Empfänger.
Policies
Jede Firewall-Regel kann direkt angeben, dass mit einem Paket etwas geschehen soll. Wird für ein Paket keine passende Regel gefunden, entscheidet die Policy über seinen Verbleib.
Routing-Tabellen
Sie legt fest, über welche Netzwerkverbindungen Ihr Computer Pakete an andere Systeme schickt. Ein Einzelplatzsystem kennt meist nur zwei Verbindungen: lo führt zum eigenen Rechner, ppp0, ippp0 oder eth0 ins Internet. Viele Router oder größere Server besitzen mehrere Netzwerk-Interfaces und damit auch kompliziertere Routing-Tabellen.
Flags
Einzelne Bits im Kopf eines Pakets, die zusätzliche Informationen darüber enthalten, was das Paket erreichen möchte bzw. wofür es gut ist. Flags sagen zum Beispiel "hier beginnt eine neue Verbindung" oder "dieses Paket darf nicht in kleinere Stücke zerlegt werden".
Infos
[1] Robert L. Ziegler: "Linux Firewalls", Markt und Technik München, 2002 (2. Auflage)
[2] "Linux 2.4 Packet Filtering HOWTO" und "Linux 2.4 NAT HOWTO": http://netfilter.samba.org/unreliable-guides/
[3] Das Firewall-Skript aus diesem Artikel zum Download: http://www.seligma.com/linux-user/firewalls/



