Firewall, Marke Eigenbau:

1. Einleitung
2. Betrieb einer Firewall
3. Vorüberlegungen
4. Definition des Ziels
5. Verbindungen
6. Realisation
7. Beispiele für Regellisten
8. Bash- Script

1. Einleitung:

Linux bringt von Hause aus die besten Möglichkeiten mit, einen Rechner als Firewall zu betreiben. Je nach Kernel- Version gibt es unterschiedliche Implementierungen. Im Kernel 2.0 gab es das Paket ipfwadm, im Kernel 2.2 das Paket ipchains und im (aktuellen) Kernel 2.4 das Paket iptables. Um Konfigurationen die für eine Kernelversion erstellt wurden, in die Konfiguration für eine andere Kernelversion zu bringen gibt es zahlreiche Wrapper- Tools. Da ich mich bisher ausschließlich mit dem Paket ipchains der Kernelversion 2.2 beschäftigt habe, beziehen sich alle Bespiele auf dieses Paket. Viele Aussagen sollten aber auch auf andere Kernelversionen, teilweise sogar auf den generellen Betrieb einer Firewall übertagbar sein.

2. Betrieb einer Firewall:

Die Realisation eines Firewall- Systems hängt von vielen Faktoren ab. Einige, die für mich wichtigsten, möchte ich nachfolgend nennen:

Zu beachten ist hierbei, das die Anforderungen an die Sicherheit in etwa der 80/20- Regel folgen. Mit wenigen Mitteln kann man einen guten Sicherheits- Standard erreichen, viel man (noch) ein wenig mehr, muss man viel Investieren um dies zu erreichen. Dies gilt insbesondere für die Umsetzung unter Linux. Bespielsweise reicht (meistens) eine vergleichbare einfache Hardware und eine "normale" Linux- Distribution aus. Interresant sind auch die in letzter Zeit populär gewordenen Diskless- Systeme, die von vielen Linux- Distributoren anbeboten werden. Ich kann jedenfalls nur Empfehlen, das gewünschte / gesteckte Ziel durch externe Stellen Überprüfen zu lassen.

3. Vorüberlegungen:

Zuerst muss das Ziel so präzise wie nur irgend Möglich festgelegt werden. Es muss geprüft werden ob neben dem Paketfilter noch andere Schutzmechanismen wie Proxy- Server oder Virenscanner sinnvoll und gewünscht sind. Bei allen Implementierungen unter Linux handelt es sich ausschließlich um Paketfilter die nicht vor Schadsoftware wie Viren schützen und auch keine (komfortablen) Möglichkeiten zur Kontrolle oder Protokollierung von Internetdiensten ermöglichen.

Ich gehe hier von folgendem Szenario aus: Für die Realisation des Firewall- Rechners steht ein Standard- PC- System ausreichender Dimensionierung zur Verfügung. Der Rechner ist über eine Wählverbindung mit dem Internet (ISDN- Karte, hier ippp0) und einer Ethernet- Netzwerkkarte (hier eth0) mit dem Intranet verbunden. Diese Szenario trifft (wahrscheinlich) auf viele häusliche und auch einige betriebliche Einsatzgebiete, zumindest weitgehend zu.

4. Definition des Ziels:

Ziel ist (vorläufig) nur die Filterung aller, bis auf die nachfolgend genannten, Dienste: Pakete des ICMP- Protokolls von und zum Internet, FTP, SSH, SMPT, DNS, HTTP, POP3, NEWS, und HTTPS. Dies ermöglich den Benutzern die Nutzung der bekanntesten und wichtigsten Internet- Dienste.

Der Verbindungsaufbau soll, soweit realisierbar, nur vom Intranet zum Internet, und nicht umgekehrt möglich sein. Dies ist aber nur mit einem verbindungsorientierten Protokoll wie TCP möglich. Demzufolge wird auf ein Betrieb mittels verbindungslosem Protokoll, wie UDP, weitgehend verzichtet.

5. Verbindungen:

Exkurs: FTP

FTP- Verbindungen weisen zum Vergleich zu anderem tcp/ip- Verbindungen einige Ausnahmen und Besonderheiten auf. Zuerst gilt es zum Beachten, dass FTP- Verbindungen grundsätzlich über 2 Kanäle betrieben werden. Zum einen gibt es den Kommandokanal, über den, wie der Name schon aussagt die Befehle auf dem Remote- System ausgeführt werden. Zum Anderen gibt es den Daten- Kanal, über den die eigentliche Daten- Übertragung stattfindet. Weiterhin ist zu Beachten das zwischen aktivem und passivem (aus Sicht des Servers) FTP unterschieden wird. Der Verbindungsaufbau ist jedoch immer gleich, und findet folgendermaßen statt:

	1. Client- Rechner (Port>1024) -------------> Server- Rechner (Port 21)
	2. Client- Rechner (Port>1024) <------------- Server- Rechner (Port 21)

