Linux Server - Firewall
Prinzipielles zur TCP/IP Datenübertragung
Um eine Paketfilter-Firewall selbst aufzubauen sind fundierte Kenntnisse der TCP/IP Datenübertragung notwendig. Denn wir müssen ja verschiedenste Regeln formulieren, die sich auf die Datenpakete und deren Protokollheader beziehen. So soll hier nochmal kurz das wichtigste zum Thema Datenübertragung im IP-Netz dargestellt werden.
Der prinzipielle Ablauf einer Datenübertragung
Grundsätzlich müssen wir, angesichts des TCP/IP Schichtenmodells, unterscheiden, was eigentlich wie übertragen werden soll. Uns stehen im Prinzip drei Protokolle zur Verfügung, die vorkommen können:Eine Datenübertragung besitzt - aus der Sicht der Firewall - zwei grundsätzlich unterschiedliche Abläufe. Entweder unser Rechner schickt eine Anfrage an einen Server eines anderen Rechners und bekommt Antwort von ihm, oder ein fremder Client schickt eine Anfrage an einen unserer Server und bekommt Antwort von uns.
- ICMP
- Das Internet Control Message Protocol arbeitet noch auf der Vermittlungsschicht und dient der Übertragung von Kontrollnachrichten von Rechner zu Rechner. Es benützt selbst keine Ports, aber es werden verschiedene ICMP Nachrichtentypen unterschieden, die in Firewallregeln wie Ports behandelt werden. Ein Beispiel ist Ping, dessen ausgehendes Format vom Typ 8 ist, während das Antwortpaket (pong) den Typ 0 hat.
- TCP
- Das Transmission Control Protocol ist das verbindungsorientierte Protokoll auf der Transportschicht. Es benutzt Portnummern, um die jeweiligen Anwendungen auf der obersten Schicht zu adressieren. TCP benutzt einen dreiteiligen Handshake, dessen Ablauf für die Firewallregeln noch Bedeutung haben wird.
- UDP
- Das User Datagram Protocol ist das verbindungslose Protokoll auf der Transportschicht. Auch dieses Protokoll benutzt Portnummern, es hat jedoch keinerlei Handshake, also auch keine Flags, die wir bei der Formulierung der Regeln nutzen könnten.
Im Prinzip laufen alle Übertragungen nach dem gleichen Muster ab. Ein Client fängt mit einer Anfrage an einen Server an und der antwortet ihm. Dabei spielen die Portnummern eine große Rolle. Um einen Dienst auf einem anderen Rechner anzusprechen, muß der Client also die IP-Adresse des Servers und die Portnummer des gewünschten Dienstes kennen. Damit der Server ihm auch antworten kann, muß der Client auch seine eigene IP-Adresse angeben und eine Portnummer, auf der er selbst lauscht. Da der Client keine fest zugewiesene Portnummer besitzt, wählt er sich einfach eine beliebige Nummer aus dem Pool der unprivilegierten Portnummern (1024 bis 65535) aus.
Wir können also davon ausgehen, dass ein Paket mit einer Anfrage des Clients an den Server folgendes an Header-Information beinhaltet:
- Die IP-Adresse des Servers
- Die bekannte Portnummer des gewünschten Dienstes auf dem Server
- Die IP-Adresse des Clients
- Eine beliebige Portnummer zwischen 1023 und 65535, die sich der Client selbst gewählt hat.
Eine Ausnahme dieses Prinzips haben wir bei ICMP, dort hat der Sender selbst keinen Port bzw. keinen Pakettyp.
Handshake bei TCP
Bei der Verwendung von TCP als Protokoll gibt es eine weitere Besonderheit. Hier werden noch sogenannte Flags gesetzt, also Optionen, die besondere Steuerfunktionen haben. Eine Verbindung von Client zu Server beginnt bei TCP immer folgendermaßen:Der Client schickt ein Paket mit folgender Header-Information an den Server:
Empfänger IP: Empfänger Port: Sender IP: Sender Port: Flags: IP-Adresse des Servers z.B. 123.45.67.89 Portnummer des gewünschten Dienstes z.B. 80 Eigene IP-Adresse des Clients z.B. 111.22.33.44 Zufällige Portnummer z.B. 12345 SYN Der Client setzt also das SYN-Flag, gleichbedeutend mit der Nachfrage nach einem Verbindungsaufbau (Synchronisation). Der Server schickt jetzt ein Paket zurück, das folgende Information beinhaltet:
Empfänger IP: Empfänger Port: Sender IP: Sender Port: Flags: IP-Adresse des Clients-111.22.33.44 Portnummer des Clients-12345 IP-Adresse des Servers-123.45.67.89 Portnummer des Server-Dienstes-80 SYN und ACK Der Server setzt also einerseits das ACK (Acknowledge) Flag um zu zeigen, dass er den Verbindungsaufbau gewährt und setzt zusätzlich nochmal das SYN-Flag um seinerseits die Verbindung anzufordern. Das nächste Paket des Clients enthält jetzt nur noch das ACK-Flag:
Empfänger IP: Empfänger Port: Sender IP: Sender Port: Flags: IP-Adresse des Servers-123.45.67.89 Portnummer des Server-Dienstes-80 IP-Adresse des Clients-111.22.33.44 Portnummer des Clients-12345 ACK Von diesem Moment an gilt die Verbindung als stehend und alle weiteren Pakete haben jetzt grundsätzlich das ACK-Flag und niemals mehr das SYN-Flag gesetzt. Aus dieser Handshake-Methode heraus ist anhand der Flags grundsätzlich festzustellen, ob ein Paket eine Nachfrage eines Clients an einen Server darstellt oder nicht. Zusammengefasst kann man sagen, dass ein Paket immer dann eine Client-Nachfrage beinhaltet, wenn das SYN-Flag gesetzt und das ACK-Flag nicht gesetzt ist.
Diese fünf (TCP) bzw. vier (UDP) Kriterien stehen uns also für die Firewall zur Verfügung. Anhand dieser Eigenschaften müssen wir entscheiden, ob wir ein Paket durchlassen oder nicht.
[Zurück zur Firewall-Seite] [Nächste Seite]