Ein Firewall soll heutzutage eine Vielzahl von Aufgaben wahrnehmen, von denen der Schutz des lokalen Netzes nur die wichtigste aber bei weitem nicht die einzige ist. Er soll
Eines ist bei dieser Liste, die keinen Anspruch auf Vollständigkeit erhebt, völlig klar : mit einem klassischen Paketfilter alleine ist diese Liste nicht abzuhandeln. Bei dem Kauf eines Firewall hat man die Qual der Wahl unter hunderten. Wenn man das Wort "Firewall" durch das Wort "Auto" ersetzt (ich kaufe mir ein Auto), weiß man, warum die Preisspanne auch zwischen dem eines zehn Jahre alten Uno und einer fabrikneuen RollsRoyce-Flotte schwankt. Und ähnlich wie beim Neuwagenkauf muß man sehr genau auf die Serienausstattung schauen. Wenn überhaupt möglich, sind für einen Firewall mit allen genannten Eigenschaften sechsstellige Beträge fällig.
Aber es geht auch preiswerter und ohne Qualitätsverlust : mit Linuxwall.
Es soll Administratoren geben, die einen dringend nötigen Hardware-Update des Rechners vermeiden, damit nicht der Uptime-Rekord (cat /proc/uptime) gefährdet wird. Der Netzwerkteil ist ausgereift und kann dem Vergleich mit anderen Unix-Betriebssystemen standhalten.
Als nächstes Argument ist die Verfügbarkeit zu nennen. Für kein anderes Betriebssystem gibt es derart viele Kernel-Features und (freie) Tools wie für Linux. Zu jedem, wirklich jedem Anwendungsfall hat sich irgend jemand in der Linux-Gemeinde schon einmal Gedanken gemacht und etwas darüber geschrieben oder gar ein Programm veröffentlicht. Mag sein, daß manchmal die Begeisterung die Kompetenz überwiegt, trotzdem lohnt sich die Suche nach einem Startpunkt, der Arbeit vermeidet.
Der Linux-Kernel bietet eine Fülle von Möglichkeiten, um einen Firewall zu realisieren. Das galt für 2.0, in 2.2 hat sich Erhebliches getan. Die Aktualität von Treibern hinkt im Moment dem "Programmlader mit GUI" noch etwas hinterher. Man sollte nicht die allerneueste Hardware einsetzen, wenn man nicht sicher weiß, daß es dazu einen Linux-Treiber gibt. Das Warten von ein bis zwei Monaten wirkt da oft Wunder. Sehr oft sind hingegen kommerzielle Firewalls mit anderen Unix-Derivaten entwickelt und nur auf ganz speziellen Hardwareplattformen (sprich alten) lauffähig. Da kann dann ganz schnell ein Ersatzteilproblem entstehen, das man mit Linux wegen der großen Verbreitung nicht hat.
Die Skalierbarkeit ist hingegen unerreicht. Es gibt einen inoffiziellen Wettbewerb, wer Linux auf dem minimalsten und auf dem maximalstenr Rechner betreiben kann. Die Spanne reicht dabei von einem 2-MB-386 bis zu dem Clone-Projekt (Linux-Magazin 2/99) mit über 500 Knoten. Der Autor hat seinen ersten Linux-Firewall mit einem plattenlosen ausgedienten 8-MB 386 entwickelt, der per Diskette bootet und sein root-Dateisystem von einem anderen Linux-Server via NFS bezieht.
Und da ist da noch die Hilfsbereitschaft. Andere Betriebssysteme sollen den Vorteil haben, daß der Hersteller für das Betriebssystem geradesteht und Fehler behebt, sobald diese entdeckt werden. Je nach Hersteller kostet das unterschiedlich viel Geld und im Fehlerfall zusätzlich viel Zeit und Nerven. Es bringt meist wenig bis gar nichts. Linux hat keine Herstellerfirma, die ich als IT-Verantwortlicher verantwortlich machen kann (CYA : Cover Your A..) und deshalb ist es den meisten Entscheidern suspekt. Jedoch ist es mit Linux dem Autor mehrmals passiert, daß in wirklich hoffnungsloser Lage nach dreitägigen Tests und dem ersten Hilferuf mit allen Fakten in die Newsgruppen binnen eines Tages mehrere funktionierende Problemlösungen, zum Teil von den Entwicklern selber, vorlagen. (Fußnote : jemand fragte in einer Newsgruppe einmal, wie man unter bash die Versionsnummer herausbekommt. Nach 5000 Antworten hat er "Danke, jetzt bitte keine weiteren Antworten mehr" gemailt). Die Fehlerbehebung ist bei Linux schneller als bei irgendeinem anderen Betriebssystem. Für einen illegalen Befehl des Pentium, der im User-Mode den Rechner lahmlegte, war innerhalb von zwölf Stunden ein Patch für Linux verfügbar. Intel bestätigte die Richtigkeit dieses Patches und alle anderen Betriebssystem haben dann nur noch abgeschrieben.
Ein ganz wesentlicher Faktor ist auch die Transparenz. Man kann - im Gegensatz zu allen anderen Firewall-Anbietern - beweisen, daß im Firewall keine Hintertürchen vorhanden sind.
Und schließlich der Preis. Das gesamte Betriebssystem, die Dienstprogramme und fast alle sonstigen Teile sind frei und kosten nichts. Der einzige Aufwand, aber der kann für die angesprochenen Aufgaben ganz erheblich sein, ist die Arbeitskraft, die man aufwenden muß, alle freien Teile zu sammeln und zusammenzukleben.
Da ein Linux-Firewall auch gleichzeitig Router ist, läßt sich diese Kombination feiner einstellen als bei getrennten Geräten. Es empfiehlt sich generell, an einem Linux-Firewall die vielen Netzwerksegmente eines LANs zusammenzuführen, bei den heute üblichen Mehrfach-Ethernetkarten bis zu 16 Segmente. Bei anderen Firewalls ist die Anzahl der Netzwerkschnittstellen auf zwei oder drei begrenzt und deshalb hat man diesen Freiheitsgrad nicht.
Das Programm ipchains ist die Benutzerschnittstelle zum Paketfilter im Kern. Je Aufruf des Programms wird eine Regel für IP-Pakete angegeben, andere Protokolle (z.B IPX oder NetBEUI) können nicht behandelt werden. Eine Regel gibt die Eigenschaften eines Paketes an und definiert eine Aktion, wenn das Paket allen angegebenen Eigenschaften entspricht. Die Eigenschaften sind u.a.
Auf die Angabe der Eigenschaften folgt eine Aktion :
Zusätzlich kann ein Paket, das alle angegebenen Eigenschaften erfüllt, an das Kernel-Logging übergeben und/oder an das Netlink-Gerät (s.u.) weitergereicht werden.
Durch eine Verknüpfung von Eigenschaften und Aktion lassen sich einzelne Regeln angeben, z.B. akzeptiere ein eingehendes Paket an Schnittstelle eth0 von beliebigem Rechner und beliebigem Port zum Rechner 123.234.1.2 Zielport 80; als Befehl ipchains -A input -i eth0 -d 123.234.1.2 80 -j ACCEPT
Für eine normale TCP-Verbindung über den Firewall sind sechs Regeln notwendig, jeweils drei für den Hin- und drei für den Rückweg. Wenn wir z.B. Web-Zugriffe aus dem lokalen Netz ins Internet zulassen wollen, so lauten diese Regeln mit dem lokalen Netz 212.212.212.0/24 an eth0 und dem Internet an eth1 :
LAN=212.212.212.0/24
ipchains -A input -i eth0 -p tcp -s $LAN -d 0.0.0.0/0 80 -j ACCEPT (Input vom lokalen Netz)
ipchains -A forward -i eth1 -p tcp -s $LAN -d 0.0.0.0/0 80 -j ACCEPT (Übergabe an eine andere Schnittstelle)
ipchains -A output -i eth1 -p tcp -s $LAN -d 0.0.0.0/0 80 -j ACCEPT (Ausgabe ins Internet)
ipchains -A input -i eth1 -p tcp -s 0.0.0.0/0 80 -d $LAN -j ACCEPT (Input vom Internet)
ipchains -A forward -i eth0 -p tcp -s 0.0.0.0/0 80 -d $LAN -j ACCEPT (Übergabe an eine andere Schnittstelle)
ipchains -A output -i eth0 -p tcp -s 0.0.0.0/0 80 -d $LAN -j ACCEPT (Ausgabe ins lokale Netz)
Eine typische Paketfilterschicht eines Firewall besteht aus hunderten von Regeln. Die erste passende Regel mit einer echten Aktion wird genommen und ausgeführt. Eine einzige Regel, die falsch angegeben ist, kann ein fatales Sicherheitsloch sein. Es ist deshalb immer anzuraten, die Regeln so eng wie möglich anzugeben und dann erst bei Bedarf zu erweitern. Als letzte Regel für die drei Ketten (ipchains) input, forward und output wird deshalb von mir immer eine "Log-Regel" angegeben. Die gilt für alle Pakete, die bis zum Ende der Ketten gelangt sind und bislang noch nicht paßten. Sie werden abgelehnt und gleichzeitig im syslog ausgegeben, so daß dann eine passende Regel angegeben werden kann.
Nehmen wir nun den Fall, daß wir nur eine einzige echte (feste) Internet-Adresse benutzen. Dann wird das interne Netzwerk "maskiert", d.h. auf dem Firewall werden die Netzwerkverbindungen umgesetzt. Ein Beobachter im Internet sieht einen einzigen Rechner, der viele Verbindungen zu verschiedenen Zielen hat, ein Beobachter im lokalen Netzwerk sieht direkte Verbindungen zu den Zielrechnern. Die Verallgemeinerung der Maskierung (masquerading), bei der eine n:1-Beziehung realisiert wird, heißt NAT (Network Address Translation). Bei NAT wird eine m:n-Zuordnung gemacht. Im Firewall wird eine Tabelle geführt mit der Zuordnung von vermeintlichen Verbindungen zwischen Client und Server, Verbindungen zwischen Client und Firewall sowie maskierten Verbindungen zwischen Firewall und Server. Für den Client ist bei Masquerading der Firewall transparent, der Server hingegen sieht eine Verbindung zum Firewall. Die maskierten Pakete werden so im Firewall verändert, daß die beiden anderen beteiligten Rechner präsentiert wird, was sie sehen sollen.
Deshalb haben sich unsere Regeln auch wie folgt verändert :
LAN=10.1.2.0/24 # privater Adressraum nach RFC1918
FWADDR=212.212.212.212
ipchains -A input -i eth0 -p tcp -s $LAN -d 0.0.0.0/0 80 -j ACCEPT (Input vom lokalen Netz)
ipchains -A forward -i eth1 -p tcp -s $LAN -d 0.0.0.0/0 80 -j MASQ (Übergabe an eine andere Schnittstelle)
ipchains -A output -i eth1 -p tcp -s $FWADDR -d 0.0.0.0/0 80 -j ACCEPT (Ausgabe ins Internet)
ipchains -A input -i eth1 -p tcp -s 0.0.0.0/0 80 -d $FWADDR -j ACCEPT (Input vom Internet)
(die Demaskierung wird vom Kernel übernommen, Regel entfällt)(Übergabe an eine andere Schnittstelle)
ipchains -A output -i eth0 -p tcp -s 0.0.0.0/0 80 -d $LAN -j ACCEPT (Ausgabe ins lokale Netz)
Bei dynamischer IP-Adressenzuweisung, die man bei Einwählverbindungen normalerweise hat, kann man diese Regeln nicht statisch angeben. Im Skript ip-up müssen diese Regeln (mit -I statt -A) und der zugewiesenen IP-Adresse eingefügt und im Skript ip-down (mit -D statt -A) wieder entfernt werden.
In vielen Veröffentlichungen wird über die Probleme berichtet, die bei FTP und Paketfilterung entstehen. Aus diesem Grund wurde das passive FTP erfunden, das standardmäßig von Browsern, aber nicht von Online-Sitzungen, benutzt wird. Generell haben Paketfilter dann potentielle Sicherheitsprobleme, wenn eine Sitzung mehrere Verbindungen benötigt, oft auch im UDP-Bereich. Bekannte Kandidaten sind z.B. FTP, IRC, pcAnywhere. Um statisch diese Verbindungen zuzulassen, müssen die Regeln weiter gefaßt werden als eigentlich beabsichtigt. Nur ein sogenannter Proxy-Prozeß kann Regeln dynamisch ein- und ausfügen, indem er das zugrunde liegende Protokoll (z.B. FTP) interpretiert und die nötigen Aktionen vornimmt.
Ein Proxy-Prozeß kann viele Aufgaben haben :
Proxies können geschachtel sein, etwa bei einem HTTP-Zugriff. Der Proxy, der dem Client zugewandt ist, prüft z.B. Berechtigungen und gibt die Anfrage an einen speziellen HTTP-Proxy, z.B. Squid oder Apache, weiter.
Wenn ein Proxy benutzt wird, entfallen die forward-Regeln. Ein Masquerading ist unnötig, da die Pakete aus den Netzen jeweils am Proxy enden und somit für en Client die Zieladresse und den Server die Quelladresse sind. Das Problem dieser Art von Proxies ist damit aber auch, daß der Benutzer den Proxy wahrnimmt und zusätzliche Aktionen, z.B. Einstellungen im Browser, vornehmen muß.
TCP
Bei TCP-Verbindungen setzt man einen Proxy auf, der diese Verbindung annimmt. Mittels getsockname(), der bei einer redirektionierten Verbindung nicht die eigene Adresse zurückliefert, läßt sich feststellen, welcher Rechner ursprünglich erreicht werden sollte. Zu diesem Rechner baut man den zweiten Socket auf. Der Rest ist dann simples hin- und herkopieren. Client und Server nehmen den Firewall nicht wahr, q.e.d. .
Es lassen sich auch geschachtelte Proxies realisieren. Interessant wird das z.B. für Proxy-Web-Caches wie Squid oder Apache. Bei diesem seltenen aber interessanten und häufig benutzten Spezialfall konfiguriert man den HTTP-Proxy-Server so, daß er auf die Adresse 127.0.0.1 statt 0.0.0.0 gebunden wird. Die bedienenden äußeren Proxies wiederum werden auf die Adressen der Netzwerkschnittstellen gebunden, je Netzwerkschnittstelle ein Prozeß. Ein Verbindungswunsch läuft zur Netzwerkschnittstelle, wird dort redirektioniert auf die Adresse dieser Netzwerkschnittstelle, damit vom äußeren Proxy-Prozeß empfangen und akzeptiert. Eine zweite Verbindung wird zum HTTP-Proxy-Prozeß (Squid oder Apache) aufgebaut und dieser erst baut die eigentliche Verbindung zum Zielrechner auf. Damit nun HTTP-Requests auf den Firewall selbst keine rekursiven Prozesse aufbauen (leidvolle eigene Erfahrung), muß der HTTP-Header in diesem Fall umgeschrieben werden, also "http://localhost/..." statt "http://firewall/...". Dazu wird die Zieladresse des eigentlichen Ziels gegen alle Adressen der Netzwerkschnittstellen geprüft.Der Nachteil bei dieser Konstruktion ist, daß im Browser kein Proxy eingestellt sein darf. Alle Requests landen sonst auf dem lokalen Web-Server. Der Rest ist dann wieder simples hin- und herkopieren.
UDP
Braucht man keine VPNs mit ENskip, oder zusätzliche Eigenschaften wie Authentisierungsprüfung oder Logginginformation, so läßt sich ein transparentes UDP-Proxy mittels Masquerading emulieren. Der Kernel übernimmt dann alles Weitere. Der Autor mußte ENskip benutzen und konnte damit von dieser Möglichkeit keinen Gebrauch machen.
Bei UDP liegt der Fall komplizierter als bei TCP, man hat keine Verbindung. Jedes Paket kann für sich alleine stehen oder auch die Antwort auf ein anderes Paket sein. Es gibt viele Applikationen, angefangen bei DNS und traceroute, die UDP benutzen. Da man nicht weiß, ob ein bestimmtes Paket die Antwort auf ein anderes Paket ist, bleibt keine andere Möglichkeit, als sich alle UDP-Pakete zu merken und Verfallsdaten für Quasi-UDP-Verbindungen zu definieren (z.B. DNS-Request und DNS-Reply). Beim Eintreffen eines Antwort-Pakets wird die Zeitschranke wieder auf den Maximalwert gesetzt. Je beobachtetem UDP-Port (und ggf. Netzwerkschnittstelle) wird wie bei TCP ein Prozeß benötigt. Der Proxy-Prozeß hat eine Tabelle, die Originalquelle und -ziel, die beteiligten UDP-Ports, Zeitschranke und den Filedeskriptor des Antwort-Sockets enthält. Trifft nun ein UDP-Paket mittels select() auf dem gebundenen UDP-Port ein, wird die Tabelle nach der echten Zieladresse (der Trick hier ist das undokumentierte recvfrom(...,MSG_PROXY,...) und das Lesen der Kernel-Sourcen) durchforstet. Wenn der Eintrag nicht gefunden wird, ein Antwort-Socket eröffnet, und dann wird das Paket über diesen Antwort-Socket ausgeliefert. Ein ankommendes Paket auf diesem Socket wird mit Hilfe der Informationen der Tabelle mit einem neuen Header versehen und an die ursprüngliche Quelle ausgeliefert.
Das hier beschriebene Verfahren ist nicht der Weisheit letzter Schluß und hat eine Reihe von Schwachstellen, unter anderem die vielen Prozesse und Dateien (traceroute !), aber es läuft in der Praxis sehr zuverlässig. Verbesserungsvorschläge und Geistesblitze sind trotzdem jederzeit herzlich willkommen.
ICMP
Ein transparenter Proxy wie bei TCP und UDP läßt sich mit den bis jetzt beschriebenen Mitteln nicht bauen, es fehlt nämlich die dafür notwendige Kernel-Unterstützung. Deshalb muß man sich hier etwas Neues einfallen lassen, wenn man mit dem ping-Kommando, das von allen Kunden erwartet wird, arbeiten will. Glücklicherweise gibt es im ipchains-Kommando die Option -o, die Pakete an das Netlink-Gerät 36,3 ausliefert. Da auch in den Standard-Dokumenten kein Name für dieses Gerät existiert, habe ich es der Einfachheit halber /dev/firewall genannt. Auf dieses Gerät greift unser Proxy-Prozeß zu. Zunächst werden anders als bei TCP und UDP die Pakete nicht redirektioniert, sondern verworfen und gleichzeitig an /dev/firewall geschickt, also "-o -j DENY". Der Proxy-Prozeß öffnet dieses Gerät und liest. Alle Pakete werden so wie sie ankommen, vorneweg ein Header mit Angaben zur Gesamtlänge dorthin geschrieben. Das weitere Vorgehen ist wieder wie beim transparenten UDP-Proxy : eine Tabelle wird gehalten und Quelle, Ziel, Typ, Code und ID verglichen. Im Falle einer Übereinstimmung wird ein neues ICMP-Paket mit angepaßter Quelle und Ziel vom Proxy losgeschickt. Da es möglicherweise mehrere Routen gibt, muß für sendto() vorher ermittelt werden, welches der richtige Gateway ist.
Das Erstaunliche ist : leitet man alle ankommende Pakete mit "-o -j DENY" um, so hat man einen monolithischen Ansatz, bei dem ein einziger Prozeß alle Pakete (auch TCP und UDP) inspiziert, und entscheidet, was mit diesen angestellt wird. Dieser Ansatz steht dem Schichtenmodell gegenüber, heißt "stateful inspection" und wird in der Firewall des derzeitigen Marktführers Checkpoint, Produktname Firewall-1, verfolgt.
Andere IP-Protokolle
Es gibt eine Reihe von interessanten Protokollen, etwa SKIP, IPIP, GRE, IGMP und EGP, die einen transparenten Proxy verdienen. Insbesondere die Multicast-Protokolle und die Kapselung IPV6 in IPV4 werden in nächster Zeit Bedeutung erlangen. Prinzipiell lassen sich diese Protokolle nur durch direkte Interpretation der Paketinhalte und mit dem Vorgehen wie bei ICMP handhaben.
Auch wenn fast jeder Browser heutzutage einen integrierten Cache hat, kann damit der Mehrfachaufruf einer Web-Seite von verschiedenen Clients nicht bedient werden. Ein häufiger Anwendungsfall für geschachtelte transparente Proxies sind Anwendungen wie z.B. Squid oder Apache, die als Web-Cache und -Proxy konfigurierbar sind. Apache hat dabei noch den Vorteil, daß ein HTTP-Server integriert ist und mit Zusatzmodulen zu einem HTTPS-Server aufgemotzt werden kann. Dadurch ist zusätzlich - die entsprechenden Web-Seiten vorausgesetzt - eine verschlüsselte Fernkonfiguration möglich.
Rechner A ruft eine eine Internet-Webseite von Rechner B über den Firewall auf. Die Anforderung (Port 80/www) wird per REDIRECT auf den Proxy-Prozeß (A) umgeleitet. Dieser schreibt den HTTP-Header um und addressiert den Firewall-HTTP-Proxy (B) (Squid oder Apache). Der HTTP-Proxy (B) holt die Web-Seite, leitet sie an den Proxy-Prozeß (A) weiter und legt sie zusätzlich im lokalen Cache ab. Der Proxy-Prozeß (A) nimmt zusätzliche Prüfungen vor. Beispielweise werden beim sogenannten Content Filtering Viren gesucht, JavaScript, Java- oder DCOM(ActiveX)-Objekte ausgeblendet, Cookies nicht durchgelassen, usf.. Anschließend wird diese (oder im Falle eines Virus eine Ersatzseite) an den Client (Rechner A)zurückgeleitet.
Die Benutzung als FTP-Cache ist auch einfach : als URL ist der FTP-Zugriff ftp:://der.server/pfad.zur.datei. Man schreibt einen transparenten FTP-Proxy, der das FTP-Protokoll bis zu dem Zeitpunkt bedient, an dem eine Datei angefordert wird. Statt nun die Datei per FTP zu holen, wird ein HTTP-Request an den Firewall-HTTP-Proxy abgesetzt. Damit wird auch automatisch dessen Cache benutzt. Damit sind mehrfache Downloads großer Dateien möglich, ohne die Internet-Bandbreite tatsächlich zu beanspruchen.
Der Unterschied zum ipchains-Kommando besteht darin, daß nicht bestimmte Pakete aller Netzwerkschnittstellen umgeleitet werden, sondern alle Pakete einer bestimmten Netzwerkschnittstelle.
Mit diesen Geräten ist es beispielsweise möglich, Routen auf die virtuellen Ethertap-Netzwerkschnittstellen umzuleiten und auf dieser Ebene Proxies bis hin zu "stateful inspection" auf Benutzerebene zu realisieren.
Bei diesem Mechanismus hat der Berkeley Packet Filter (BPF) Pate gestanden. Man eröffnet einen beliebigen Socket, gibt ein Stückchen Programmcode zum Filtern dieses Sockets an und injiziert diesen Programmcode mittels eines ioctl-Aufrufs in den Kernel. Das Programm selbst dient dann nur dazu, den Socket offenzuhalten und den Filter wieder zu beseitigen. Diese Methode ist sicherlich die schnellste Filterung, geeignet für hohen Durchsatz. Der Nachteil liegt in der Programmierung auf Kernel-Ebene mit den schlechteren Debug- und Trace-Möglichkeiten, die auch die Möglichkeit eines Komplettausfalls des Firewall einschließt.
Wichtige Werte sind z.B. in /proc/net/, und /proc/sys/net/ipv4 zu finden. Damit läßt sich das System sehr fein als Firewall einstellen, etwa eine forward-Option je Interface (für klassische Firewall-Ansätze mit einem geschützten administrativen Interface). Für bekannte Angriffe wie SYN-Flooding, IP-Spoofing oder Source Routing läßt sich die Sicherheit und Geschwätzkeit des Kernels mit Hilfe dieser Variablen abhängig von der Netzwerkschnittstelle einstellen. Die Akzeptierung bekannter Router-Protokolle, die für Firewalls eine Angriffsmöglichkeit sind, können auf bestimmte Gateways einschränkt oder ganz verboten werden.
Die Dokumentation zu den einzelnen Dateien ist im Unterverzeichnis Documentation/networking des Linux-Quellcodes zu finden.
Der Schwerpunkt der Weiterentwicklung wird im Moment auf Scheduling-Algorithmen gelegt, also das Verhalten in dem Fall, wenn mehr Pakete auszugeben sind als Bandbreite vorhanden ist. Hier kann man aus einer Fülle von Algorithmen wählen. Es läßt sich (als ein Algorithmus) mit dem ipchains-Kommando eine Markierung am Paket anbringen, die je übereinstimmender Regel aufaddiert wird. Je höher dieser Wert, desto eher wird dieses Paket bevorzugt.
Durch die Verwendung von Standards (IPsec) ist Linux auch hier in der Lage, interoperabel mit anderen Herstellern zu sein.
Die Beschreibung, wie VPN mit einem Linux-Firewall funktioniert und welche Paketfilterregeln angegeben müssen, würde den Rahmen sprengen und Stoff für einen weiteren Artikel liefern ( :-) ). Der geneigte Leser kann vom Autor eine LinuxWall-Demo-CD anfordern, auf der die technischen Einzelheiten beschrieben sind.
Prinzipiell zeigt dieser Vorgang aber auch, wie wichtig es ist, nicht nur den Zugang von außen nach innen zu versperren, sondern auch den Zugang von innen nach außen zu regeln. Unbeabsichtigt können sonst Informationen in Hände geraten, in denen man sie nicht haben will. Gegen absichtliche Übermittlung ist ohnehin nur der gezogene Netzwerkstecker und das ausgebaute Diskettenlaufwerk wirksam.