Nächste Seite: Grundlagen der Firewalltechnik
Aufwärts: Crashkurs Firewallaufbau unter Linux
Vorherige Seite: Vorwort
  Inhalt
Unterabschnitte
Der Begriff Firewall hat keine eindeutige Definition und keine
standardisierte Bedeutung. Es handelt sich vielmehr um ein Modell zur
Absicherung eines Computernetzes gegenüber anderen - meist öffentlichen -
Netzen. Im Rahmen dieser Anforderung kommen - je nach Größe und Konzept des
zu schützenden Netzes - verschiedene Lösungsansätze in Frage. In jedem Fall
muß die gewünschte Sicherheit in verschiedenen Schichten angegangen werden,
ein einziger Mechanismus, wie etwa nur eine Paket-Firewall alleine ist nie
genug.
Im Allgemeinen wird beim Thema Firewall zwischen dem zu schützenden Netz
(internes LAN oder auch sicheres Netz) und dem öffentlichen Netz
(meist das Internet oder auch unsicheres Netz) unterschieden. Im
einfachsten Fall ist die Firewall hier ein physikalischer Rechner, der mit
zwei Netzwerkverbindungen (Netzwerkkarten, ISDN-Karten, Modems,...)
ausgestattet ist. Eine davon ist mit dem sicheren, die andere mit dem
unsicheren Netz verbunden. Der einzige Weg, der beide Netze verbindet, ist
eben die Firewall. Auf diesem Verbindungsrechner werden nun Strategien
implementiert, die die Sicherheit des zu schützenden Netzes - aber auch die
Regeln, die beschreiben, wer im sicheren Netz was im unsicheren Netz machen
darf - festlegen. Dazu zählen insbesondere:
- Welche Internet-Dienste dürfen vom lokalen Netz aus genützt werden?
- Welche Dienste darf die ganze Welt in Anspruch nehmen?
- Welche Dienste dürfen ausgewählte Benutzer oder Computer in Anspruch
nehmen?
- Welche Dienste dürfen nur lokal genutzt werden?
Der grundlegende Ansatz zur Implementierung dieser Strategien ist die
sogenannte Paketfilter-Firewall. Im weiteren Verlauf dieser Darstellung
wird es also hauptsächlich um die Konzeption und Wartung einer solchen
Paketfilter-Firewall gehen, implementiert mit einem Linux-System. Linux
bietet für diese Aufgabe alle notwendigen Werkzeuge bereits im
Betriebssystem-Kern, es ist also nicht notwendig, komplizierte
Zusatzinstallationen vorzunehmen, die ein System nur instabiler werden
lassen.
Auf der anderen Seite wurde ja schon erwähnt, daß eine hinreichende
Sicherheit nur über verschiedene, aufeinander aufbauende Mechanismen
herzustellen ist. Auch für diese höhergelegenen Sicherheitsstufen sind unter
Linux alle Werkzeuge bereits in der Standard-Installation vorhanden.
Zunächst gilt unser Augenmerk jedoch den Mechanismen des Paketfilterns. Um
grundsätzlich diesen Vorgang verstehen zu können, ist es notwendig ein paar
grundlegende Begriffe und Techniken der Computervernetzung zu beschreiben.
Was ist überhaupt Kommunikation in Netzwerken, wie läuft sie ab und welche
Mittel des Eingreifens stehen uns also zur Verfügung?
Ende der siebziger Jahre wurde ein theoretisches Referenzmodell für die
Vernetzung von Computern entworfen, das auch heute noch vielen Darstellungen
zugrunde liegt. Es handelt sich dabei um das sogenannte OSI-Referenzmodell.
OSI steht für Open System Interconnection, also etwa Verbindung
offener Systeme untereinander. Dieses Modell ist ein Schichtenmodell mit
sieben Schichten, die die Kommunikation der Computer untereinander
beschreiben. Es ist sehr akademisch angelegt und wurde von keinem real
existierenden Netzwerksystem vollständig implementiert. Trotzdem wird es zur
Darstellung der verschiedenen Mechanismen noch heute benutzt. Daher folgt
hier eine kurze Beschreibung dieses Modells:
Bild 2..1: Das OSI-Referenzmodell
Die beiden untersten Schichten sind - im Falle einer herkömmlichen
Netzverbindung etwa über Ethernet-Karten - auf der Netzwerkkarte selbst
implementiert. Sie sind also nicht Bestandteil der Software oder des
Betriebssystems.
Von unten nach oben betrachtet kommen den verschiedenen Schichten die
folgenden Aufgaben zu:
Die Bitübertragungsschicht (physical Layer) ist verantwortlich für die
Übertragung der einzelnen Bits, sie hat also einfach die Aufgabe dafür zu
sorgen, daß wo eine 1 gesendet wurde auch eine 1 empfangen wird und wo eine
0 gesendet wurde eben eine 0 empfangen wird. Typische Fragen dieser Schicht
sind die Spannungen, die jeweils einer 1 oder 0 entsprechen und wielange
diese Spannungen aufrecht erhalten werden müssen, damit ein Bit gesendet
wird. Diese Schicht ist immer direkt mit der Hardware verbunden, ihre
Konstruktion ist also Aufgabe des Hardwareherstellers.
Die Sicherungsschicht (data link layer) verarbeitet die übertragenen
Rohdaten indem sie eine Datenreihe daraus erstellt und diese Datenreihe
gewöhnlichermaßen in einen sogenannten Datenübertragungsrahmen (data frame)
packt. Die Sicherungsschicht kommuniziert mit ihrer gegenüberliegenden
Sicherungsschicht durch sogenannte Quittungsrahmen, die korrekt verarbeitet
werden müssen.
Um das Ganze einmal im Detail zu sehen folgt hier die Darstellung der
Framestruktur eines Datenrahmens (engl. frame) der IEEE 802.3 Norm, also der
Norm, die unser Ethernet benutzt:
Bild 2..2: Das 802.3 Frameformat
Die beiden Adressfelder enthalten dabei die Hardwareadresse (MAC-Adresse)
der jeweiligen Netzwerkkarten. Das Datenfeld enthält die eigentlichen Daten,
falls es weniger als 46 Byte sind, so wird das Pad-Feld benutzt um die
(physikalisch notwendigen) 46 Byte aufzufüllen. Die Prüfsumme ist
schließlich eine Möglichkeit, Fehler bei der Übermittlung direkt zu erkennen
und ein fehlerhaftes Paket gegebenenfalls nochmal anzufordern.
Diese Schicht (Network Layer) steuert die verschiedenen Transportwege
innerhalb des Netzes. In kleinen LAN ist diese Schicht also verhältnismäßig
dünn, in großen Netzen (z.B. dem Internet) hat sie sehr umfangreiche
Aufgaben. Die Wahl der verschiedenen möglichen Routen vom Sender zum
Empfänger, das optimale Ausnutzen der bestehenden Verbindungen und ähnliches
sind ihre Aufgaben.
Die Aufgabe der Transportschicht (Transport Layer) ist es, den Datenstrom
von der Sitzungsschicht zur Vermittlungsschicht weiterzugeben, eventuell in
kleinere Pakete zu packen und dafür zu sorgen, daß alle Teile in der
korrekten Reihenfolge ankommen. Die Transportschicht baut eine direkte
Kommunikation zwischen Sender und Empfänger auf, und arbeitet mit einem
entsprechenden direkten Protokoll. Man spricht hier von einer Ende-zu-Ende
Schicht, im Gegensatz dazu waren die bisher besprochenen Schichten
sogenannte gekettete Schichten. Das heißt, daß sie nicht unbedingt eine
direkte Kommunikation mit der Zielmaschine betrieben, sondern nur mit den
zwischen Sender und Empfänger liegenden Zwischenstationen (Gateways,
Bridges,...)
Viele Computer arbeiten heute im Multitasking-Betrieb, es kann
also sein, daß zwischen zwei Rechnern mehrere
unabhängige Netzwerkverbindungen bestehen. Auch die Koordination
dieser Tatsache ist Aufgabe der Transportschicht.
Die Sitzungsschicht (Session Layer) hat ähnliche Aufgaben wie die
Transportschicht, jedoch in einer etwas gehobeneren Form. Sie muß zum
Beispiel abgebrochene Transferversuche an der Stelle wiederaufnehmen, an der
sie abgebrochen wurden. Insgesamt könnte man es damit zusammenfassen, daß
die Sitzungsschicht zuständig für die Dialogsteuerung ist.
Die Darstellungsschicht (Presentation Layer) ist zuständig für die korrekte
Darstellung der Daten. Diese Schicht wird z.B. dadurch notwendig, daß
verschiedene Computer verschiedene Formen der Darstellung für Ganz- und
Kommazahlen haben. Es gibt etwa die sogenannten Big-Endian Systeme, die in
einer 16-Bit Ganzzahl das höherwertige Byte zuerst anführen, während die
Little-Endian Systeme es genau anders herum machen. Würden Computer
miteinander kommunizieren, die diese Darstellung unterschiedlich handhaben,
so kämen zwar Ganzzahlen am Zielrechner an, er würde sie aber gänzlich
falsch interpretieren.
Die letzte Schicht des OSI-Modells (Application Layer) enthält nun die
verschiedenen Anwendungen, die sich gegenseitig über das Netz verständigen.
Diese Schicht ist in der Regel direkt in das Anwenderprogramm programmiert
und enthält die jeweiligen Protokolle, mit denen die Programme
kommunizieren.
Nachdem das OSI-Modell ein eher akademisches Modell ist und von keiner
Netzwerksoftware wirklich hundertprozentig implementiert wird, ist es jetzt
an der Zeit, das Modell zu betrachten, das tatsächlich heute im Internet
(und allen lokalen Netzsystemen) verwendet wird, TCP/IP. Im Gegensatz zum
OSI-Modell kommt TCP/IP mit nur vier Schichten aus, um den Datentransfer zu
erklären:
Bild 2..3: Das TCP/IP-Schichtenmodell
Diese vier Schichten kommunizieren nicht genau mit denen des OSI-Modells,
vereinfacht kann man sagen, daß die Netzzugriffsschicht die beiden untersten
Schichten des OSI-Modells enthalten, die Internetschicht entspricht genau
der Vermittlungsschicht, die Transportschicht von TCP/IP erfüllt im
Wesentlichen die Aufgaben der Transportschicht des OSI-Modells und die
restlichen drei Schichten von OSI sind in der Anwendungsschicht von TCP/IP
integriert.
Auf all diesen vier Schichten arbeiten unterschiedliche Protokolle zur
Datenübertragung. Vereinfacht könnte das etwa wie folgt dargestellt werden:
Bild 2..4: Protokolle des TCP/IP-Schichtenmodells
In der Anwendungsschicht arbeiten also sehr viele verschiedene Protokolle,
in der Transportschicht gerade noch zwei, in der Vermittlungsschicht nur
eines und auch auf der Netzzugriffsschicht eines (allerdings eines aus
vielen möglichen).
Jede Schicht dieses Modells muß Informationen besitzen, an welche Abteilung
der über ihr liegenden Schicht sie den Datenstrom beim Empfang weitergeben
soll. Von unten nach oben betrachtet ergibt sich damit folgender Vorgang:
- Die Netzzugriffsschicht bekommt ein Paket aus dem Netz. Sie hat kein
Problem mit der Weitergabe, denn die über ihr liegende Schicht enthält nur ein
Protokoll, IP.
- Das Internet-Protokoll (IP) der Vermittlungsschicht muß aufgrund der
ihr übermittelten Information schon entscheiden, wem sie das Paket
weitergibt. Es stehen hier drei Möglichkeiten zur Auswahl:
- Das Paket bleibt in der Vermittlingsschicht und wird vom Internet
Control Message Protocol (ICMP) weiterverarbeitet (z.B. ping)
- Das Paket Gehört zu einem TCP-Datenstrom und muß an das Transmission
Control Protocol (TCP) der Transportschicht weitergeleitet werden.
- Das Paket enthält ein UDP-Datagram und muß daher an das User Datagram
Protocol (UDP) der Transportschicht weitergegeben werden.
Diese Information muß IP aus dem IP-Datagram-Header gewinnen. Das Format
dieses Headers ist weiter unten erklärt.
- Die Protokolle der Transportschicht (TCP und UDP) haben die größte
Aufgabe, denn sie müssen aus einer Vielzahl von möglichen Anwendungen
auswählen, für welche dieser Anwendungen das empfangene Paket ist, also an
welche Anwendung sie die Daten weiterleiten. Zu diesem Zweck besitzt jede
Anwendung der Anwendungsschicht eine Kennummer, die sogenannte Portnummer.
Diese Nummer legt genau fest, welche Anwendung das Paket erhält.
Die beiden Schichten, die uns jetzt genauer interessieren, sind die
mittleren, also vermittlungsschicht und Transportschicht. Hier finden die
Mechanismen statt, die für das Verständnis einer Firewall unerlässlich sind.
Auf der Vermittlungsschicht (Internet-Schicht) von TCP/IP arbeitet im
Wesentlichen nur ein
Protokoll, das IP (Internet Protocol). Dieses Protokoll arbeitet nicht mit
den
physikalischen Adressen von Netzwerkkarten, sondern mit logischen Adressen,
eben den allseits bekannten IP-Adressen. Diese Schicht fügt den
eigentlich zu übermittelnden Daten noch Verwaltungsinformationen hinzu.
Dieses Format wird als Datagram-Format bezeichnet und hat die folgende
Struktur:
Bild 2..5: Das IP-Datagram Format
Die Bedeutung der einzelnen Felder ist
- Version
- Ein vier Bit breites Feld, daß die Versionsnummer von IP
enthält. Im Augenblick wird hier meist eine 4 stehen, in der neuen Version
IPV6 folgerichtig dann eine 6.
- IHL
- Internet Header Length - 4 Bit. Gibt die Länge des Headers in
32 Bit Worten an. Damit kann ermittelt werden, ob Optionen gesetzt sind.
Normalerweise (ohne Optionen) hat dieses Feld den Wert 5.
- Diensttyp
- TOS (Type of Service) - 8 Bit.
Enthält Flags, die zur Steuerung der Zuverlässigkeit des
Netzes dienen. Sie werden automatisch erstellt.
- Gesamtlänge
- Enthält die Gesamtlänge des Datagramms (incl. Kopf) in
Byte. Aus der Breite dieses Feldes (16 Bit) ergibt
sich so eine maximale Größe von Datagrammen von 65535
Byte. Dieser Wert liegt weit über dem maximalen
Wert der einzelnen Netzsysteme, daher reichen 16 Bit aus.
- Kennung
- Jedes IP-Datagramm muß eine eigene Kennung haben, um beim
Wiederzusammenbau richtig eingeordnet zu werden.
- Flags
- Ein Drei-Bit-Feld das Flags zur Steuerung der Fragmentierung
enthält.
- Lebensdauer
- In Netzen wie dem Internet, in denen viele Datagramme auf
unterschiedlchsten Wegen versuchen zum Ziel zu
kommen, muß eine maximale Lebensdauer haben, sonst werden
sie unendlich oft geroutet. Dieses Feld enthält
eine Zahl, die vom Sender eingetragen wurde. Jeder Gateway
muß diese Zahl um eins herunterzählen, wenn er
ein Datagramm routet. Ist der Wert Null, so darf kein
Router das Datagramm mehr weiterleiten. Übliche
Startwerte sind 32 oder 4 (nur lokale Netze setzen so
niedrige Lebensdauer an)
- Protokoll
- Dieses Feld gibt an, von welchem Protokoll der
Transportschicht dieses Datagramm kommt. Das ist wichtig für
den Empfänger, weil auf der Transportschicht mehrere Protokolle arbeiten
bzw. es auch Pakete gibt, die gar nicht bis zur Transportschicht
weitergeleitet werden sollen.
Nur durch diese Information kann
das Empfänger IP das Datagramm an das richtige
Transportschichtprotokoll weiterleiten. Übliche Werte sind:
- 17 - UDP
- 6 - TCP
- 1 - ICMP
- Kopf-Prüfsumme
- Prüfsumme über den Inhalt des Headers, nicht der
Daten. Die Überprüfung der Daten wird von der Transportschicht
erledigt.
- Sender IP-Adresse
- 32 Bit IP-Adresse des Senders
- Empfänger IP-Adresse
- 32 Bit IP-Adresse des Empfängers
- Optionen
- Hier können verschiedene Optionen gesetzt werden, die mit
Debugging (Fehlersuche) oder Routenprüfung zu tun haben.
- Füllzeichen
- Füllt den Bereich zwischen den jeweils gesetzten Optionen
und dem Ende des 32 Bit Wortes auf.
Das Internet Control Message Protocol (ICMP) ist ein integraler
Bestandteil von IP und dient zur Übermittlung
technischer Meldungen, die übers Netz gehen, aber nicht über die
IP-Schicht hinauskommen müssen. D.h., daß dieses
Protokoll in der Lage ist, Pakete zu schicken, die nicht an ein
Transportprotokoll der Transportschicht gebunden sind,
sondern eben nur von Vermittlungsschicht zu Vermittlungsschicht gehen.
Die Aufgaben, die dieses Protokoll zu erfüllen hat sind hier kurz
aufgelistet:
- Flußkontrolle
- Wenn ein Rechner Datagramme so schnell schickt, daß der
Empfänger sie nicht rechtzeitig verarbeiten kann, so schickt der Empfänger
über ICMP eine Meldung an den Sender, daß die Sendungen vorübergehend stoppen
sollen. Nachdem der Empfänger alle anstehenden Datagramme
verarbeitet hat, schickt er erneut eine Meldung,
daß er wieder empfangsbereit ist.
- Erkennen von unerreichbaren Zielrechnern
- Wenn ein Gateway erkennt, daß ein bestimmter Rechner nicht erreichbar ist,
so schickt er an den Absender des
Paketes eine Destination unreachable Meldung über ICMP
- Routenoptimierung
- Wenn ein Gateway erkennt, daß er einen Umweg darstellt, so schickt er an den
Absender eine Meldung, in der
die schnellere Route steht. Der Absender (bzw. seine
IP-Schicht) kann dann das nächste Paket schon über den
besseren Weg übermitteln.
- Überprüfen von erreichbaren Hosts
- Mit Hilfe des ICMP Echo Message kann ein Rechner überprüfen ob ein
Empfänger ansprechbar ist. Das
ping-Kommando nutzt diese Echo-Meldung.
Auf der Transportschicht von TCP/IP arbeiten zwei verschiedene Protokolle,
TCP und UDP. Der wesentliche Unterschied zwischen den beiden Protokollen ist
die Frage der Kommunikationssteuerung. TCP (Transmission Control Protocol)
arbeitet verbindungsorientiert, es baut also einen Datenstrom zwischen
Empfänger und Sender auf, der über mehrere Pakete verteilt ist und dessen
korrekter Empfang permanent durch Quittungspakete vom Empfänger bestätigt
werden muß. Im Gegensatz dazu arbeitet UDP (User Datagram Protocol)
verbindungslos, das heißt, es werden einfach Pakete (Datagramme) vom
Sender zum Empfänger geschickt, ohne daß dieser den Empfang quittieren muß.
Beide Protokolle arbeiten wieder mit einem sogenannten Header, der dem
eigentlichen Datenpaket vorangestellt wird. Beiden Headerformen ist eins
gemeinsam, sie enthalten einen Eintrag für die Portnummer des
Senderprozesses und die des Empfängerprozesses. Diese Portnummern werden uns
im nächsten Abschnitt noch genauer beschäftigen. Im folgenden werden beide
Headerformate kurz dargestellt:
Die interne Struktur des UDP-Headers ist sehr einfach. Als
datagramorientiertes (verbindungsloses) Protokoll benötigt UDP
keinerlei Informationen über Sequenznummern oder ähnliches, der benötigte
Header ist also sehr klein:
Bild 2..6: Das UDP-Message Format
Die Bedeutung der einzelnen Felder ist
- Quellportnummer
- bezeichnet die Portnummer des Anwenderschichtprogrammes, von
dem die UDP-Message abgeschickt wurde.
- Zielportnummer
- bezeichnet die Portnummer des Empfängerprogramms auf der Anwendungsschicht.
- Länge
- Hier steht die Länge der gesamten UDP-Message (incl. Header)
- Prüfsumme
- Eine Prüfsumme über das Datenfeld
UDP wird überall dort verwendet, wo entweder die Datenmenge so klein ist,
daß es sich nicht lohnen würde, einen
großen Header zu benutzen, weil der größer als die eigentlichen
Daten wäre oder wo die Anwendungen selbst noch
Überprüfungen des Paketinhaltes vornehmen.
Lohnenswert ist der Einsatz auch dort, wo reine Frage-Antwort Mechanismen
auftreten. Dort ist kein
verbindungsorientiertes Protokoll nötig, weil ja nach dem Senden
einer Frage klar ist, wenn nach einer bestimmten Zeit
keine Antwort eingeht, so wird das Paket verlorengegangen sein
und die Frage muß nochmal gestellt werden.
TCP ist im Gegensatz zu UDP ein verbindungsorientiertes Protokoll, das
Datenströme verarbeitet, die von der
Anwendungsschicht kommen. TCP garantiert die Versendung von
Daten durch eingebaute Handshake-Mechanismen.
TCP bietet einen verlässlichen Datentransfer durch die Verwendung eines
Mechanismus, der Datenpakete (sogenannte
Segmente) an einen Empfänger schickt und auf eine
Bestätigung des Empfangs seitens des Empfängers wartet. Dabei überprüft der
Empfänger auch wieder mittels einer Prüfsumme, ob das Paket fehlerfrei
angekommen ist.
Das Format des Headers ist zwangsläufig also wesentlich komplexer als das
von UDP:
Bild 2..7: Das TCP-Segment Format
Die Bedeutung der einzelnen Felder ist
- Absender Portnummer
- bezeichnet die Portnummer des Anwenderschichtprogramms, von
dem der Datenstrom abgeschickt wurde.
- Empfänger Portnummer
- bezeichnet die Portnummer des Empfängerprogramms auf der Anwendungsschicht.
- Sequenznummer
- Gibt die Position im Datenstrom an, an der dieses Segment eingefügt werden
soll.
- Bestätigungsnummer
- Dient zur Bestätigung des Empfangs eines Segments. Dieses Feld enthält immer
die Nummer, die im nächsten
Segment als Sequenznummer stehen soll.
- Daten-Offset
- Gibt die Größe des Headers in 32 Bit Worten an. Ohne Optionen sind es 5.
Damit kann genau bestimmt weden,
wo der Datenbereich des Segments beginnt.
- Flags
- Verschiedene Flags zur Kommunikationssteuerung (SYN,ACK,...)
- Fenster
- Mit diesem Wert wird die Größe des Buffers angezeigt, der von einem
Endknoten für diese Verbindung
reserviert wurde. Der sendende Knoten darf keinesfalls
mehr Daten als die angegebene Puffergröße senden,
ohne auf den Eingang einer Bestätigung zu warten.
- Prüfsumme
- Eine Prüfsumme über das gesamte Segment (Daten und Header)
- Dringlichkeitszeiger
- Wird bei besonders dringend zu verarbeitenden Paketen gesetzt. Wenn gesetzt
enthält dieses Feld als Wert die
Endadresse des Datenfeldes, das als dringlich gilt
- Optionen
- Verschiedene Optionen zur Kommunikation wie etwa die maximale Segmentgröße
- Füllzeichen
- Zum Auffüllen der Optionszeile auf 32 Bit
Kommunikationsablauf einer TCP-Verbindung
Die meisten Netzwerkdienste im Internet arbeiten mit TCP als
Transportprotokoll. Aus diesem Grund soll hier einmal detailliert der
Kommunikationsablauf einer typischen TCP-Verbindung beschrieben werden. Das
Verständnis dieses Ablaufs macht uns später das Einrichten einer Firewall
erheblich leichter und vermeidet Fehler, die sonst auftreten könnten.
Eine typische Verbindung mit TCP wäre die Kommunikation eines Web-Browsers
mit einem Webserver über das Hypertext Transfer Protocol (HTTP). Die
Portnummer des Webservers ist standardmäßig die 80, der Web-Client (also der
Browser) nimmt sich eine beliebige freie Portnummer ab der 1024. In
unserem Beispiel wird es die Portnummer 12345 sein.
Der erste Schritt der Kommunikation zwischen Web-Client und Webserver
besteht darin, daß der Benutzer des Clients eine Adresse in den Browser -
also den Client - eingibt. Diese Adresse wird in eine IP-Adresse
umgewandelt und der Client bekommt vom Betriebssystem einen freien Port
oberhalb 1024 (also einen sogenannten unprivilegierten
Port)zugewiesen. In unserem Beispiel ist das der Port 12345. Mun schickt jetzt
der Client ein HTTP-Paket an den Server. Die Transportschicht und ihr
Protokoll TCP erkennt, daß es sich um eine neue Verbindung handelt und setzt
das sogenannte SYN-Flag im Flag-Bereich des TCP-Segment-Headers.
Webserver benutzen - sofern nicht anders angegeben - standardmäßig den
Port 80. Es ergibt sich also folgendes Bild:
Bild 2..8: Client bittet um Verbindungsaufbau
Der Client schickt in dem Header neben dem SYN-Flag - also der Bitte um
Verbindung - auch eine Sequenznummer. Auf der Basis dieser Nummer wird die
weitere Verbindung abgewickelt.
Das abgeschickte Paket kommt jetzt auf dem Server an und gelangt bis zur
Anwendungsschicht und dort zum Port 80. Dort nimmt ein Serverprogramm (hier
der Webserver httpd) den Datenstrom entgegen. Der Server erkennt aufgrund
des SYN-Flags, daß es sich um eine neue Verbindung handelt und reserviert
einen neuen Socket für die Kommunikation mit dem Client. Er schickt jetzt
ein Paket zurück, das sowohl das ACK-Flag (Acknowledge -
Bestätigung), als auch wiederum ein SYN-Flag gesetzt hat. Man spricht
jetzt von einer halb-offenen Verbindung.
Bild 2..9: Bestätigung der Bitte um
Verbindungsaufbau
Die Sequenznummer des Paketes, das der Server in Bild
2..9 dem Client zurückschickt ist die Sequenznummer des
ersten Paketes plus eins. Damit bestätigt der Server den Erhalt des letzten
Paketes und macht gleichzeitig klar, welche Sequenznummer er im nächsten
Paket erwartet. Damit kann der Client das erste Paket jetzt wegwerfen, da er
den Erhalt ja jetzt bestätigt bekommen hat.
Diese erste Antwort vom Server hat beide Flags (ACK und SYN) gesetzt. Von
nun an wird der gesamte Datenverkehr immer nur noch mit dem ACK-Flag
ablaufen. Die Tatsache, daß in allen Paketen des Servers das ACK-Flag
gesetzt ist, in der ersten Anfrage des Clients jedoch nicht, wird beim
Aufbau einer Firewall ein wichtiges Kriterium sein.
Im nächsten Schritt bestätigt der Client seinerseits den Empfang der Antwort
des Servers. Von nun an wird nur noch das ACK-Flag gesetzt sein. Weder
Server, noch Client werden im Lauf der Verbindung das SYN-Flag nochmal
benutzen.
Bild 2..10: Die Verbindung ist hergestellt
Bei jeder weiteren Bestätigung (also jedem weiter erhaltenen ACK-Flag)
erhöhen sowohl Client, als auch Server die Sequenznummern des letzten
empfangenen Paketes. Damit bestätigen sie also den Empfang des Paketes und
geben gleichzeitig bekannt, welches Paket sie als nächstes erwarten. Die
jeweilige Gegenseite kann also alle Pakete mit nierigeren Sequenznummern
wegwerfen.
Um eine Verbindung abzubauen wird ein weiteres Flag benutzt, das aber für
den Aufbau von Firewallsystemen unwichtig ist. Zusammenfassend können wir
also festhalten:
Das SYN-Flag ist gesetzt, wenn Client und Server jeweils ihr erstes Paket
schicken. Bei allen folgenden Paketen ist das ACK-Flag gesetzt. Ein Paket,
in dem nur das SYN-Flag gesetzt ist muß zwangsläufig eine Anfrage eines
Clients an einen Server sein.
Nachdem nun die Grundlagen der TCP/IP-Kommunikation geklärt sind, ist es an
der Zeit, die Grundlagen der Firewall-Techniken anzusprechen. Die in diesem
Kapitel besprochenen Felder der TCP- und IP-Header werden dabei Kriterien
für die Auswahl sein.
Nächste Seite: Grundlagen der Firewalltechnik
Aufwärts: Crashkurs Firewallaufbau unter Linux
Vorherige Seite: Vorwort
  Inhalt
root
2001-08-07