Im Katalog suchen

Linux - Wegweiser für Netzwerker

Online-Version

Copyright © 2001 by O'Reilly Verlag GmbH & Co.KG

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser für Netzwerker oder wollen Sie es bestellen, dann klicken Sie bitte hier.


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel



Die ursprüngliche IP-Firewall (2.0er Kernel)

Die erste Generation von IP-Firewalls wurde von Linux ab dem Kernel 1.1 unterstützt. Dabei handelte es sich um eine Portierung der ipfw-Firewall-Software von BSD nach Linux, die von Alan Cox durchgeführt wurde. Für die Erweiterungen der Firewall-Software der zweiten Generation ab Kernel 2.0 waren Jos Vos, Pauline Middelink und andere zuständig.

Benutzung von ipfwadm

Der Befehl ipfwadm war das Konfigurations-Tool für die Linux-IP-Firewall der zweiten Generation. Die wohl einfachste Art, die Anwendung von ipfwadm zu beschreiben, sind Beispiele. Dazu nehmen wir uns ein bereits bekanntes Beispiel und schreiben es um.

Ein einfaches Beispiel

Nehmen wir an, wir haben ein Netzwerk in unserer Firma und wollen einen Linux-basierten Firewall-Rechner dazu benutzen, um unser Netzwerk mit dem Internet zu verbinden. Nehmen wir außerdem an, daß wir unseren Netzwerkbenutzern nur Zugriff auf die Webserver im Internet gestatten, aber keinen anderen Datenverkehr zulassen wollen.

Dafür schreiben wir eine Weiterleitungsregel, die Datagrammen mit einer Quelladresse aus unserem Netzwerk und dem Ziel-Port 80 Zugang ins Internet gewährt und die von dort zurückkommenden IP-Antworten durch unsere Firewall hindurch in unser Netzwerk hereinläßt.

Angenommen, unser Netzwerk hat eine 24-Bit-Netzmaske (Class C) und die IP-Adresse 172.16.1.0. Die Regeln, die wir anwenden könnten, sind:

# ipfwadm -F -f 
# ipfwadm -F -p deny 
# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80 
# ipfwadm -F -a accept -P tcp -S 0/0 80 -D 172.16.1.0/24

Das Kommandozeilen-Argument –F teilt ipfwadm mit, daß es sich hier um eine Weiterleitungsregel handelt. Die erste Anweisung instruiert ipfwadm, alle bereits vorhandenen Weiterleitungsregeln zu löschen. Dadurch wird sichergestellt, daß wir von einem bekannten Zustand ausgehen, bevor wir irgendwelche neuen Regeln einführen.

Die zweite Regel legt unsere Standard-Weiterleitungs-Richtlinie fest. Wir weisen den Kernel damit an, die Weitergabe von IP-Datagrammen zu verweigern oder zu verbieten. Es ist sehr wichtig, diese Standardregel festzulegen, da sie für alle Datagramme, die nicht von den nachfolgenden Regeln verarbeitet werden, festlegt, wie mit ihnen verfahren werden soll. In den meisten Firewall-Konfigurationen werden Sie Ihre Standardeinstellung wie gezeigt auf “deny” festlegen, um sicherzugehen, daß wirklich nur solcher Datenverkehr Ihre Firewall passieren kann, dem Sie den Zugang erlauben wollen.

Die Regeln drei und vier beschreiben unsere speziellen Anforderungen. Regel drei gestattet unseren Datagrammen Ausgang, und Regel vier legt fest, daß die Rückantworten unsere Firewall passieren dürfen.

Nun sehen wir uns die Argumente einzeln an:

-F

Dies ist eine Weiterleitungsregel.

-a accept

Ergänzt diese Regel um die Einstellung, IP-Pakete grundsätzlich zu akzeptieren. Somit wird jedes IP-Paket weitergeleitet, das diese Regel erfüllt.

-P tcp

Diese Regel gilt nur für TCP-Datagramme (im Gegensatz zu UDP oder ICMP).

-S 172.16.1.0/24

Die Quelladresse muß in den ersten 24 Bits mit der Netzwerkadresse 172.16.1.0 übereinstimmen.

-D 0/0 80

