Suche im Katalog
Linux Netzwerker-Handbuch

Linux Netzwerker-Handbuch


Tony 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


TOC PREV NEXT INDEX

Kapitel 7

TCP/IP-Firewall

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.


Der Aufbau sicherer Firewalls ist eine Wissenschaft für sich. Er erfordert ein gutes Verständnis der zugrunde liegenden Technik. Nicht weniger wichtig ist aber auch das Verständnis der Philosophie, die hinter dem Firewall-Design steckt. Wir behandeln in diesem Buch nicht alles, was Sie darüber wissen sollten, und empfehlen Ihnen daher dringend, selbst einige Nachforschungen anzustellen, bevor Sie einem bestimmten Firewall-Design Ihr Vertrauen schenken.

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.

Angriffsmethoden

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:

Unautorisierter Zugriff
Das bedeutet schlicht und einfach, dass Leute, die Ihre Rechnerdienste eigentlich nicht benutzen dürften, sich dennoch mit ihnen verbinden und sie nutzen können. Beispielsweise könnten Leute von außerhalb Ihres Unternehmens versuchen, sich Zugang zu Ihrem Buchhaltungssystem oder Ihrem NFS-Server zu verschaffen.
Es gibt verschiedene Möglichkeiten, um solche Angriffe abzuwehren, indem Sie genau festlegen, wer auf diese Dienste zugreifen darf. Sie können allen anderen als den dafür vorgesehenen Personen den Zugriff über das Netzwerk verwehren.
Ausnutzen allgemein bekannter Programmschwächen
Einige Programme und Netzwerkdienste waren ursprünglich nicht für Anwendungen mit strengen Sicherheitsanforderungen ausgelegt und enthalten Schwachstellen, die sie für Angriffe verwundbar machen. Die BSD-Remote-Dienste (rlogin, rexec usw.) sind ein Beispiel dafür.
Der beste Weg, sich gegen diese Art von Angriff zu schützen, besteht darin, alle verwundbaren Dienste abzuschalten oder Alternativen dazu zu suchen. Sie sollten beispielsweise nur solche Dienste installieren, ausführen und anbieten, die Sie unbedingt brauchen. Beginnen Sie damit, dass Sie überhaupt keine Netzwerkdienste aktivieren, und arbeiten Sie sich von dort nach oben. Mit Hilfe des Befehls netstat können Sie ermitteln, an welchen Ports Ihr Host lauscht. Sorgen Sie dafür, dass diese Liste so kurz wie möglich ist, machen Sie sich außerdem klar, wofür genau die einzelnen Ports benötigt werden. Mit Ausnahme von Secure Shell (SSH) sollten Sie auf dem Firewall-Rechner überhaupt keine Netzwerkdienste betreiben.

SSH und iptables
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.