Erst jetzt wird zwischen aktivem / passivem FTP unterschieden. Wir betrachten zunächst dem weiteren Verbindungsaufbau beim aktiven FTP:

	3. Client- Rechner (Port>1024) <------------- Server- Rechner (Port 20)
	4. Client- Rechner (Port>1024) -------------> Server- Rechner (Port 20)

Dies öffnet jedoch Clientseitig einige Sicherheitslücken, da der Port 20 für eingehende Verbindungsaufbau- Packete freigeschaltet werden muss. Die andere Alternative ist das passive FTP, das im Übrigen auch von den meisten Web- Browsern benutzt wird:

	3. Client- Rechner (Port>1024) -------------> Server- Rechner (Port>1024)
	4. Client- Rechner (Port>1024) <------------- Server- Rechner (Port>1024)

Der Verbindungsaufbau wird hier von Client initiert. Der FTP- Datenport wird hier überhaupt nicht genutzt, da der Client eine Verbindung zu einem High- Port des Servers aufbaut. Dies wiederrum erfordert das Freischalten von Verbindungsaufbau- Paketen auf die High- Ports des Servers, was dem FTP- Admin Kopfschmerzen bereiten dürfte.

6. Realisation:

Nachdem man das Ziel definiert wurde und man sich mit den freizuschaltenden Verbindungen vertraut gemacht hat, kann man mit der Umsetzung beginnen. Dies erfordert ein wenig Wissen über die Funktionsweise des Paketes ipchains. Ob, wie und welche Pakete akzeptiert oder verworfen werden, wird bei ipchains in einer Kette von Regeln festgelegt. Diese Regeln werden in einer bestimmten Reihenfolge bearbeitet. Trifft eine der Regeln zu, wird eine entsprechende Aktions ausgeführt. Es gibt die drei folgenden Standard- Regellisten:

Neben diesen Standard- Regeln hat man die Möglichkeit benutzerdefinierte Regeln zu erstellen. Darauf werde ich an anderer Stelle noch eingehen. Verwendet man mehr als ein Netzwerk- Interface, ist es sinnvoll zu jeder Input- oder Output- Regeln das entsprechende Interface anzugeben. Gibt man beispielweise das Interface ippp0 (für die erste ISDN- Karte) an, bezieht sich die nachfolgende Regel ausschließlich auf dieses Interface.

Hinweis: Die Regeln einer Liste werden der Reihe nach von oben nach unten abgearbeitet. Die erste Regel, die eine Übereinstimmung liefert, wird ausgeführt. Spezielle Regeln müssen deshalb unbedingt vor Allgemeineren stehen.

Folgende Aktionen auf eine Regel sind möglich:

Zunächst muss man aber für jede Regel die Default- Policy festlegen. Dies legt fest, wie Pakete, auf die keine Regel der Liste zutrifft behandelt werden. Es versteht sich von selbst, das es einfacher ist, zuerst alles zu verbieten (DENY) und die erwünschten Verbindungen danach wieder freizuschalten. Will man auch angenommende Pakete protokollieren, kann es sinnvoll sein die default policy auf ACCEPT und nicht auf DENY zu setzen. Als letzte Regel fügt man dann wieder eine Regel ein, die alles verbietet.

Zu anlegen neuer Regeln, zu anhängen und einfügen in bestehende Regellisten und zum löschen von Regeln stehen folgende Optionen bereit:

Weiterhin gibt es die folgenden Optionen, um eine Regel zu erstellen:

Will man den (Quell- oder Ziel-) Port angeben, und man hat keine IP- Adresse als Quelle oder Ziel angegeben, kann man dies über --sport (source port) bzw. --dport (destination port) erreichen. Es gibt auch die Möglichkeit ganze Portbereiche anzugeben (Port-Range), z.B. 137:139 schaltete alle Ports von 137 bis 139 frei. Durch ein "!" wird die jeweilige Option negiert.

7. Beispiele für Regellisten:

Beispiel 1: Die Regel ipchains -s 0/0 -j DENY -l verwirft alle Pakete und loggt diese.
Beispiel 2: Die Regel ipchains -A INPUT -p tcp -s 0/0 80 -d 192.168.100.0/24 -j user_fw fügt eine Regel in die INPUT- Regelliste ein, die alle ankommenden Pakete von Port 80 zum Netz 192.168.100.0 mit dem TCP- Protokoll in die benutzerdefinierte Regel user_fw weiterleitet.

8. Bash- Script:

Anstatt alle diese Regeln (wiederkehrend) einzelnd an der Konsole einzugeben kann man auch eine Shell- Script schreiben, welches die Verwaltung der Regeln übernimmt. Nachfolgend ein kleines Beispiel:

    #!/bin/bash
    /* Variablen definieren */
    ipchains = /sbin/ipchains
    internet = 0.0.0.0/0
    intranet = 192.168.0.0/24

    /* Alles bestehende Regeln löschen */
    $ipchains -X
    $ipchains -F

    ...

Last Update: 02.01.2002