Die Zieladresse muß in keinem Bit mit der Adresse 0.0.0.0 übereinstimmen. Das ist eigentlich eine Abkürzung für jede Adresse. Die 80 gibt den Ziel-Port an, in diesem Fall WWW. Sie können für den Port jeden Eintrag nehmen, der in der Datei /etc/ services vorkommt. So hätten Sie auch ebensogut -D 0/0 www verwenden können.

ipfwadm akzeptiert Netzmasken in einer Form, die Ihnen vielleicht nicht so vertraut ist. Die /nn-Notation gibt an, wie viele Bits der übergebenen Adresse signifikant sind (d.h. die Länge der Maske). Die Bits werden dabei immer von links nach rechts gezählt. Einige allgemeine Beispiele sind in Tabelle 9.1 aufgelistet.

Tabelle 9.1: Übliche Bitwerte für die Netzmaske

Netzmaske Bits
255.0.0.0 8
255.255.0.0 16
255.255.255.0 24
255.255.255.128 25
255.255.255.192 26
255.255.255.224 27
255.255.255.240 28
255.255.255.248 29
255.255.255.252 30

Bereits oben erwähnten wir, daß ipfwadm einen kleinen Trick benutzt, um das Hinzufügen solcher Regeln einfacher zu machen. Dabei handelt es sich um die Option –b, die aus dem Befehl eine bidirektionale Regel macht.

Das bidirektionale Flag ermöglicht es uns, unsere beiden Regeln zu einer einzigen zusammenzufassen:

# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80 -b

Eine wichtige Verbesserung

Betrachten Sie unseren Regelsatz mal etwas genauer. Sehen Sie, daß es immer noch eine Angriffsmethode gibt, mit der ein Außenstehender unsere Firewall durchbrechen könnte?

Unseren Regelsatz gestattet allen Datagrammen von außerhalb, unser Netzwerk mit dem Quell-Port 80 zu passieren. Das gilt auch für alle Datagramme, bei denen das SYN-Bit gesetzt ist! Das SYN-Bit ist genau das, was ein TCP-Datagramm zu einer Verbindungsaufforderung macht. Wenn nun eine außenstehende Person privilegierten Zugriff auf einen Host hat, kann sie zu jedem unserer Hosts durch unsere Firewall hindurch Kontakt aufnehmen, wenn sie auch den Port 80 benutzt. So etwas hatten wir nun wirklich nicht beabsichtigt.

Zum Glück gibt es aber auch dafür eine Lösung. Der Befehl ipfwadm kennt nämlich ein weiteres Flag, mit dem wir Regeln für Datagramme mit SYN-Flags bilden können. Lassen Sie uns das Beispiel verändern, indem wir eine solche Regel aufnehmen:

# ipfwadm -F -a deny -P tcp -S 0/0 80 -D 172.16.10.0/24 -y 
# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80 -b

Das Flag -y sorgt dafür, daß die Regel nur für Datagramme mit gesetztem SYN-Flag gilt. Unsere neue Regel sagt somit folgendes aus: “Verweigere alle an unser Netzwerk gerichteten TCP-Datagramme mit dem Quell-Port 80 und gesetztem SYN-Bit” oder: “Verwirf alle Verbindungsanfragen von Hosts, die den Port 80 benutzen”.

Warum haben wir diese spezielle Regel vor die Hauptregel gestellt? IP-Firewall-Regeln werden immer “von oben nach unten” abgearbeitet, so daß immer die erstbeste passende Regel genommen wird. Zu den Datagrammen, die wir aufhalten wollen, passen beide Regeln. Daher müssen wir die deny-Regel vor die accept-Regel stellen.

Auflistung unserer Regeln

Nachdem wir unsere Regeln eingegeben haben, lassen wir sie uns von ipfwadm mit folgendem Befehl anzeigen:

# ipfwadm -F -l
Diese Anweisung erzeugt eine Liste aller konfigurierten Weiterleitungsregeln. Die Ausgabe sollte etwa wie folgt aussehen:
# ipfwadm -F -l 
IP firewall forward rules, default policy: accept 
type  prot source               destination          ports 
deny  tcp  anywhere             172.16.10.0/24       www -> any 
acc   tcp  172.16.1.0/24        anywhere             any -> www
Falls ein Eintrag in der Datei /etc/service existiert, gibt ipfwadm anstelle der Portnummer den zugehörigen Service-Namen direkt aus.

