Heute sind lokale Netze etwas selbstverständliches geworden, sowohl die Kosten für solche Netze haben sich dramatisch nach unten bewegt, als auch das Wissen, das nötig ist, um Computer zu vernetzen ist allgemein gestiegen.

Aus dieser Verbreitung von lokalen Netzen folgert sehr schnell der Wunsch, dass ein lokales Netz einen Anschluß ans Internet findet, ohne dass jeder Rechner über ein Modem oder eine ISDN-Verbindung verfügen muß. Es existieren einige Lösungsansätze für dieses Problem, die zunächst einmal kurz dargestellt werden sollen:

Router oder Proxy

Die Begriffe Router und Proxy werden gerne und oft falsch oder zumindestens unscharf benutzt. Dabei handelt es sich in beiden Fällen um technische Lösungen für das Problem der Anbindung eines lokalen Netzes an das Internet. Der Lösungsansatz findet jedoch an völlig verschiedenen Stellen statt.

Die Proxy-Technik

Proxies wurden schon relativ früh eingesetzt, als Betreiber von einzelnen Netzen oder Internet-Provider gemerkt hatten, dass manche Web-Seiten sehr häufig aufgerufen wurden. Das führte zu der Idee, dass eine lokale Zwischenspeicherung dieser häufig aufgerufenen Webseiten den Datenverkehr im Internet bzw. in der Anbindung zum Internet erheblich reduzieren könnte. Denn anstatt eine Seite pro Tag x mal über diese Internetanbindung zu transportieren, wurde sie nur noch einmal geholt, lokal zwischengespeichert und – falls jemand die Adresse dieser Seite aufrief – von diesem lokalen Zwischenspeicher heraus ausgeliefert.

Das heißt, ein Proxy-Server ist eine Art Webserver, der einen lokalen Zwischenspeicher für Webseiten bereithält und eingehende Anfragen an das Internet entgegennimmt. Sollte die gewünschte Seite schon lokal abgespeichert sein, so liefert er die gespeicherte Seite zurück, ist sie noch nicht gespeichert, so holt er sich die Seite aus dem Internet, speichert sie lokal zwischen und liefert sie dann erst an den entsprechenden Client aus.

Das hat nun den Nebeneffekt, dass ein Proxy, der eine Internetanbindung hat, den Rechnern im lokalen Netz auch einen Zugriff, zumindestens für WWW-Seiten erlauben kann, ohne dass die Rechner des lokalen Netzes selbst Zugang zum Internet haben. Sie erhalten alle Webseiten ja eben von diesem Proxy. Der Nachteil dieses Verfahrens liegt auf der Hand, ein Proxy arbeitet auf der Anwendungsschicht des TCP/IP Modells und bietet nur Funktionalität für ein (oder ein paar) Protokoll(e). Moderne Proxy-Systeme gibt es etwa für WWW und FTP. Direkter Internet-Zugang ist damit für die Rechner im Netz nicht möglich.

Was auf den ersten Blick wie ein Nachteil aussieht, kann aber auch genauso gewünscht sein. So ist es vorstellbar, dass ein Netzbetreiber eines lokalen Netzes gar nicht will, dass jeder Rechner im LAN bedingungslosen Zugriff ins Internet bekommt. Die notwendigen Dienste, wie Mail, WWW und FTP können über Proxies zur Verfügung gestellt werden, andere Dienste, wie etwa Netzspiele über das Internet sind so nicht möglich.

Unter Linux stehen für Proxy-Techniken auch verschiedene Programme zur Verfügung, ein sehr beliebter Proxy ist das Programm squid.

Die Router-Technik

Im Gegensatz zum Proxy arbeitet ein Router (oft auch Gateway genannt) auf der Verbindungsschicht des TCP/IP Modells. Das heißt, er gibt Pakete, die er erhält und die nicht für ihn bestimmt sind, von einem Netzwerk-Interface zu einem anderen weiter. Dabei existieren keine Einschränkungen hinsichtlich irgendwelcher Protokolle, denn Protokolle kennt der Router ja gar nicht, für ihn sind alle Pakete nur IP-Pakete, egal was sie weiter enthalten.

Die Arbeit eines Routers im lokalen Netz, der zwei Netze miteinander verbindet, ist einfach zu verstehen. Denn der Router kann ja klar sagen, welche IP-Adresse zu welchem Netz gehört und welches Netz an welcher Schnittstelle hängt. Was aus diesem Satz schon klar wird – und was ein großer Unterschied zum Proxy ist – ist die Tatsache, dass der Router tatsächlich IP-Pakete weiterleitet. Das ist in einem lokalen Netz weiter kein Problem, wir werden aber gleich sehen, dass es im Zusammenhang mit dem Internet sehr wohl zum Problem werden kann.

Im weiteren Verlauf interessiert uns natürlich die Router-Technik im Zusammenhang mit der Firewall. Dabei ist es uns natürlich unbenommen, auch Proxy-Server einzurichten, die Funktionalität der Firewall als Verbindung vom lokalen Netz ins Internet basiert aber auf der Weitergabe von IP-Paketen, also auf dem Routing.