Verfolgen Sie Fehlerdatenbanken und Patch-Listen und halten Sie Ihre Systeme auf dem neuesten Stand. Zwei der beliebtesten Fehlerdatenbanken sind die Bugtraq-Datenbank, online verfügbar unter http://www.securityfocus.com/bid (siehe auch http://www.securityfocus.com/rss für Informationen über den Zugriff auf Bugtraq über einen RSS-Feed), und die CVE-Datenbank (Common Vulnerabilities and Exposures), on-line verfügbar unter http://cve.mitre.org/ (siehe auch den RSS unter http://www.opensec.org/feeds/cve/latest.xml). Die meisten Linux-Distributoren bieten Werkzeuge zum Herunterladen und Installieren von Updates an. Red Hat hat ein Dienstprogramm namens yum, bei SuSE gibt es YaST Online Update (YOU) und bei Debian apt-get.
Denial of Service
Denial-of-Service-Angriffe bewirken, dass die angegriffenen Dienste oder Programme ihre Funktionsfähigkeit verlieren oder andere Benutzer daran gehindert werden, diese Dienste und Programme zu nutzen. Auf der Netzwerkebene geschieht das zum Beispiel, indem sorgfältig konstruierte »bösartige« Datagramme gesendet werden, die zur Unterbrechung von Netzwerkverbindungen führen. Aber auch auf Applikationsebene können Programme durch sorgfältig zusammengestellte Befehlsfolgen dazu gebracht werden, extrem langsam oder gar funktionsuntüchtig zu werden.
Der beste Weg, das Risiko eines Denial-of-Service-Angriffs zu verringern, besteht darin, von vornherein zu verhindern, dass verdächtiger Netzwerkverkehr oder verdächtige Programmbefehlsfolgen Ihren Host überhaupt erst erreichen. Hier ist es von Vorteil, die Details der Angriffsmethoden zu kennen. Sie sollten sich daher immer wieder über die neuesten Angriffsmethoden informieren, um auf dem Laufenden zu bleiben.
Spoofing
Bei dieser Angriffsart wird ein Host bzw. eine Anwendung dazu gebracht, das Verhalten eines anderen Hosts bzw. einer anderen Anwendung vorzutäuschen. Typisch für diese Angriffe ist, dass man den Angreifer für einen »unschuldigen« Host hält, wenn man die IP-Adressen in den Netzwerkpaketen verfolgt. So verwendet zum Beispiel ein gut dokumentiertes Angriffsprogramm diese Methode, um eine Schwäche im rlogin-Dienst von BSD auszunutzen. Es errät TCP-Sequenznummern und gibt so eine Verbindung von einem anderen Host vor.
Um sich vor solchen Angriffen zu schützen, müssen Sie die Authentizität von Datagrammen und Befehlsfolgen verifizieren (dabei hilft eine Kombination aus Filterung und Proxy-Servern). Vermeiden Sie das Routen von Datagrammen mit unzulässigen Quelladressen. Verwenden Sie Betriebssysteme (wie Linux) mit unberechenbaren Verbindungskontrollmechanismen, etwa durch TCP-Sequenznummern und die Belegung dynamischer Port-Adressen.
Wenn Sie Hosts mit Betriebssystemen, die unsichere Sequenznummernalgorithmen verwenden, hinter eine Linux-Firewall setzen, die Network Address Translation ausführt, dann können Sie sie trotz der geringeren Sicherheit weiter benutzen, da der Firewall-Rechner für die Kommunikation mit der Außenwelt seine eigenen Sequenznummernalgorithmen mitbringt.
Lauschangriffe
Das ist die einfachste Angriffsform. Dabei wird ein Host so konfiguriert, dass er Daten »abhorcht«, die ihn eigentlich nichts angehen (indem seine Netzwerkschnittstelle in den Promiscuous-Modus gesetzt wird und alle Pakete überwacht, die dieses Netzwerksegment durchlaufen). Sorgfältig geschriebene Lauschangriffsprogramme können Benutzernamen und Kennwörter von Benutzer-Logins in Netzwerkverbindungen ausspähen. Besonders Broadcast-Netzwerke wie »unswitched« Ethernet-Netzwerke (Ethernet-Netzwerke, in denen Hubs anstelle von Switches als aktive Netzwerkkomponenten zum Einsatz kommen) sind für diese Art von Angriff anfällig, wobei jedoch ein physischer Zugriff auf das Ethernet-Netzwerk erforderlich ist. Drahtlose Netzwerke weisen ähnliche Probleme auf und sind noch stärker gefährdet, da kein physischer Zugang nötig ist; eine gewisse Nähe ist ausreichend.
Zum Schutz gegen diese Angriffsform wird empfohlen, die Verwendung von Broadcast-Netzwerktechniken zu vermeiden und besonders auf die Verschlüsselung von Daten zu achten.
Es ist komplizierter, aber nicht unmöglich, in einer »geswitchten« Umgebung Pakete auszuspähen. Manche Ethernet-Switches besitzen administrative Einstellungen oder sogar Fehlermodi, die sie veranlassen, alle Pakete an einem oder mehreren ihrer Ports zu kopieren.

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.

Was ist eine Firewall?

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.
Abbildung 7-1
Die zwei gebräuchlichsten Firewall-Designs

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.