Die Standardausgabe liefert uns nicht alle wichtigen Informationen. Wir sehen darin zum Beispiel nicht die Auswirkungen des Arguments -y. Sie erhalten aber eine ausführliche Liste, wenn Sie ipfwadm zusätzlich die Option -e (extended output) angeben. Die Liste wird dann allerdings so breit, daß wir sie hier nicht vollständig abdrucken können. In der Spalte opt (options) wird die Option -y angezeigt, die die SYN-Pakete kontrolliert:

# ipfwadm -F -l -e 
P firewall forward rules, default policy: accept  
pkts bytes type  prot opt  tosa tosx ifname  ifaddress   source        ... 
   0     0 deny  tcp  --y- 0xFF 0x00 any     any         anywhere      ... 
   0     0 acc   tcp  b--- 0xFF 0x00 any     any         172.16.1.0/24 ...

Ein anspruchsvolleres Beispiel

Das vorige Beispiel war recht einfach. Nicht alle Netzwerkdienste sind so leicht zu konfigurieren wie der WWW-Service. In der Praxis ist eine Firewall-Konfiguration wesentlich komplizierter. Sehen wir uns dazu ein anderes gängiges Beispiel an, diesmal FTP. Wir wollen unseren internen Netzwerkbenutzern das Einloggen in FTP-Servern im Internet gestatten, um Dateien zu lesen und zu schreiben. Den umgekehrten Weg, nämlich das Einloggen in unsere FTP-Server von außerhalb, wollen wir aber unterbinden.

Wir wissen, daß FTP zwei TCP-Ports benutzt: Port 20 (ftp-data für Daten) und Port 21 (ftp zur Steuerung). Also:

# ipfwadm -a deny -P tcp -S 0/0 20 -D 172.16.1.0/24 -y 
# ipfwadm -a accept -P tcp -S 172.16.1.0/24 -D 0/0 20 -b 
# 
# ipfwadm -a deny -P tcp -S 0/0 21 -D 172.16.1.0/24 -y 
# ipfwadm -a accept -P tcp -S 172.16.1.0/24 -D 0/0 21 -b
Ist das alles? Nun, nicht unbedingt. FTP-Server können in zwei verschiedenen Betriebsmodi arbeiten: im passiven Modus und im aktiven Modus.1 Im passiven Modus wartet der FTP-Server auf eine Verbindungsaufnahme des Client. Im aktiven Modus dagegen stellt der FTP-Server selbst eine Verbindung zum Client her. Normal ist der aktive Modus. Die Unterschiede werden in Abbildung 9.3 dargestellt.

Viele, aber leider nicht alle FTP-Server stellen im aktiven Modus ihre Datenverbindung über den Port 20 her, was uns die Sache etwas leichter macht.2

Abbildung 9.3: Betriebsmodi von FTP-Servern

Aber was haben wir damit zu schaffen? Werfen wir mal einen Blick auf unsere Regel für Port 20, den FTP-Daten-Port. Die Regel, wie sie dasteht, nimmt an, daß die Verbindung von unserem Client zum Server aufgebaut wird. Gut, das funktioniert für den passiven Modus. Aber wir bekommen große Probleme, wenn wir eine geeignete Regel für FTP im aktiven Modus schreiben wollen, weil wir nicht unbedingt wissen, welchen Port der Server dafür nimmt. Öffnen wir unsere Firewall für eingehende Verbindungen für alle möglichen Ports, lassen wir zu, daß alle unsere Netzwerkdienste, die für die eingehenden Verbindungen zuständig sind, angreifbar werden.

Der sicherste Weg aus diesem Dilemma besteht darin, alle unsere Benutzer dazu zu verpflichten, nur passive Verbindungen herzustellen. Die meisten FTP-Server und viele FTP-Clients arbeiten ohnehin so. Der populäre ncftp-Client unterstützt auch den passiven Modus, verlangt dafür aber gegebenenfalls eine kleine Konfigurationsänderung. Viele WWW-Browser wie Netscape unterstützen auch den passiven FTP-Modus; es ist also nicht so schwer, geeignete Software zu finden. Alternativ dazu können Sie aber auch einen FTP-Proxy-Server verwenden, der Verbindungen vom internen Netzwerk akzeptiert und Verbindungen nach außen hin etabliert.

Beim Aufbau Ihrer Firewall werden Ihnen vielleicht mehrere solche Probleme begegnen. Sie sollten immer sorgfältig überdenken, wie ein Netzwerkdienst überhaupt funktioniert, bevor Sie sich die Formulierung angemessener Regelsätze vornehmen. Eine praxistaugliche Firewall-Konfiguration kann zu einer sehr komplizierten Angelegenheit werden.

Übersicht über die Argumente von ipfwadm

ipfwadm kennt viele verschiedene Argumente, die die Konfiguration von IP-Firewalls beeinflussen. Die allgemeine Syntax ist:

ipfwadm Kategorie Befehl Parameter [Optionen]

Sehen wir sie uns mal im einzelnen an.

Kategorien

Eine Kategorie teilt der Firewall mit, welche Art von Firewall-Regel Sie konfigurieren. Als Kategorie wird genau eines der nachfolgenden Argumente übergeben:

-I

Eingangsregel

-O

Ausgangsregel

-F

Weiterleitungsregel

Befehle

Ein Befehl teilt der Firewall mit, welche Aktion durchgeführt werden soll. Mindestens einer der nachfolgenden Befehle wird übergeben und wirkt sich nur auf die Regeln der angegebenen Kategorie aus:

-a [policy]

Fügt eine neue Regel am Ende der Liste mit bereits vorhandenen an.

-i [policy]

Fügt eine neue Regel in die Liste mit bereits vorhandenen ein.

-d [policy]

Entfernt eine vorhandene Regel

-p policy

Setzt eine Standardeinstellung

-l

Listet alle vorhandenen Regeln auf

-f

Löscht alle vorhandenen Regeln

Die für die IP-Firewall relevanten Einstellungen und ihre Bedeutungen sind:

accept

Passende Datagramme können empfangen, weitergeleitet oder übertragen werden

deny

Verhindert den Empfang, die Weitergabe und die Übertragung passender Datagramme

reject

Verhindert den Empfang, die Weitergabe und die Übertragung passender Datagramme und schickt dem Host, der das Datagramm gesendet hat, eine ICMP-Fehlermeldung.

Parameter

Die Parameter geben an, für welche Datagramme diese Regel gilt. Mindestens einer der folgenden Parameter muß angegeben werden:

-P protocol

Kann TCP, UDP, ICMP oder auch alles sein. Beispiel:

-P tcp

-S address[/mask] [port]

Die Quell-IP-Adresse, zu der diese Regel paßt. Wenn Sie keine Netzmaske angeben, wird /32 genommen. Optional können Sie auch angeben, für welche Ports diese Regel gelten soll. Damit es funktioniert, müssen Sie mit dem Argument -P noch das Protokoll angeben. Wenn Sie keinen Port oder Port-Bereich angeben, wird “all” genommen. Für die Spezifizierung der Ports können Sie auch ihre Namen verwenden, wie sie in /etc/services angegeben sind. Im Fall des ICMP-Protokolls wird das Port-Feld benutzt, um die ICMP-Datagrammtypen anzugeben. Port-Bereiche können auch umschrieben werden. Benutzen Sie dafür folgende Syntax: Anfangs-Port:End-Port. Hier ein Beispiel:

-S 172.29.16.1/24 ftp:ftp-data

-D address[/mask] [port]

Die Ziel-IP-Adresse, zu der diese Regel paßt. Sie wird auf dieselbe Weise angegeben wie bei den oben beschriebenen Quell-IP-Adressen. Hier ein Beispiel:

-D 172.29.16.1/24 smtp

-V address

Die Adresse der Netzwerkschnittstelle, die das Datenpaket empfängt (-I) oder sendet (-O). Damit können wir spezielle Regeln festlegen, die nur für bestimmte Netzwerk-Interfaces in unserer Maschine gelten. Beispiel:

-V 172.29.16.1

-W name