Das Problem der reservierten Adressen

In der guten alten Zeit des Internets, als IP-Adressen noch nicht knapp waren und die Rechner, die ans Netz wollten das über eine Standleitung getan haben, war das Routing im Netz ein Kinderspiel. War doch damals die Situation die, dass jeder ans Internet angeschlossene Rechner eine feste, einmalige und von überall erreichbare IP-Adresse hatte. Ein Router hatte also nur noch die Aufgabe, ein Paket an die entsprechend richtige Schnittstelle auszuliefern und schon war alles erledigt.

Die Firewall eines Linux Rechners hat ja neben den beiden Regelketten input und output noch die chain forward. Diese Regelkette ist speziell für das Routing gedacht, das oft auch mit dem Begriff IP-forwarding bezeichet wird. Mit Hilfe dieser Regelkette ist es also auch noch möglich, zu entscheiden, welche Pakete geroutet werden sollen.

Heute jedoch haben wir eine Knappheit an IP-Adressen und die lokalen Netze laufen in der Regel mit den sogenannten reservierten Adressen. Diese reservierten Adressen sind im Internet nicht routbar. Das heißt, dass selbst wenn einer unserer Rechner ans Internet angeschlossen ist und dieser eine Rechner auch eine echte IP-Adresse hat, und noch dazu als Router konfiguriert ist, eine Verbindung ans Internet für die anderen Rechner nicht so ohne weiteres möglich wäre. Die Rechner im lokalen Netz haben ja IP-Adressen, die im Internet nicht gültig sind. Selbst wenn ein IP-Paket mit einer solchen ungültigen Adresse jemals einen Internet-Server erreichen würde, so wäre dieser Rechner nicht in der Lage eine Antwort zurückzuschicken, denn es existieren keine Routen zu reservierten Adressen – wohin sollten die auch zeigen? Es gibt wahrscheinlich hunderte von lokalen Netzen auf der Welt, die diese Adressen benutzen.

Masquerading als Problemlösung

Der Linux-Kernel bietet eine Lösungsmöglichkeit für die Verwendung reservierter Adressen im Internet an, das sogenannte Masquerading. Dabei arbeitet der Router, also der Rechner, der sowohl am lokalen Netz, als auch am Internet hängt, als Masquerading Server. Dieser Rechner hat ja eine echte, im Internet routfähige Adresse. Er nimmt jetzt aus dem lokalen Netz Pakete entgegen und verändert sie dergestalt, dass im Feld der Sender IP-Adresse jetzt nicht mehr die reservierte Adresse des wahren Absenders steht, sondern die echte Adresse des Masquerading-Servers. Gleichzeitig merkt sich der Masquerading Server die Original-Adresse in einer Kernel-Tabelle. Bekommt jetzt der Masquerading Server die Antwort aus dem Internet, so überprüft er anhand dieser Tabellen, für wen diese Antwort war, tauscht die entsprechenden Adresen der Pakete wieder um und gibt das so veränderte Antwortpaket wieder an den Rechner im lokalen Netz, der die Anfrage losgeschickt hatte.

Aus der Sicht des Internet-Servers existiert also gar kein lokales Netz, er kommuniziert ausschließlich mit dem Masquerading Server. Die Adressen des lokalen Netzes sind maskiert. Das hat natürlich den schon erwähnten Vorteil, dass Angriffe aus dem Internet sowieso nur auf den Router stattfinden können, niemals direkt gegen einen Rechner im lokalen Netz. Denn dieses Netz ist nicht adressierbar!

Auf der Ebene von ipchains wird das Masquerading genauso behandelt, als wäre es eine Policy. Diese Policy ist aber logischerweise nur für die forward-chain gültig. Das angegebene Netzwerkinterface (-i) bezieht sich immer auf das externe Interface, auf dem die realen Adressen maskiert sein sollen. So wird etwa durch den Befehl

  ipchains -A forward -i $EXTERNAL_INTERFACE -s 192.168.100.0/24 -j MASQ

das Masquerading für das Netz 192.168.100.0 aktiviert. Das obige Beispiel erlaubt grundsätzlich alle Arten von Datenverkehr, natürlich könnten wir auch alle Regeltechniken, wie etwa Ports oder Protokolle hier benutzen, es handelt sich ja tatsächlich um eine Policy…

Die drei Regelketten input, forward und output werden in dieser Reihenfolge nacheinander abgearbeitet. Das bedeutet, dass nur diejenigen Pakete, die durch die input-chain durchkamen, and die forward-chain weitergegeben werden. Und nur diejenigen Pakete, die durch diese Kette kommen werden an die output-chain weitergereicht. Erst, wenn das Paket auch durch diese Kette durch ist, ohne ausgesondert worden zu sein, gelangt es tatsächlich ins Internet. Für aus dem Internet ankommende Pakete gilt dann wieder das entsprechende.