Was ist IP-Filterung?

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:

  • Protokollarten: TCP, UDP, ICMP usw.
  • Portnummer (für TCP/UDP)
  • Pakettyp: SYN/ACK, Daten, ICMP Echo Request usw.
  • Paketquelladresse: woher es kam
  • Paketzieladresse: wohin es geht
  • 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:

  • Pakete mit einer Quelladresse im Netzwerk der virtuellen Brauerei, einer beliebigen Zieladresse und dem Zielport 80 (WWW)
  • Pakete mit einer Zieladresse im Netzwerk der virtuellen Brauerei und einer beliebigen Quelladresse vom Quellport 80 (WWW)
  • 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.

    Netfilter und iptables

    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.

    Beispielhafte iptables-Befehle

    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.

    Ein Beispiel für Paketfilterung

    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.

    iptables -t filter -P FORWARD DROP
    iptables -t filter -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
    iptables -t filter -A FORWARD -i eth1 -p tcp --sport 80 -j ACCEPT

    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«.

    Tabelle 7-1
    Nähere Betrachtung der Argumente des Befehls iptables 
    Komponente
    Beschreibung
    -t filter
    Agiere auf der filter-Tabelle (eigentlich Standard)...
    -A FORWARD
    ...indem die folgende Regel an ihre FORWARD-Kette angehängt wird.
    -i eth0
    Erfasse alle Pakete, die an der Netzwerkschnittstelle eth0 (innen) ankommen...
    -p tcp
    ...und das Protokoll tcp (TCP/IP) benutzen
    --dport 80
    ...und für Port 80 auf dem (externen) Zielhost gedacht sind.
    -j ACCEPT
    Akzeptiere das Paket zur Weiterleitung.

    Ein Masquerading-Beispiel

    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):

    iptables -t nat -P POSTROUTING DROP
    iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -j MASQUERADE
    Ein NAT-Beispiel

    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):

    iptables -t nat -A PREROUTING -i eth1 -p tcp -dport 80 \
    -j DNAT --to-destination 192.168.1.3:8080

    Tabelle 7-2 zeigt, was dieser beispielhafte iptables-Befehl bedeutet.

    Tabelle 7-2
    Nähere Betrachtung der Argumente des Befehls iptables 
    Komponente
    Beschreibung
    -t nat
    Agiere auf der nat-Tabelle (Network Address Translation)...
    -A PREROUTING
    ...indem die folgende Regel an ihre PREROUTING-Kette angehängt wird.
    -i eth1
    Erfasse Pakete, die an der Netzwerkschnittstelle eth1 ankommen...
    -p tcp
    ...und das Protokoll tcp (TCP/IP) benutzen
    --dport 80
    ...und für den lokalen Port 80 gedacht sind.
    -j DNAT
    Springe zum Ziel DNAT (Destination Network Address Translation)...
    --to-destination 192.168.1.3:8080
    ...und ändere die Zieladresse in 192.168.1.3 und den Zielport auf 8080.

    iptables-Konzepte

    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.


    Es ist üblich, sich auf »die PREROUTING-Kette der nat-Tabelle« zu beziehen, wodurch es so aussieht, als würden die Ketten zu Tabellen gehören. Allerdings stehen Ketten und Tabellen nur teilweise zueinander in Beziehung und keine »gehört« wirklich zu einer anderen. Ketten repräsentieren Einstiegspunkte im Paketfluss, und Tabellen repräsentieren die Arten der Verarbeitung, die auftreten können. Abbildung 7-2 zeigt alle zulässigen Kombinationen sowie die Reihenfolge, in der sie von den Paketen erkannt werden, die das System durchlaufen.

    Der Paketfluss

    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.
    Abbildung 7-2
    Alle Einstiegspunkte in den Netzwerkpaketfluss

    In Abbildung 7-3 repräsentieren die hellgrauen Kästen Ketten und Tabellen, die nicht an NAT beteiligt sind.
    Abbildung 7-3
    Netzwerkpaketfluss und Einstiegspunkte für NAT

    Abbildung 7-4 zeigt, wie Pakete das System für die Paketfilterung durchlaufen.
    Abbildung 7-4
    Netzwerkpaketfluss und Einstiegspunkte für die Filterung

    Tabelle 7-3 zeigt die fünf »Einstiegspunkte« und beschreibt die Stellen im Paketfluss, an denen sie es Ihnen erlauben, eine Verarbeitung festzulegen.


    Nur falls es Sie interessiert, die Einstiegspunkte werden in der Kernel-Header-Datei /usr/include/linux/netfilter_ipv4.h mit Namen wie NF_IP_FORWARD, NF_IP_LOCAL_{IN,OUT} und NF_IP_{PRE,POST}_ROUTING definiert.
    Tabelle 7-3
    Einstiegspunkte 
    Einstieg
    Erlaubt es Ihnen, Pakete zu verarbeiten, ...
    FORWARD
    die durch einen Gateway-Computer laufen, an einer Schnittstelle hineingehen und an einer anderen Schnittstelle sofort wieder hinausgehen.
    INPUT
    direkt bevor sie an einen lokalen Prozess ausgeliefert werden.
    OUTPUT
    direkt nachdem sie durch einen lokalen Prozess erzeugt wurden.
    POSTROUTING
    direkt bevor sie an eine Netzwerkschnittstelle geliefert werden.
    PREROUTING
    direkt nachdem sie von einer Netzwerkschnittstelle eintreffen (nach dem Abweisen aller Pakete, die daraus resultieren, dass die Schnittstelle im Promiscuous-Modus ist, und nach dem Validieren einer Prüfsumme).

    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.

    Drei Methoden zum Ausführen der Filterung

    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:
    Abbildung 7-5
    Die Stufen der Verarbeitung eines IP-Pakets

    1. Das IP-Paket wird empfangen.
    Das eingehende IP-Paket wird untersucht, um festzustellen, ob es für einen Prozess auf diesem Host bestimmt ist.
    2. Ist das Paket für diesen Host gedacht, wird es lokal verarbeitet.
    3. Ist es nicht für diesen Host bestimmt (und ist IP-Forwarding aktiviert), dann wird die Routing-Tabelle nach einer passenden Route durchsucht, und das Paket wird an die entsprechende Schnittstelle weitergeleitet. Kann keine Route gefunden werden, wird es abgelehnt.
    4. Pakete von lokalen Prozessen werden an die Routing-Software geschickt, damit diese sie an die entsprechende Schnittstelle weiterleitet.
    Das ausgehende IP-Paket wird untersucht, um festzustellen, ob es dafür eine gültige Route gibt; falls nicht, wird es verworfen (komplett ignoriert) oder abgewiesen (ignoriert, nachdem eine ICMP-Nachricht verschickt wurde, die anzeigt, dass es keine Route zum Zielhost gibt).
    5. Das IP-Paket wird übertragen.

    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.

    Tabellen

    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.

    Tabelle 7-4
    Eingebaute Tabellen 
    Tabelle
    Beschreibung
    filter
    Wird verwendet, um Regeln für die Art von Verkehr festzulegen, der in den Computer hinein, durch ihn hindurch und aus ihm heraus erlaubt ist. Solange Sie sich nicht ausdrücklich auf eine andere Tabelle beziehen, operiert iptables standardmäßig auf Ketten innerhalb dieser Tabelle.
    Die eingebauten Ketten sind FORWARD, INPUT und OUTPUT.
    mangle
    Wird für eine spezialisierte Paketanpassung wie etwa das Entfernen von IP-Optionen verwendet (wie mit der Erweiterung IPV4OPTSSTRIP).
    Die eingebauten Ketten sind FORWARD, INPUT, OUTPUT, POSTROUTING und PREROUTING.
    nat
    Wird zusammen mit einer Verbindungsverfolgung verwendet, um Verbindungen für NAT umzuleiten; normalerweise basiert diese Umleitung auf den Quell- oder Zieladressen.
    Die eingebauten Ketten sind OUTPUT, POSTROUTING und PREROUTING.

    Die vorgegebene Tabelle ist die Tabelle filter. Falls Sie in einem iptables-Befehl keine Tabelle ausdrücklich angeben, wird filter angenommen.

    Ketten

    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).

    Regeln

    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.

    Filter

    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

    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.

    Tabelle 7-5
    Eingebaute 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.

    Linux für den Firewall-Betrieb vorbereiten

    Um eine IP-Firewall zu bauen, muss der Linux-Kernel mit entsprechender Unterstützung konfiguriert werden. Führen Sie dazu folgenden Befehl aus:

    # make menuconfig

    Damit wählen Sie die für Ihren Kernel passenden Optionen.2 In den Kerneln ab 2.4 sollten Sie folgende Optionen einstellen:

    Networking options --->
    [*] Network packet filtering (replaces ipchains)
    IP: Netfilter Configuration --->
    .
    <M> Userspace queueing via NETLINK (EXPERIMENTAL)
    <M> IP tables support (required for filtering/masq/NAT)
    <M> limit match support
    <M> MAC address match support
    <M> netfilter MARK match support
    <M> Multiple port match support

    <M> TOS match support
    <M> Connection state match support
    <M> Unclean match support (EXPERIMENTAL)
    <M> Owner match support (EXPERIMENTAL)
    <M> Packet filtering
    <M> REJECT target support
    <M> MIRROR target support (EXPERIMENTAL)
    .
    <M> Packet mangling
    <M> TOS target support
    <M> MARK target support
    <M> LOG target support
    <M> ipchains (2.2-style) support
    <M> ipfwadm (2.0-style) support

    Das Kernel-Modul laden

    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:

    # modprobe ip_tables

    Abwärtskompatibilität mit ipfwadm und ipchains

    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:

    # rmmod ip_tables
    # modprobe ipchains
    # ipchains optionen

    iptables benutzen

    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:

    # iptables befehl regelspezifikation erweiterungen

    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.

    Tabelle 7-6
    Sonstige iptables-Optionen 
    Option
    Beschreibung
    -c pakete bytes
    Setzt in Kombination mit den Unterbefehlen -A, -I oder -R für die neue oder modifizierte Regel den Paketzähler auf pakete und den Bytezähler auf bytes.
    --exact
    Synonym für -x.
    -h
    Gibt Informationen über die iptables-Benutzung aus. Steht diese Option hinter -m filter oder -j ziel, dann wird auch jede zusätzliche Hilfe angezeigt, die mit der Erweiterung filter bzw. ziel zusammenhängt.
    --help
    Synonym für -h.
    -j ziel [optionen]
    Legt fest, was mit Paketen zu tun ist, die von dieser Regel erfasst werden. Das ziel kann der Name einer benutzerdefinierten Kette, eines der eingebauten Ziele oder eine iptables-Erweiterung sein (in diesem Fall könnte es zusätzliche optionen geben).
    --jump
    Synonym für -j.
    --line-numbers
    Gibt in Kombination mit dem Unterbefehl -L Nummern für die Regeln in jeder Kette aus, so dass Sie sich über einen Index auf die Regeln beziehen können, wenn Sie Regeln in eine Kette einfügen (über -I) oder aus einer Kette löschen (über -D). Denken Sie daran, dass sich die Zeilennummerierung ändert, wenn Sie Zeilen in eine Kette einfügen oder aus ihr löschen.
    -m filter [optionen]
    Ruft einen erweiterten filter auf, möglicherweise mit zusätzlichen optionen.
    --match
    Synonym für -m.
    -M befehl
    Wird verwendet, um ein iptables-Modul zu laden (mit neuen Zielen oder Filtererweiterungen), wenn Regeln angehängt, eingefügt oder ersetzt werden.
    --modprobe=befehl
    Synonym für -M.
    -n
    Zeigt numerische Adressen und Ports an, anstatt Domainnamen für die IP-Adressen und Dienstnamen für die Portnummern nachzuschlagen.
    Das kann vor allem dann sinnvoll sein, wenn Ihr DNS-Dienst langsam oder ausgefallen ist.
    --numeric
    Synonym für -n.
    --set-counters
    Synonym für -c.
    -t tabelle
    Führt den angegebenen Unterbefehl auf tabelle aus. Wenn diese Option nicht verwendet wird, arbeitet der Unterbefehl standardmäßig auf der Tabelle filter.
    --table
    Synonym für -t.
    -v
    Erzeugt eine ausführliche Ausgabe.
    --verbose
    Synonym für -v.
    -x
    Gibt anstelle des standardmäßigen abgekürzten Formats mit metrischen Suffixen (K, M oder G) die exakten Zahlen für die Paket- und Bytezähler aus.

    Hilfe erhalten

    iptables bietet einige Quellen für Online-Hilfe. Über die folgenden Befehle erhalten Sie grundlegende Informationen:

    iptables -h | --help
    iptables -m filter -h
    iptables -j ZIEL -h
    man iptables

    Manchmal gibt es Widersprüche zwischen diesen Informationsquellen.



    Die iptables-Unterbefehle

    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.


    Die Manpage für den iptables-Befehl in der Version 1.2.7a zeigt eine Option -C in der Synopsis, es gibt allerdings kein -C für den iptables-Befehl.
    Tabelle 7-7
    Optionen für iptables-Unterbefehle 
    Option
    Beschreibung
    -A kette regel
    Hängt regel an kette an.
    --append
    Synonym für -A.
    -D kette
    [index | regel]
    Löscht die Regel an der Position index oder die passende regel aus der kette.
    --delete
    Synonym für -D.
    --delete-chain
    Synonym für -X.
    -E kette neuekette
    Benennt kette in neuekette um.
    -F [kette]
    Löscht alle Regeln aus der kette (oder aus allen Ketten, falls keine Kette angegeben wurde).
    --flush
    Synonym für -F.
    -I kette [index]
    regel
    Fügt regel in kette ein, am Anfang der Kette oder vor der Regel an der Position index.
    --insert
    Synonym für -I.
    -L [kette]
    Listet die Regeln für die kette auf (oder für alle Ketten, falls keine Kette angegeben wurde).
    --list
    Synonym für -L.
    -N kette
    Erzeugt eine neue benutzerdefinierte kette.
    --new-chain
    Synonym für -N. Normalerweise abgekürzt mit --new.
    -P kette ziel
    Setzt die Standardrichtlinie für die eingebaute kette auf ziel (gilt nur für eingebaute Ketten und Ziele).
    --policy
    Synonym für -P.
    -R kette index regel
    Ersetzt die Regel an der Position index der kette durch die neue regel.
    --rename-chain
    Synonym für -E.
    --replace
    Synonym für -R.
    -V
    Gibt die Version von iptables aus.
    --version
    Synonym für -V.
    -X [kette]
    Löscht die benutzerdefinierte kette oder alle benutzerdefinierten Ketten, falls keine Kette angegeben wurde.
    -Z kette
    Setzt die Paket- und Bytezähler für kette (oder für alle Ketten, falls keine angegeben wurde) auf null.
    --zero
    Synonym für -Z.

    Grundlegende iptables-Filter

    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).


    Manche Optionen können negiert werden, indem direkt vor der Option ein optionales Ausrufezeichen, das von Leerzeichen eingeschlossen ist, verwendet wird. Optionen, die dies zulassen, werden mit [!] gekennzeichnet. In den folgenden Abschnitten wird nur die nicht-negierte Bedeutung beschrieben, da Sie die invertierte Bedeutung leicht daraus ableiten können.

    Internet Protocol-(IPv4-)Filter

    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.

    Tabelle 7-8
    Internet-Protocol-Filteroptionen 
    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.

    Tabelle 7-9
    Gebräuchliche IP-Protokolle 
    Name
    Nummer(n)
    Beschreibung
    ALL
    1, 6, 17
    Entspricht überhaupt keiner Protokollangabe
    icmp
    1
    Internet Control Message Protocol
    tcp
    6
    Transmission Control Protocol
    udp
    17
    User Datagram Protocol

    Ethernet Media Access Controller-Filter

    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.


    Dieser Filter steht nur dann zur Verfügung, wenn Ihr Kernel mit aktiviertem CONFIG_IP_NF_MATCH_MAC konfiguriert wurde.

    Tabelle 7-10
    MAC-Filteroptionen 
    Option
    Beschreibung
    --mac-source [!] mac
    Filtert, wenn das MAC-Feld der Quelle des Ethernet-Frames mac entspricht.
    Das Format lautet XX:XX:XX:XX:XX:XX, wobei jedes XX durch zwei hexadezimale Ziffern ersetzt wird.

    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:

    iptables -A PREROUTING -i eth1 -m mac --mac-source ! 0d:bc:97:02:18:21 -j DROP

    Internet Control Message Protocol-Filter

    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.

    Tabelle 7-11
    ICMP-Filteroptionen 
    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).

    User Datagram Protocol-Filter

    Die User Datagram Protocol-(UDP-)Filtererweiterung wird automatisch geladen, falls -p udp verwendet wird. Tabelle 7-12 beschreibt die Optionen für diesen Filter.

    Tabelle 7-12
    UDP-Filteroptionen 
    Option
    Beschreibung
    --destination-port [!] port[:port]
    Filtert, wenn die UDP-Zielportnummer gleich port ist (falls nur ein Port gegeben ist) oder sich im angegebenen Bereich befindet (falls beide ports gegeben sind).
    Ports können mit dem Namen (aus der Datei /etc/services Ihres Systems) oder der Nummer festgelegt werden.
    --dport
    Synonym für --destination-port.
    --source-port [!] port[:port]
    Filtert, wenn der UDP-Quellport gleich port ist (falls nur ein port gegeben ist) oder sich im angegebenen Bereich befindet (falls beide ports gegeben sind).
    Ports können mit dem Namen (aus der Datei /etc/services Ihres Systems) oder der Nummer festgelegt werden.
    --sport
    Synonym für --source-port.

    Transmission Control Protocol-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.

    Tabelle 7-13
    TCP-Filteroptionen 
    Option
    Beschreibung
    --destination-port
    Synonym für --dport.
    --dport [!] port[:port]
    Filtert, wenn die TCP-Zielportnummer gleich port ist (falls nur ein Port gegeben ist) oder sich im angegebenen Bereich befindet (falls beide ports gegeben sind).
    Ports können mit dem Namen (aus der Datei /etc/services Ihres Systems) oder der Nummer festgelegt werden.
    --mss wert[:wert]
    Filtert SYN- und ACK-Pakete, wenn der Wert des MSS-Felds (Maximum Segment Size) für das TCP-Protokoll gleich wert ist (falls nur ein wert gegeben ist) oder sich im angegebenen Bereich befindet (falls beide werte gegeben sind).
    Siehe auch die Filtererweiterung tcpmss.
    --source-port
    Synonym für --sport.
    --sport [!] port[:port]
    Filtert, wenn der TCP-Quellport gleich port ist (falls nur ein port gegeben ist) oder sich im angegebenen Bereich befindet (falls beide ports gegeben sind).
    Ports können mit dem Namen (aus der Datei /etc/services Ihres Systems) oder mit der Nummer festgelegt werden.
    [!] --syn
    Synonym für --tcp-flags SYN,RST,ACK SYN. Pakete, die diesem entsprechen, werden als »SYN«-Pakete bezeichnet.
    Diese Option kann verwendet werden, um Regeln zu konstruieren, mit denen sich eingehende Verbindungen blockieren, ausgehende Verbindungen jedoch erlauben lassen.
    --tcp-flags
    [!] maske comp
    Prüft die maske-Flags und filtert nur, wenn die comp-Flags gesetzt sind.
    Die Argumente maske und comp sind kommaseparierte Listen mit Flag-Namen oder einer der beiden Spezialwerte ALL und NONE.
    --tcp-option[!] num
    Filtert, wenn die TCP-Option num gesetzt ist.

    Ein einfaches Beispiel

    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:

    1 # modprobe ip_tables
    2 # iptables -F FORWARD
    3 # iptables -P FORWARD DROP
    4 # iptables -A FORWARD -p tcp -s 0/0 --sport 80 \
    -d 172.16.1.0/24 --syn -j DROP
    5 # iptables -A FORWARD -p tcp -s 172.16.1.0/24 \
    --dport 80 -d 0/0 -j ACCEPT
    6 # iptables -A FORWARD -p tcp -d 172.16.1.0/24 \
    --sport 80 -s 0/0 -j ACCEPT

    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.

    Eine Beispiel-Firewall konfigurieren

    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.

    #!/bin/bash
    #########################################################################################
    # Dieses Beispiel ist eine Firewall-Konfiguration für einen einzelnen Host.
    # Der Firewall-Host selbst stellt keine Dienste zur Verfügung.
    #########################################################################################
    #
    # BENUTZERKONFIGURATION (Listen sind kommasepariert)
    #
    # OURNET Interner Netzwerkadressbereich
    # OURBCAST Interne Netzwerk-Broadcast-Adresse
    # OURDEV Interner Netzwerkschnittstellenname
    #
    # ANYADDR Externer Netzwerkadressbereich
    # EXTDEV Externer Netzwerkschnittstellenname
    #
    # TCPIN Liste der TCP-Ports, die wir einwärts erlauben wollen
    # (leer bedeutet alle)
    # TCPOUT Liste der TCP-Ports, die wir auswärts erlauben wollen
    # (leer bedeutet alle)
    #
    # UDPIN Liste der UDP-Ports, die wir einwärts erlauben wollen
    # (leer bedeutet alle)
    # UDPOUT Liste der UDP-Ports, die wir auswärts erlauben wollen
    # (leer bedeutet alle)
    #
    # LOGGING Auf 1 setzen, um Protokollierung zu aktivieren, ansonsten leer lassen
    #########################################################################################

    OURNET="172.29.16.0/24"
    OURBCAST="172.29.16.255"
    OURDEV="eth0"

    ANYADDR="0/0"
    EXTDEV="eth1"

    TCPIN="smtp,www"
    TCPOUT="smtp,www,ftp,ftp-data,irc"

    UDPIN="domain"
    UDPOUT="domain"

    LOGGING=

    #########################################################################################
    #
    # IMPLEMENTIERUNG
    #
    #########################################################################################

    #
    # Installieren der Module
    #

    modprobe ip_tables
    modprobe ip_conntrack # Bedeutet, wir wollen uns nicht mit Fragmenten abgeben

    #
    # Verwirft alle Pakete, die von außen empfangen werden und für diesen Host
    # gedacht sind.
    #

    iptables -A INPUT -i $EXTDEV -j DROP

    #
    # Entfernt alle Regeln aus der FORWARD-Kette der filter-Tabelle und
    # setzt die Richtlinie für diese Kette auf DROP.
    #

    iptables -F FORWARD # Löscht Regeln
    iptables -P FORWARD DROP # Richtlinie = DROP
    iptables -A FORWARD -s $OURNET -i $EXTDEV -j DROP # Anti-Spoof
    iptables -A FORWARD -p icmp -i $EXTDEV -d $OURBCAST -j DROP # Anti-Smurf

    #
    # TCP - ETABLIERTE VERBINDUNGEN
    #
    # Wir werden alle TCP-Pakete akzeptieren, die zu einer existierenden
    # Verbindung gehören (d. h. bei denen das ACK-Bit gesetzt ist), und zwar
    # für die TCP-Ports, die wir zulassen.
    # Damit sollten mehr als 95 % aller gültigen TCP-Pakete erfasst werden.
    #

    iptables -A FORWARD -d $OURNET -p tcp --tcp-flags SYN,ACK ACK \
    -m multiport --dports $TCPIN -j ACCEPT

    iptables -A FORWARD -s $OURNET -p tcp --tcp-flags SYN,ACK ACK \
    -m multiport --sports $TCPIN -j ACCEPT

    #
    # TCP - NEU EINGEHENDE VERBINDUNGEN
    #
    # Wir akzeptieren Anfragen von der Außenwelt nur an den zulässigen
    # TCP-Ports.
    #

    iptables -A FORWARD -i $EXTDEV -d $OURNET -p tcp --syn \
    -m multiport --sports $TCPIN -j ACCEPT

    #
    # TCP - NEU AUSGEHENDE VERBINDUNGEN
    #
    # Wir akzeptieren alle ausgehenden tcp-Verbindungsanforderungen an den
    # zulässigen TCP-Ports.
    #

    iptables -A FORWARD -i $OURDEV -d $ANYADDR -p tcp --syn \
    -m multiport --dports $TCPOUT -j ACCEPT

    #
    # UDP - EINGEHEND
    #
    # Wir erlauben eingehende UDP-Pakete an den zulässigen Ports und umgekehrt.
    #

    iptables -A FORWARD -i $EXTDEV -d $OURNET -p udp \
    -m multiport --dports $UDPIN -j ACCEPT

    iptables -A FORWARD -i $EXTDEV -s $OURNET -p udp \
    -m multiport --sports $UDPIN -j ACCEPT

    #
    # UDP - AUSGEHEND
    #
    # Wir erlauben ausgehende UDP-Pakete an die erlaubten Ports und umgekehrt.
    #

    iptables -A FORWARD -i $OURDEV -d $ANYADDR -p udp \
    -m multiport --dports $UDPOUT -j ACCEPT

    iptables -A FORWARD -i $OURDEV -s $ANYADDR -p udp \
    -m multiport --sports $UDPOUT -j ACCEPT

    #
    # DEFAULT und LOGGING
    #
    # Alle verbleibenden Pakete werden an die Standardregel durchgereicht
    # und verworfen. Sie werden protokolliert, falls Sie die oben beschriebene
    # LOGGING-Variable entsprechend konfiguriert haben.
    #

    if [ "$LOGGING" ]
    then
    iptables -A FORWARD -p tcp -j LOG # Protokolliert gesperrte TCP-Pakete
    iptables -A FORWARD -p udp -j LOG # Protokolliert gesperrte UDP-Pakete
    iptables -A FORWARD -p icmp -j LOG # Protokolliert gesperrte ICMP-Pakete
    fi

    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.

    Referenzen

    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:

    Real World Linux Security, 2nd Edition
    von Bob Toxen (Prentice Hall). Ein großartiges Buch mit einer breiten Spanne von Sicherheitsthemen, einschließlich Firewalls.
    Linux-Firewalls - Ein praktischer Einstieg
    von A.G. Lessing (O'Reilly). In diesem Buch wird erläutert, wie Sie die für Sie geeignete Firewall-Lösung finden und Schritt für Schritt realisieren. Sowohl für den Rechner zu Hause als auch für lokale Netze und Webserver geeignet.
    Firewalls and Internet Security, 2nd Edition
    von W. Cheswick, S. Bellovin und A. Rubin (Addison Wesley). Dieses Buch behandelt die Philosophie des Firewall-Designs und der Firewall-Implementierung.
    Practical Unix & Internet Security, 3rd Edition
    von S. Garfinkel, G. Spafford und A. Schwartz (O'Reilly). Dieses Buch behandelt eine Vielzahl von Sicherheitsthemen für beliebte Unix-Varianten (einschließlich Linux), wie etwa juristische Themen, Firewalls und mehr.
    Linux-Sicherheits-Kochbuch
    von D. Barrett, R. Silverman und R. Byrnes (O'Reilly). Dieses Buch bietet mehr als 150 einsatzbereite Skripten und Konfigurationsdateien für wichtige Sicherheitsaufgaben wie zeitliche Beschränkungen des Netzwerkzugriffs, Firewalls für Webserver, das Verhindern von IP-Spoofing und mehr.
    Linux iptables - kurz & gut
    von G. Purdy (O'Reilly). Dieses Buch behandelt Firewall-Konzepte, Linux-Paketverarbeitung und enthält eine vollständige Referenz des iptables-Befehls, einschließlich einer enzyklopädischen Referenz zu Filter- und Zielerweiterungen, die Sie für komplexere Anwendungen benutzen können.

    Fussnoten

    1Der Ausdruck »Firewall« (Brandmauer) stammt von einem besonderen Gerät, das Menschen vor Feuer schützt. Dabei handelt es sich um eine Mauer aus feuerfestem Material, die zwischen einem Feuer und den davor zu schützenden Menschen aufgestellt wird.
    2»Firewall Packet Logging« ist eine besondere Funktion, die für jedes Datagramm, das eine bestimmte Firewall-Regel erfüllt, eine Informationszeile an ein spezielles Gerät ausgibt, die Sie dann lesen können.

    TOC PREV NEXT INDEX


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

    © 2005, O'Reilly Verlag GmbH & Co. KG