Der Name der Netzwerkschnittstelle. Dieses Argument funktioniert genauso wie das Argument -V, nur daß Sie hier den Namen anstelle der Adresse der Schnittstelle angeben. Beispiel:

-W ppp0

Optionale Argumente

Die folgenden Argumente sind manchmal sehr nützlich:

-b

Dieses Flag wird für den bidirektionalen Modus benutzt. Es akzeptiert Datenverkehr zwischen den angegebenen Quell- und Zieladressen in beiden Richtungen. Das erspart Ihnen die Ausarbeitung zweier separater Regeln: eine für ausgehende Datagramme und eine für eingehende Datagramme.

-o

Aktiviert die Protokollierung passender Datagramme im Kernel-Log. Jedes Datagramm, das zu dieser Regel paßt, wird in Form einer Kernel-Nachricht protokolliert. Das ist nützlich zur Aufspürung nichtautorisierter Zugriffe.

-y

Diese Option wird für TCP-Datagramme verwendet und bewirkt, daß die Regel nur solche Datagramme behandelt, die eine TCP-Verbindung aufzubauen versuchen. Dabei handelt es sich um Datagramme, deren SYN-Bit gesetzt und deren ACK-Bit nicht gesetzt ist. Nützlich ist diese Option zur Filterung von TCP-Verbindungsversuchen. Andere Protokolle bleiben davon unberührt.

-k

Wird zur Erkennung von TCP-Bestätigungs-Datagrammen benutzt. Diese Option veranlaßt die Regel, nur solche Datagramme zu verarbeiten, bei denen es sich um Bestätigungen von TCP-Verbindungsversuchen handelt. Dazu gehören ausschließlich Datagramme, deren ACK-Bit gesetzt ist. Diese Option ist nur zur Filterung von TCP-Verbindungsversuchen vorgesehen und für alle anderen Protokolle wirkungslos.

Arten von ICMP-Datagrammen

Alle Firewall-Konfigurationsbefehle ermöglichen es Ihnen, die Arten der ICMP-Datagramme festzulegen. Im Gegensatz zu den TCP- und UCP-Ports gibt es keine bequem handhabbare Konfigurationsdatei, in der die Datagramm-Arten und ihre Bedeutungen beschrieben sind. Die ICMP-Datagramm-Arten sind in RFC-1700 (Assigned Numbers RFC) definiert. Außerdem werden sie in einer der Standard-C-Bibliotheks-Header-Dateien aufgelistet. Dabei handelt es sich um die Datei /usr/include/netinet/ip_icmp.h, die zur GNU-Standardbibliothek gehört und von C-Programmierern benutzt wird, um Netzwerksoftware zu schreiben, die das ICMP-Protokoll verwendet. Für Sie haben wir die ICMP-Datagramme nochmal in Tabelle 9.2 aufgelistet. Sie finden auch die namentlichen Bezeichnungen (Mnemonics) der Datagramm-Arten, wie sie vom Befehl iptables verstanden werden.

Tabelle 9.2: Arten von ICMP-Datagrammen

Typ-Nummer iptables Mnemonic Beschreibung
0 echo-reply Antwort auf ein Echo Request
3 destination-unreachable Ziel nicht erreichbar
4 source-quench Quelle drosseln
5 redirect Umleitung
8 echo-request Echo-Anforderung
11 time-exceeded Das TTL-Feld hat den Wert 0.
12 parameter-problem Ungültiges Header-Feld
13 timestamp-request Anforderung eines Zeitstempels
14 timestamp-reply Zeitantwort
15 none Informationsanforderung
16 none Informationsantwort
17 address-mask-request Adreßmasken-Anforderung
18 address-mask-reply Adreßmasken-Antwort



1.

Der aktive FTP-Modus wird nicht besonders offensichtlich mit dem Befehl PORT eingestellt. Den passiven Modus aktiviert man mit PASV.

2.

Ein Beispiel für einen FTP-Server, der das nicht macht, ist der ProFTPd-Dämon, zumindest nicht in älteren Versionen.


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel


Weitere Informationen zum Linux - Wegweiser für Netzwerker

Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center


O'Reilly Home|O'Reilly-Partnerbuchhandlungen|Bestellinformationen
Kontakt|Über O'Reilly|Datenschutz

© 2001, O'Reilly Verlag