Login
Newsletter
Werbung

Mo, 25. August 2003, 00:00

Firewall selbst entwickeln

Der Rahmen

Das Skript ist wegen der Übersichtlichkeit und späteren Erweiterbarkeit auf zwei Dateien verteilt. Das "Hauptprogramm" des Skripts ist für das Starten und Stoppen der IP-Filter zuständig:

#!/bin/sh
. "`dirname $0`/ipfilter-util"
case "$1" in
 start)
 echo -n "Starting IP filtering... "
 Start
 echo "done."
 ;;
 stop)
 echo -n "Stopping IP filtering... "
 Stop
 echo "done."
 ;;
 close)
 echo -n "Closing IP interfaces... "
 Close
 echo "done."
 ;;
 *)
 echo "Usage: $0 start|stop|close"
 exit 1
esac
exit 0

Ich habe den Rahmen so einfach gehalten, daß er mit jeder Distribution funktioniert. Jede Distribution kommt jedoch mit einem Beispiel eines Init-Skripts, das man stattdessen auch verwenden könnte. Dazu muß man den obigen Code in das Beispiel-Skript einfügen. Rudimentäre Kenntnisse in der Shell-Programmierung sollte man dazu aber schon haben.

ipfilter-util

Stop und Close

Wie man am obigen Skript sieht, muß das Skript ipfilter-util nur drei Funktionen zur Verfügung stellen: Start, Stop und Close. Es stellt sich heraus, daß die Funktionen Stop und Close sehr simpel sind:

Stop()
{
 Flush ACCEPT
}
Close()
{
 Flush DROP
}

Wir haben also eine weitere Funktion zu definieren:

Flush()
{
 ${IPTABLES} -P INPUT $1
 ${IPTABLES} -P OUTPUT $1
 ${IPTABLES} -P FORWARD $1
 ${IPTABLES} -F
 ${IPTABLES} -F INPUT
 ${IPTABLES} -F OUTPUT
 ${IPTABLES} -F FORWARD
 ${IPTABLES} -X destroy > /dev/null 2>&1
 ${IPTABLES} -X in_private > /dev/null 2>&1
 ${IPTABLES} -X out_private > /dev/null 2>&1
}

Flush benötigt ein Argument, das entweder ACCEPT (Aufruf von Stop) oder DROP (Aufruf von Close) ist. Dies bestimmt die vorgegebene Policy des Paketfilters: Ist sie ACCEPT, werden alle Pakete durchgelassen. Ist sie DROP, werden alle Pakete vernichtet. Letzteres hat weitgehend dieselbe Wirkung wie das Herausreißen des Netzwerkkabels und ist nur für Notfälle gedacht.

Ferner entfernt Flush alle Regeln aus den vordefinierten Ketten (Option -F) und löscht die selbstdefinierten Ketten (Option -X). Wie diese definiert werden, werden wir später noch sehen. Die Ausgabe der letzten Kommandos geht nach /dev/null, damit wir keine Fehlermeldungen sehen, falls die Ketten nicht existieren sollten.

Zu erwähnen ist noch die Variable IPTABLES. Diese enthält den Pfad des iptables-Programms, in meinem System /sbin/iptables. Wo wir gerade dabei sind, ist jetzt eigentlich eine gute Gelegenheit, die drei Variablen zu beschreiben, die am Anfang des Skripts definiert sind. Diese müssen Sie an Ihre eigene Umgebung anpassen.

INTERFACE="ippp0"
LOCAL="192.168.0.0/24"
IPTABLES="/sbin/iptables"

INTERFACE ist der Name des Netzwerk-Interfaces, das zum Internet führt. Für die Leute, die eine dynamische IP-Adresse haben, und das ist ja die Mehrheit, ist es nicht sinnvoll, die IP in den Regeln zu verwenden. Stattdessen nimmt man den Namen des Interfaces. LOCAL ist der Adreßbereich des lokalen Netzes, das meist über das Interface eth0 erreicht wird. IPTABLES schließlich ist der Pfad des iptables-Programms, wie schon gesagt.

Start

Wir kommen nun zur Funktion Start, die unsere Filter definiert. Im Wesentlichen besteht Start aus einer Reihe von weiteren Funktionsaufrufen. Diese Funktionen werde ich im Folgenden vorstellen. Die ersten Funktionen initialisieren den Filter und definieren einige Grundregeln. Der Mittelteil definiert, welche Pakete durch den Filter passieren dürfen, und sollte von Ihnen an Ihre Bedürfnisse angepaßt werden. Er besteht aus den Funktionen InOutTCP, OutTCP, OutFTP, OutEqualUDP und InOutUDP. Danach folgen Regeln für ICMP (ich lasse derzeit alles durch). Zum Schluß folgen Regeln, die alle Pakete, die es bis hierher geschafft haben, vernichten. Im Grunde benötigt man diese Regeln nicht, aber sie sorgen dafür, daß weggeworfene Pakete im Syslog erscheinen. Ohne spezielle Regel würden sie einfach verschwinden. Das wäre weniger gut, weil man ja wissen will, wenn jemand einen Crack-Versuch unternommen hat.

Start()
{
 Close
 CreateBucket
 EgressFilter
 AcceptLocal
 InOutTCP 22 # auth, Telnet and ssh
 OutTCP http 81 https 8080
 OutTCP ftp smtp finger pop3 nntp
 OutTCP 871 # sup
 OutTCP realplayer
 OutTCP cvspserver
 OutTCP 6667 # IRC
 OutFTP
 OutEqualUDP ntp
 InOutUDP domain
 # Firewall ICMP. ICMP is useful so allow any by default.
 ${IPTABLES} -A INPUT -j ACCEPT -p icmp
 ${IPTABLES} -A OUTPUT -j ACCEPT -p icmp
 ${IPTABLES} -A FORWARD -j ACCEPT -p icmp
 ${IPTABLES} -A INPUT -j destroy
 ${IPTABLES} -A OUTPUT -j destroy
}

Die erste Funktion, Close, kennen wir bereits. Sie dient hier zum Rücksetzen der Ketten auf einen definierten Zustand. Außerdem wird die Default Policy gleich mal richtig gesetzt, nämlich auf DROP.

CreateBucket

CreateBucket()
{
 ${IPTABLES} -N destroy
 # These rules are only there for logging.
 ${IPTABLES} -A destroy -j LOG --log-level notice -m limit
 ${IPTABLES} -A destroy -j DROP
}

CreateBucket ist eine simple Funktion, die eine neue Kette destroy erzeugt und dieser zwei Regeln hinzufügt. Jedes Paket, das in dieser Kette landet, wird vernichtet, jedoch vorher im Syslog protokolliert. Das ist auch der einzige Sinn dieser Kette, nämlich sicherzustellen, daß kein unerlaubtes Paket unbemerkt bleibt. CreateBucket erzeugt also gewissermaßen unseren (Abfall-)Eimer.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung