|
|
|
|
Linux Netzwerker-HandbuchTony Bautts, Terry Dawson & Gregor N. Purdy 3. Auflage Juli 2005 ISBN 3-89721-414-8 382 Seiten Weitere Informationen zur gedruckten Version des Buches finden Sie unter: www.oreilly.de/catalog/linag3ger/ Zur Übersicht aller OpenBooks |
Das Thema Sicherheit wird für Firmen wie für einzelne Personen immer wichtiger. Das Internet bietet Ihnen ein mächtiges Werkzeug, mit dem Sie Informationen über sich an andere weitergeben und Informationen von anderen erhalten können. Das bringt allerdings auch ganz neue Gefahren mit sich, die bis dahin keine Rolle spielten. Zu diesen potenziellen Gefahren gehören Computerkriminalität, Informationsdiebstahl und böswillige Beschädigung.
Dieses Kapitel behandelt die Linux-Funktionalität zum Einrichten einer Firewall, die sowohl unter dem Namen ihrer Kommandoschnittstelle (iptables) als auch unter dem Namen des Kernel-Subsystems (netfilter) bekannt ist. Diese Firewall-Implementierung war im Kernel 2.4 neu und funktioniert in 2.6 prinzipiell genauso.
Eine nicht-autorisierte, skrupellose Person, die Zugriff auf ein Computersystem bekommt, kann Kennwörter ausspähen oder Fehler und Eigentümlichkeiten bestimmter Programme ausnutzen, um so einen Benutzerzugang auf der Maschine zu erhalten. Wenn diese Person einmal in der Lage ist, sich in die Maschine einzuloggen, erhält sie womöglich Zugriff auf kritische Informationen, zum Beispiel kommerziell verwertbare Daten wie Geschäftspläne, Informationen über neue Projekte oder Datenbanken. Die Beschädigung oder Änderung solcher Daten kann einer Firma schwer zusetzen.
Die sicherste Methode, um solche weit verbreiteten Schäden zu vermeiden, besteht darin, unautorisierte Personen am Zugriff auf Maschinen über das Netzwerk zu hindern. An dieser Stelle kommen Firewalls ins Spiel.
In diesem Kapitel befassen wir uns mit Linux-spezifischen technischen Fragen. Später präsentieren wir eine beispielhafte Firewall-Konfiguration, die Ihnen als brauchbare Vorlage für eigene Konfigurationen dienen kann. Allerdings gilt wie für alle sicherheitsbezogenen Themen auch hier: Vertrauen Sie niemandem. Prüfen Sie das Design auf Herz und Nieren, und vergewissern Sie sich, dass Sie es auch vollständig verstehen, bevor Sie es an Ihre Bedürfnisse anpassen. Gehen Sie sicher, dann sind Sie auch sicher.
Für Sie als Netzwerkadministrator ist es von entscheidender Bedeutung, dass Sie die Natur potenzieller Angriffe auf die Rechnersicherheit richtig verstehen. Wir gehen hier kurz auf die wichtigsten Arten von Rechnerangriffen ein, so dass Sie genauer begreifen, gegen welche von ihnen die Linux IP-Firewall überhaupt gefeit ist. Für ein tieferes Verständnis anderer Angriffsarten sollten Sie weitere Literatur heranziehen. Dadurch werden Sie in der Lage sein, Ihr Netzwerk auch gegen andere Attacken als die hier beschriebenen zu schützen. Es folgen eine Beschreibung der wichtigeren Angriffsmethoden und Hinweise, wie Sie sich selbst dagegen schützen können:
|
Mit SSH und iptables stehen Ihnen zwei einfache Methoden zur Verfügung, um auf Hosts und Dienste in Ihrem Netzwerk von der Außenwelt aus zuzugreifen, ohne sie direkt bloßzustellen. Zum einen können Sie SSH auf der Firewall ausführen und die Weiterleitungsfunktion des SSH-Ports benutzen, um von außen direkt auf interne Hosts und Dienste zuzugreifen. Abschnitt 12.1 von Bob Toxens Buch Real World Linux Security, 2. Auflage (Prentice Hall), enthält zusätzliche Informationen über eine solche Benutzung von SSH. Zum anderen können Sie die Destination Network Address Translation von iptables einsetzen, um SSH für mehrere Server an unterschiedlichen Ports unter der öffentlichen IP-Adresse der Firewall bereitzustellen. Die Verbindungen werden dabei an die einzelnen Hosts innerhalb des Netzwerks weitergeleitet. In Kapitel 9 finden Sie weitere Informationen über die Network Address Translation.
|
IP-Firewalls sind äußerst nützlich, um nicht-autorisierte Zugriffe, Denial-of-Service-Attacken auf Netzwerkebene und IP-Spoofing-Angriffe zu verhindern oder zumindest einzuschränken. Sie sind allerdings nicht besonders geeignet, um das Ausnutzen von Schwachstellen in Netzwerkdiensten oder Programmen zu verhindern oder Lauschangriffe zu unterbinden.
Eine Firewall ist eine sichere und vertrauenswürdige Maschine, die zwischen Gruppen von Netzwerken platziert wird (normalerweise zwischen einem privaten und einem öffentlichen Netzwerk).1 Der gesamte Netzwerkverkehr zwischen den betroffenen Netzwerken wird durch die Firewall geleitet. Der Firewall-Rechner wird mit einer Menge von Regeln konfiguriert, die bestimmen, welcher Netzwerkverkehr ihn passieren darf und welcher gegebenenfalls blockiert (ohne Antwort verworfen) bzw. abgewiesen (mit Antwort abgelehnt) wird. In manchen großen Unternehmen finden Sie Firewalls sogar innerhalb des Unternehmensnetzwerks, um sensible Bereiche abzutrennen und diese vor dem Zugriff von Angestellten anderer Bereiche zu schützen. Viele Fälle von Computerkriminalität haben ihren Ursprung im Inneren einer Organisation und nicht außerhalb.
Firewalls können auf verschiedene Arten konstruiert werden. Die wohl am höchsten entwickelte Form von Firewalls umfasst mehrere separate Maschinen und ist unter der Bezeichnung Perimeter-Netzwerk oder Demilitarized Zone (DMZ) bekannt. Dabei agieren zwei Maschinen als »Filter« und lassen nur bestimmte Arten von Netzwerkverkehr passieren. Zwischen diesen Filtern befinden sich Netzwerkserver wie E-Mail-(SMTP-) Server oder WWW-Proxy-Server. Diese Konfiguration kann sehr große Sicherheit bieten und gestattet auf einfache Weise große Kontrolle darüber, wer sich von welcher Seite mit der jeweils anderen Seite verbinden darf. Diese Art der Konfiguration wird beispielsweise von großen Unternehmen eingesetzt.
In vielen Fällen werden Firewalls jedoch so gestaltet, dass sie auch andere Dienste anbieten (wie SMTP oder HTTP). Sie sind natürlich weniger sicher, da eine Schwachstelle in einem der zusätzlichen Dienste, die auf der Firewall laufen, die Sicherheit des gesamten Netzwerks gefährdet. Ein Angreifer könnte die Firewall-Regeln so verändern, dass er mehr Zugriff erhält und die Überwachung deaktiviert wird, die den Netzwerkadministrator ansonsten über ungewöhnliche Netzwerkaktivitäten in Kenntnis gesetzt hätte. Nichtsdestotrotz ist diese Art von Firewall billiger und leichter zu verwalten als die oben genannte ausgefeiltere Variante. Abbildung 7-1 zeigt die beiden gebräuchlichsten Firewall-Konfigurationen.
Der Linux-Kernel bietet eine Reihe eingebauter Funktionen, mit deren Hilfe er gut als IP-Firewall funktionieren kann. Die Netzwerkimplementierung enthält Code (das netfilter-Subsystem), der auf unterschiedliche Arten IP-Filterung durchführt, und stellt einen Mechanismus zur Verfügung, mit dem Sie ziemlich genau einstellen können, welche Arten von Regeln Sie überhaupt verwenden wollen. Eine Linux-Firewall ist flexibel genug, um für beide in Abbildung 7-1 gezeigten Konfigurationen angewendet werden zu können. Die Linux-Firewall-Software bietet zudem weitere nützliche Eigenschaften, die wir noch in gesonderten Kapiteln besprechen werden: IP-Accounting (Kapitel 8) sowie IP-Masquerading und Network Address Translation (Kapitel 9).
Die drei wichtigsten Arten der Paketverarbeitung sind Filterung, Anpassung und Umsetzung von Netzwerkadressen (Network Address Translation; NAT). Bei der Filterung wird einfach an verschiedenen Stellen des Paketflusses entschieden, ob die Pakete zur nächsten Stufe passieren dürfen oder nicht. Die Paketanpassung (Packet Mangling) ist ein generischer Begriff für das Verändern der Pakete während des Transports. NAT ist eine besondere Anwendung des Mangling, bei der Quell- oder Ziel-IP-Adressen und/oder Ports verändert werden, um den Verkehr auf transparente Weise umzuleiten.
IP-Filterung ist einfach ein Mechanismus, der entscheidet, welche Arten von IP-Datagrammen normal weitergeleitet und welche ausgesondert oder abgewiesen werden. Mit ausgesondert ist hier gemeint, dass die betroffenen Datagramme vollständig vernichtet und ignoriert werden, so als ob sie nie eingetroffen wären. Werden Pakete abgewiesen, sendet die Firewall eine ICMP-Antwort an den Absender, die einen Grund angibt, weshalb das Paket abgewiesen wurde. Sie können viele verschiedene Kriterien festlegen, die entscheiden, welche Pakete gefiltert werden sollen und welche nicht. Einige Beispiele dafür sind:
An dieser Stelle ist es wichtig zu begreifen, dass IP-Filterung eine Einrichtung auf Netzwerkebene ist. Das bedeutet, es weiß nichts über die Anwendungen, die die Netzwerkverbindungen benutzen, sondern nur etwas über die Verbindungen selbst. Sie können zum Beispiel Benutzern den Zugriff auf Ihr internes Netzwerk über den Standard-Telnet-Port verbieten, aber wenn Sie sich dabei nur auf IP-Filterung verlassen, können Sie es nicht verhindern, dass Anwender dem Telnet-Programm eine Portnummer übergeben, die Sie in Ihrer Firewall passieren lassen. Sie können derartige Probleme umgehen, indem Sie einen Proxy-Server für jeden Dienst verwenden, den Sie durch Ihre Firewall zulassen. Die Proxy-Server kennen die Interna der für sie ausgelegten Anwendungen und können daher deren Missbrauch unterbinden, wie zum Beispiel die Verwendung des Telnet-Programms, um über einen WWW-Port hinter eine Firewall zu gelangen. Wenn Ihre Firewall einen WWW-Proxy unterstützt, wird eine solche Telnet-Verbindung immer durch den Proxy beantwortet, der nur HTTP-Anfragen weiterreicht. Es gibt eine ganze Reihe von Proxy-Server-Programmen. Manche davon sind freie Software und andere kommerzielle Produkte. Einige besonders populäre Produkte werden im Firewall and Proxy Server HOW-TO (online unter http://www.tldp.org/HOWTO/Firewall-HOWTO.html verfügbar) besprochen. Sie würden den Rahmen dieses Buches sprengen.
Der Regelsatz für IP-Filterung besteht aus vielen Kombinationen der oben beschriebenen Kriterien. Nehmen wir an, Sie wollen Webanwendern im Netzwerk der virtuellen Brauerei nur insoweit Internetzugriff ermöglichen, dass sie auf die Webserver anderer Sites zugreifen können. Dazu konfigurieren Sie Ihre Firewall so, dass folgende Weiterleitungen erlaubt sind:
Beachten Sie, dass wir hier zwei Regeln benutzt haben. Wir müssen zum einen unseren ausgehenden Daten den Zugang nach außen erlauben, zum anderen aber auch den eingehenden Daten den Zugang nach innen. Wie wir aber im Kapitel über IP-Masquerading und Network Address Translation (Kapitel 9) sehen werden, wird die Angelegenheit durch iptables vereinfacht und lässt sich durch einen einzigen Befehl realisieren.
Während der Entwicklung der vorherigen Version der Linux-IP-Firewall-Software (namens ipchains) beschloss Paul »Rusty« Russell, dass IP-Firewalls weniger schwierig sein sollten. Er machte sich an die Aufgabe, bestimmte Aspekte der Paketverarbeitung im Firewall-Code des Kernels zu vereinfachen. Heraus kam ein Filter-Framework, das sowohl sauberer als auch bedeutend flexibler war. Er gab diesem neuen Framework den Namen netfilter.
ipchains war zwar in Bezug auf die Verwaltung von Firewall-Regeln eine große Verbesserung gegenüber seinem Vorgänger (ipfwadm), allerdings war die Art und Weise, wie Pakete verarbeitet wurden, immer noch sehr komplex, vor allem im Zusammenhang mit wichtigen Funktionen wie IP-Masquerading (siehe Kapitel 9) und anderen Formen der Adressumsetzung. Diese Komplexität resultierte teilweise daher, dass IP-Masquerading und NAT nicht gleich als echter Bestandteil des Firewall-Codes entworfen, sondern unabhängig vom IP-Firewall-Code entwickelt und später integriert wurden. Falls ein Entwickler die Paketverarbeitung um weitere Funktionen und Eigenschaften erweitern wollte, hätte er Schwierigkeiten, eine Stelle zu finden, an der er den Code einfügen könnte, und wäre gezwungen, deshalb Änderungen am Kernel vorzunehmen.
netfilter nimmt sich sowohl der Komplexität als auch der Rigidität älterer Lösungen an, indem es im Kernel ein generisches Framework implementiert, das die Art und Weise rationalisiert, wie Pakete verarbeitet werden, und eine Möglichkeit bereitstellt, die Filterpolitik zu erweitern, ohne den Kernel modifizieren zu müssen. Das Linux 2.4 Packet Filtering-HOWTO (online verfügbar unter http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html) liefert Ihnen eine ausführliche Liste der Änderungen, die erfolgt sind. Wir wollen uns daher hier auf die eher praktischen Aspekte konzentrieren.
Um eine Linux-IP-Firewall aufzubauen, müssen Sie einen Kernel haben, der mit Unterstützung für IP-Firewalls (netfilter) kompiliert wurde. Außerdem benötigen Sie das Konfigurationsprogramm iptables. Der netfilter-Code ist das Ergebnis eines umfangreichen Redesigns des Paketverarbeitungsablaufs in Linux. netfilter bietet direkte abwärtskompatible Unterstützung für die beiden älteren Firewall-Lösungen unter Linux (ipfwadm und ipchains) sowie einen neuen Befehl namens iptables. In diesem Buch behandeln wir nur iptables. Sie können jedoch in älteren Auflagen dieses Buches nachlesen, falls Sie ipfwadm- oder ipchains-Regeln verstehen müssen.
Die iptables-Architektur gruppiert die Regeln zur Paketverarbeitung in Tabellen (Tables), und zwar anhand ihrer Funktion (Paketfilterung, Umsetzung von Netzwerkadressen/Network Address Translation und andere Paketanpassungen), die jeweils Ketten (Sequenzes) von Verarbeitungsregeln enthalten. Die Regeln bestehen aus Filtern (Matches), mit denen festgestellt wird, auf welche Pakete die Regel angewendet wird, und Zielen (Targets), die angeben, was mit den ermittelten Paketen geschieht.
iptables agiert auf OSI-Schicht 3 (Netzwerk). Für OSI-Schicht 2 (Sicherungsschicht) gibt es andere Techniken wie etwa ebtables (Ethernet Bridge Tables). Weitere Informationen finden Sie unter http://ebtables.sourceforge.net/.
Dieser Abschnitt liefert Ihnen einige Beispiele und Erläuterungen für die Anwendung von iptables. Zusätzliche Informationen finden Sie im Abschnitt »iptables-Konzepte« weiter hinten in diesem Kapitel.
Dieser Befehl könnte auf einer Firewall benutzt werden, um den gesamten Nicht-HTTP-Verkehr herauszufiltern. Dabei würden die weiter vorn im Abschnitt »Was ist IP-Filterung?« genannten Regeln umgesetzt werden. Es wird angenommen, dass eth0 die Ethernet-Schnittstelle im Inneren und eth1 die Ethernet-Schnittstelle zum Internet ist.
Der erste Befehl legt die Standardpolitik der FORWARD-Kette der filter-Tabelle fest. Es werden alle Pakete abgewiesen (DROP). Tabelle 7-1 zeigt, wie der zweite Befehl »alle ausgehenden HTTP-Anfragen erlaubt«. Der dritte Befehl ist ähnlich, allerdings werden »alle eingehenden HTTP-Antworten erlaubt«.
Das Paketfilterbeispiel aus dem vorherigen Abschnitt ist nicht gerade die ideale Anwendung für die Funktionalität von iptables. Falls Sie eine dynamische IP-Adresse an Ihrer Internet-Schnittstelle haben, sollten Sie besser Masquerading einsetzen (in Kapitel 9 erfahren Sie mehr über Masquerading):
Dieser Befehl könnte auf einer Firewall verwendet werden, um den eingehenden HTTP-Verkehr an einen Webserver im internen Netzwerk weiterzuleiten (in Kapitel 9 erfahren Sie mehr über Network Address Translation):
Tabelle 7-2 zeigt, was dieser beispielhafte iptables-Befehl bedeutet.
iptables definiert fünf Einstiegspunkte im Verlauf der Paketverarbeitung des Kernels: PREROUTING, INPUT, FORWARD, POSTROUTING und OUTPUT. Diesen Einstiegspunkten (oder Hook Points) sind integrierte Ketten (Chains) zugewiesen; Sie können ihnen jeweils eine Folge von Regeln anhängen. Jeder dieser Einstiegspunkte repräsentiert eine Möglichkeit, den Paketfluss zu beeinflussen oder zu überwachen.
Abbildung 7-2 zeigt, wie die Pakete das System durchlaufen. Die Kästen repräsentieren die iptables-Ketten und in jedem Kasten sehen Sie eine Liste der Tabellen, die eine solche Kette haben (in der Reihenfolge, in der sie aufgerufen werden). All diese Kombinationen aus Tabellen und Ketten sind an der Paketanpassung beteiligt.
In Abbildung 7-3 repräsentieren die hellgrauen Kästen Ketten und Tabellen, die nicht an NAT beteiligt sind.
Abbildung 7-4 zeigt, wie Pakete das System für die Paketfilterung durchlaufen.
Tabelle 7-3 zeigt die fünf »Einstiegspunkte« und beschreibt die Stellen im Paketfluss, an denen sie es Ihnen erlauben, eine Verarbeitung festzulegen.
Für welche Kette Sie sich entscheiden, hängt davon ab, an welcher Stelle im Lebenszyklus des Pakets Sie Ihre Regeln anwenden müssen. Falls Sie beispielsweise ausgehende Pakete filtern wollen, erledigen Sie das im Allgemeinen in der OUTPUT-Kette, da die POSTROUTING-Kette nicht mit der filter-Tabelle verknüpft ist.
Betrachten Sie, wie ein Unix-Host oder - um genau zu sein - jeder Host, der IP-Pakete routen kann, IP-Pakete verarbeitet. Die grundlegenden Schritte, die auch in Abbildung 7-5 gezeigt werden, sind:
In unserem Diagramm repräsentiert der Fluss 1 > 3 > 5 unseren Host, der Daten von einem Host in unserem Ethernet-Netzwerk an einen Host routet, der über unsere PPP-Verbindung erreichbar ist. Die Flüsse 1 > 2 und 4 > 5 repräsentieren die Eingangs- und Ausgangsdatenflüsse eines Netzwerkprogramms, das auf unserem lokalen Host läuft. Der Fluss 4 > 3 > 2 würde einen Datenfluss über eine Loopback-Verbindung repräsentieren. Natürlich fließen Daten sowohl in Netzwerkgeräte hinein als auch aus ihnen heraus. Die Fragezeichen im Diagramm repräsentieren die Stellen, an denen die IP-Schicht Routing-Entscheidungen trifft.
Die Linux-Kernel-IP-Firewall ist in der Lage, die Filterung in verschiedenen Stadien dieses Vorgangs anzuwenden. Das heißt, Sie können die IP-Pakete filtern, die an Ihrem Host ankommen, diejenigen Pakete, die durch Ihren Host weitergeleitet werden, und auch solche Pakete, die zur Übertragung bereit sind.
Auf den ersten Blick erscheint das möglicherweise unnötig kompliziert, es bietet aber eine Flexibilität, die Ihnen die Erstellung ausgefeilter und leistungsfähiger Konfigurationen erlaubt.
iptables enthält drei Tabellen: filter, mangle und nat. Jede dieser Tabellen ist mit Ketten vorkonfiguriert, die mit einem oder mehreren der Einstiegspunkte korrespondieren, die in Tabelle 7-4 beschrieben und in Abbildung 7-2 gezeigt werden.
iptables sorgt dafür, dass die passenden Ketten in diesen Tabellen auf der Grundlage von Quelle und Ziel und in der Reihenfolge, die in Abbildung 7-2 dargestellt wird, von den Netzwerkpaketen durchlaufen werden.
Die vorgegebene Tabelle ist die Tabelle filter. Falls Sie in einem iptables-Befehl keine Tabelle ausdrücklich angeben, wird filter angenommen.
Pakete durchlaufen Ketten, wobei nacheinander die Regeln der Kette angewendet werden. Entspricht ein Paket nicht den Kriterien der Regel, wird es an die nächste Regel in der Kette weitergegeben. Erreicht ein Paket die letzte Regel in einer Kette, ohne dass ein Filter eingesetzt wird, dann wird die Richtlinie der Kette darauf angewendet.
Standardmäßig besitzt jede Tabelle (anfangs leere) Ketten für einige oder alle Einstiegspunkte. In Tabelle 7-3 finden Sie eine Liste der Einstiegspunkte und in Tabelle 7-4 sehen Sie eine Liste der eingebauten Ketten der einzelnen Tabellen.
Darüber hinaus können Sie Ihre eigenen Ketten anlegen, um Ihre Regeln zu organisieren.
Die Richtlinie (oder Policy) einer Kette wird verwendet, um das Schicksal der Pakete zu bestimmen, die das Ende der Kette erreichen, ohne anderweitig an ein bestimmtes Ziel geschickt worden zu sein. Nur die eingebauten Ziele ACCEPT und DROP (beschrieben im Abschnitt »Ziele« weiter hinten in diesem Kapitel) können als Richtlinie für eine eingebaute Kette verwendet werden; die Vorgabe lautet ACCEPT. Alle benutzerdefinierten Ketten haben die implizite Richtlinie RETURN, die nicht geändert werden kann.
Falls Sie ein komplizierteres Richtlinienziel für eine eingebaute Kette oder eine andere Richtlinie als RETURN für eine benutzerdefinierte Kette haben wollen, können Sie eine Regel an das Ende der Kette anhängen, die alle Pakete mit einem beliebigen Ziel erfasst. Sie können die Richtlinie der Kette auf DROP setzen, falls Sie einen Fehler in Ihrer Catch-all-Regel machen oder um den Verkehr auszufiltern, während Sie Änderungen an Ihrer Catch-all-Regel vornehmen (indem Sie sie löschen und mit Änderungen erneut hinzufügen).
Eine iptables-Regel besteht aus einem oder mehreren Filterkriterien, die festlegen, welche Netzwerkpakete beeinflusst werden, und einer Zielspezifikation, die angibt, wie die Netzwerkpakete beeinflusst werden. Alle Filteroptionen müssen für die Regel zutreffen, damit ein Paket erfasst wird.
Das System führt für jede Regel Paket- und Bytezähler. Jedes Mal wenn ein Paket eine Regel erreicht und den Kriterien der Regel entspricht, wird der Paketzähler inkrementiert und der Bytezähler um die Größe des erfassten Pakets erhöht.
Sowohl der Filter- als auch der Zielanteil der Regel ist optional. Wenn es keine Filterkriterien gibt, werden alle Pakete als passend angesehen. Gibt es keine Zielspezifikation, dann wird mit den Paketen nichts gemacht (die Verarbeitung wird so fortgesetzt, als würde die Regel nicht existieren, allerdings werden die Paket- und Bytezähler aktualisiert). Sie können eine solche »Null«-Regel in die FORWARD-Kette der filter-Tabelle einfügen, und zwar mit dem Befehl iptables -t filter -A FORWARD.
Es gibt eine Vielzahl von Filtern (Matches), die zusammen mit iptables verwendet werden können, obwohl einige nur für Kernel zur Verfügung stehen, bei denen bestimmte Funktionen aktiviert sind. Generische IP-Filter (wie etwa Protokoll- oder Quell- oder Zieladressen) können auf jedes IP-Paket angewendet werden.
Zusätzlich zu den generischen Filtern enthält iptables viele spezialisierte Filter, die nur über dynamisch zu ladende Erweiterungen erreicht werden (Sie verwenden die Option iptables -m oder --match, um iptables mitzuteilen, dass Sie eine dieser Erweiterungen einsetzen wollen).
Es gibt eine Filtererweiterung zum Umgang mit der Netzwerkschicht unterhalb der IP-Schicht. Die Erweiterung mac filtert auf der Grundlage von MAC-Adressen (Media Access Controller).
Ziele (Targets) werden verwendet, um die Aktion festzulegen, die ausgeführt werden soll, wenn eine Regel ein Paket erfasst. Außerdem werden mit ihnen die Richtlinien für eine Kette angegeben. In iptables sind vier Ziele eingebaut; mit Hilfe von Erweiterungen lassen sich weitere Ziele bereitstellen. Tabelle 7-5 beschreibt die eingebauten Ziele.
| Ziel |
Beschreibung |
|---|---|
| ACCEPT |
Lässt das Paket zur nächsten Verarbeitungsstufe durch. Beendet das Durchlaufen der aktuellen Kette und beginnt in der nächsten Stufe, die in Abbildung 7-2 gezeigt wird. |
| DROP |
Stellt die Verarbeitung des Pakets vollständig ein. Prüft das Paket nicht anhand anderer Regeln, Ketten oder Tabellen. Falls Sie dem Absender eine Rückmeldung liefern wollen, können Sie die Zielerweiterung REJECT einsetzen. |
| QUEUE |
Sendet das Paket in den Benutzerraum (d.h. Code, der nicht im Kernel steht). Weitere Informationen finden Sie in der lipipq-Manpage. |
| RETURN |
Aus einer Regel in einer benutzerdefinierten Kette: Stellt die Verarbeitung in dieser Kette ein und setzt das Durchlaufen der aufrufenden Kette in der Regel fort, die auf diejenige folgt, die diese Kette als Ziel hatte. Aus einer Regel in einer eingebauten Kette: Stellt die Verarbeitung des Pakets ein und wendet die Richtlinie der Kette darauf an. Weitere Informationen über Kettenrichtlinien finden Sie im Abschnitt »Ketten« weiter vorn in diesem Kapitel. |
Um eine IP-Firewall zu bauen, muss der Linux-Kernel mit entsprechender Unterstützung konfiguriert werden. Führen Sie dazu folgenden Befehl aus:
Damit wählen Sie die für Ihren Kernel passenden Optionen.2 In den Kerneln ab 2.4 sollten Sie folgende Optionen einstellen:
Bevor Sie den iptables-Befehl benutzen können, müssen Sie das Kernel-Modul netfilter laden, das Unterstützung für diesen Befehl bereitstellt. Am einfachsten geht das mit dem Befehl modprobe:
Die bemerkenswerte Flexibilität von Linux-netfilter wird durch seine Fähigkeit verdeutlicht, die ipfwadm- und ipchains-Schnittstellen zu emulieren. Die Emulation erleichtert den Umstieg auf die neue Generation der Firewall-Software (obwohl Sie möglicherweise Ihre Regeln als iptables umschreiben müssen).
Die beiden netfilter-Kernel-Module namens ipfwadm.o und ipchains.o bieten Abwärtskompatibilität für ipfwadm und ipchains. Sie dürfen nur eines dieser Module zu einem Zeitpunkt laden und können sie außerdem nur benutzen, wenn das Modul ip_tables.o nicht geladen ist. Wenn das entsprechende Modul geladen ist, funktioniert netfilter genau wie die frühere Firewall-Implementierung.
netfilter imitiert die ipchains-Schnittstelle mit den folgenden Befehlen:
Der iptables-Befehl kann durch dynamisch zu ladende Bibliotheken erweitert werden. Er ist im netfilter-Quellpaket enthalten, das unter http://www.netfilter.org/ zur Verfügung steht. Darüber hinaus finden Sie ihn in jeder Linux-Distribution, die auf den Kerneln der 2.4-Reihe aufbaut.
Mit dem iptables-Befehl konfiguriert man IP-Filterung und NAT (zusammen mit anderen paketverarbeitenden Anwendungen, einschließlich Accounting, Protokollierung und Anpassung). Um das zu erleichtern, gibt es zwei Tabellen mit Regeln namens filter und nat. Die filter-Tabelle wird angenommen, falls Sie sie nicht mit der Option -t außer Kraft setzen. Außerdem werden fünf eingebaute Ketten bereitgestellt. Die Ketten INPUT und FORWARD sind für die filter-Tabelle verfügbar, die Ketten PREROUTING und POSTROUTING sind für die nat-Tabelle verfügbar und die Kette OUTPUT steht für beide Tabellen zur Verfügung. In diesem Kapitel besprechen wir nur die filter-Tabelle. Wir werden uns die nat-Tabelle in Kapitel 9 ansehen.
Die allgemeine Syntax der meisten iptables-Befehle lautet:
Wir werden uns nun zunächst einige Optionen genauer ansehen, anschließend wenden wir uns einigen Beispielen zu.
Die meisten Optionen für den iptables-Befehl können in Unterbefehle und Kriterien zur Regelerfassung unterteilt werden. Tabelle 7-6 zeigt die anderen Optionen.
iptables bietet einige Quellen für Online-Hilfe. Über die folgenden Befehle erhalten Sie grundlegende Informationen:
Jeder iptables-Befehl kann einen Unterbefehl enthalten, der eine Operation auf einer bestimmten Tabelle (und in einigen Fällen: Kette) ausführt. Tabelle 7-7 listet die Optionen auf, die verwendet werden, um den Unterbefehl anzugeben.
iptables besitzt eine kleine Anzahl eingebauter Filter und Ziele und eine Gruppe von Erweiterungen, die geladen werden, falls sie referenziert werden. Die Filter für IP werden als eingebaut betrachtet, die anderen werden als Filtererweiterungen angesehen (auch wenn die Erweiterungen icmp, tcp und udp automatisch geladen werden, wenn die entsprechenden Protokolle mit der eingebauten Option -p referenziert werden).
Diese eingebauten Filter stehen auch ohne ein vorausgehendes -m-Argument für iptables zur Verfügung. Tabelle 7-8 zeigt das Aussehen der Felder in einem IPv4-Paket. Diese Felder sind Gegenstand der verschiedenen Filter- und Zieloptionen (einschließlich der in diesem Abschnitt beschriebenen eingebauten Filter). Tabelle 7-8 beschreibt die Optionen für diese Filter.
| Option |
Beschreibung |
|---|---|
| -d [!] adr[/maske] |
Zieladresse adr (oder Bereich, falls maske gegeben ist). |
| --destination |
Synonym für -d. |
| --dst |
Synonym für -d. |
| [!] -f |
Zweites oder weiteres Fragment eines Pakets, das einer Fragmentierung unterzogen wurde. Verbindungsverfolgung führt eine automatische Defragmentierung durch, weshalb diese Option nicht oft sinnvoll ist. Falls Sie allerdings keine Verbindungsverfolgung durchführen, können Sie sie benutzen. |
| --fragments |
Synonym für -f. Üblicherweise abgekürzt mit --fragment (auch in der iptables-Manpage). |
| -i [!] in |
Eingangsschnittstelle in (falls in mit + endet, wird jede Schnittstelle erfasst, deren Name mit in beginnt). |
| --in-interface |
Synonym für -i. |
| -o [!] out |
Ausgangsschnittstelle out (falls out mit + endet, wird jede Schnittstelle erfasst, deren Name mit out beginnt). |
| --out-interface |
Synonym für -o. |
| -p [!] proto |
Protokollname oder -nummer proto. In Tabelle 7-9 finden Sie eine Liste der gebräuchlichen Protokollnamen und -nummern. Die Datei /etc/protocols Ihres Systems wird befragt, um offizielle Namen auf Nummern abzubilden (Groß- und Kleinschreibung wird beachtet). Die Aliase in /etc/protocols sind nicht verfügbar. Siehe auch die offizielle Protokollliste unter http://www.iana.org/assignments/protocol-numbers. -p protokoll enthält ein implizites -m protokoll, wenn protokoll icmp, tcp oder udp lautet. |
| --protocol |
Synonym für -p. Üblicherweise abgekürzt mit --proto. |
| -s [!] adr[/maske] |
Quelladresse adr (oder Bereich, falls maske gegeben ist). |
| --source |
Synonym für -s. |
| --src |
Synonym für -s. |
Sie können die alte Dotted-Quad-Notation wie 192.168.1.0/255.255.255.0 oder die neuere CIDR-Notation (Common Inter-Domain Routing) wie 192.168.1.0/24 (siehe RFC 1591, online verfügbar unter http://www.rfc-editor.org/rfc/rfc1519.txt) für die Adressspezifikationen von -s und -d verwenden.
Dieser Filter basiert auf der MAC-Adresse (Media Access Controller) der Ethernet-Schnittstelle der Quelle. Tabelle 7-10 beschreibt die einzige Option zu diesem Filter.
Eigentlich handelt es sich dabei nicht um einen IP-Filter. Ethernet befindet sich in der Netzwerkarchitektur auf einer niedrigeren Ebene, da aber viele IP-Netzwerke über Ethernet laufen und die MAC-Informationen zur Verfügung stehen, ist diese Filtererweiterung sowieso enthalten.
Setzen Sie dies nur mit Regeln in den Ketten PREROUTING, FORWARD oder INPUT und auch für Pakete ein, die von Ethernet-Geräten stammen.
Um beispielsweise nur die Kommunikation eines einzigen Ethernet-Geräts über eine Schnittstelle zu erlauben (wie etwa eine Schnittstelle, die an ein drahtloses Gerät angeschlossen ist), schreiben Sie Folgendes:
Die Internet Control Message Protocol-(ICMP-)Filtererweiterung wird automatisch geladen, falls -p icmp verwendet wird. Tabelle 7-11 beschreibt die Optionen für diesen Filter.
| Option |
Beschreibung |
|---|---|
| --icmp-type [!] typname |
Filtert ICMP-Typ typname |
| --icmp-type [!] typ[/code] |
Filtert angegebenen ICMP-typ und -code |
Sie finden die offiziellen ICMP-Typen und -Codes in der offiziellen Datenbank unter http://www.iana.org/assignments/icmp-parameters (siehe auch RFC 3232, »Assigned Numbers: RFC 1700 is Replaced by an On-line Database«, online verfügbar unter http://www.rfc-editor.org/rfc/rfc3232.txt).
Die User Datagram Protocol-(UDP-)Filtererweiterung wird automatisch geladen, falls -p udp verwendet wird. Tabelle 7-12 beschreibt die Optionen für diesen Filter.
Die Transmission Control Protocol-(TCP-)Filtererweiterung wird automatisch geladen, falls -p tcp verwendet wird. Tabelle 7-13 beschreibt die Optionen für diesen Filter.
Lassen Sie uns einmal annehmen, dass wir in unserer Einrichtung ein Netzwerk haben und einen Linux-basierten Firewall-Host verwenden, um unseren Benutzern den Zugriff auf WWW-Server (nur HTTP an Port 80, nicht HTTPS an Port 443) im Internet zu erlauben. Anderer Verkehr darf nicht passieren. Die Befehle, die nun folgen, könnten verwendet werden, um eine einfache Gruppe von Weiterleitungsregeln einzurichten, die diese Richtlinien implementieren. Beachten Sie jedoch, dass dieses Beispiel zwar einfach ist, für diese Art der Anwendung üblicherweise jedoch die NAT- und Masquerading-Lösungen eingesetzt werden, die in Kapitel 9 besprochen werden.
Falls unser Netzwerk eine 24-Bit-Netzwerkmaske (Klasse C) besitzt und die Adresse 172.16.1.0 hat, verwenden wir folgende iptables-Regeln:
Die Zeilen 1 - 3 installieren iptables in den laufenden Kernel, löschen die FORWARD-Kette der filter-Tabelle (die Standardtabelle, falls in den Argumenten des iptables-Befehls keine Tabelle ausdrücklich genannt wird) und setzen die Standardrichtlinie für die FORWARD-Kette der filter-Tabelle auf DROP.
Zeile 4 verhindert, dass Internet-Hosts eine Verbindung in das interne Netzwerk aufbauen, indem SYN-Pakete verworfen werden (allerdings nur, wenn es sich um Port 80 als Quellport handelt, da dies die einzigen sind, die durch später folgende Regeln durchgelassen werden würden).
Zeile 5 erlaubt, dass alle Pakete durchgehen, die aus dem internen Netzwerk stammen und an Port 80 auf beliebigen Hosts gerichtet sind.
Zeile 6 erlaubt, dass alle Pakete durchgehen, die von Port 80 auf beliebigen Hosts stammen und an Hosts im internen Netzwerk gerichtet sind.
Wir haben nun die Grundlagen der Firewall-Konfiguration besprochen. Jetzt wollen wir uns eine einfach anpassbare Firewall-Konfiguration anschauen. In diesem Beispiel wird das Netzwerk 172.16.1.0/24 so behandelt, als wäre es ein öffentlich routbares Netzwerk, tatsächlich ist es jedoch ein privates, nicht-routbares Netzwerk. Wir benutzen in unserem Beispiel ein solches nicht-routbares Netzwerk, weil wir irgendein Netzwerk verwenden müssen und hier keine tatsächliche, routbare Netzwerknummer veröffentlichen wollen. Die gezeigten Befehle sollten in einem echten Klasse-C-Netzwerk, das öffentlich geroutet werden kann, funktionieren.
In vielen einfachen Situationen müssen Sie lediglich den oberen Abschnitt, der mit BENUTZERKONFIGURATION überschrieben ist, bearbeiten, um festzulegen, welche Protokoll- und Pakettypen Sie herein- und herauslassen wollen. Für komplexere Konfigurationen müssen Sie auch den unteren Abschnitt bearbeiten. Denken Sie daran, dass dies ein einfaches Beispiel ist. Studieren Sie es also sehr sorgfältig, um sicherzugehen, dass es auch immer das macht, was Sie wollen.
Es gibt genügend Material über Firewall-Konfiguration und -Entwurf, um ein ganzes Buch zu füllen. Wir zeigen Ihnen hier ein paar gute Referenzen, die Sie lesen könnten, um Ihr Wissen zu diesem Thema zu erweitern:
© 2005, O'Reilly Verlag GmbH & Co. KG