Login
Newsletter
Werbung

Mo, 25. August 2003, 00:00

Firewall selbst entwickeln

EgressFilter

EgressFilter()
{
 # Dont't let private addresses in.
 ${IPTABLES} -N in_private
 ${IPTABLES} -F in_private
 ${IPTABLES} -A in_private -j destroy -s 127.0.0.0/8
 ${IPTABLES} -A in_private -j destroy -s 10.0.0.0/8
 ${IPTABLES} -A in_private -j destroy -s 172.16.0.0/12
 ${IPTABLES} -A in_private -j destroy -s 192.168.0.0/16
 ${IPTABLES} -A in_private -j destroy -s 224.0.0.0/4
 ${IPTABLES} -A in_private -j destroy -s 240.0.0.0/4
 # Dont't let private addresses escape.
 ${IPTABLES} -N out_private
 ${IPTABLES} -F out_private
 ${IPTABLES} -A out_private -j destroy -d 127.0.0.0/8
 ${IPTABLES} -A out_private -j destroy -d 10.0.0.0/8
 ${IPTABLES} -A out_private -j destroy -d 172.16.0.0/12
 ${IPTABLES} -A out_private -j destroy -d 192.168.0.0/16
 ${IPTABLES} -A out_private -j destroy -d 224.0.0.0/4
 ${IPTABLES} -A out_private -j destroy -d 240.0.0.0/4
 ${IPTABLES} -A INPUT -j in_private -i ${INTERFACE}
 ${IPTABLES} -A FORWARD -j in_private -i ${INTERFACE}
 ${IPTABLES} -A OUTPUT -j out_private -o ${INTERFACE}
 ${IPTABLES} -A FORWARD -j out_private -o ${INTERFACE}
}

Bei Egressfilter handelt es sich genaugenommen um einen kombinierten Egress- und Ingress-Filter. Ersterer verhindert, daß Pakete mit privaten IP-Adressen (RFC 1537) nach draußen gelangen. Letzterer verhindert, daß Pakete mit solchen Absenderadressen von draußen zu uns herein gelangen, denn da solche Adressen im Internet nicht erlaubt sind, muß es sich um Fälschungen handeln.

Die Funktion definiert zwei neue Chains, in_private und out_private. Die vier Regeln am Ende der Funktion sorgen dafür, daß alle Pakete eine der beiden Chains durchlaufen. Das Sprungziel für Pakete, die ausgefiltert werden, ist unsere Chain destroy, die wir in der Funktion CreateBucket definiert haben.

AcceptLocal

AcceptLocal()
{
 ${IPTABLES} -A INPUT -j ACCEPT -i \! ${INTERFACE}
 ${IPTABLES} -A OUTPUT -j ACCEPT -o \! ${INTERFACE}
 ${IPTABLES} -A FORWARD -j ACCEPT -i \! ${INTERFACE} \
 -o \! ${INTERFACE}
 ${IPTABLES} -A FORWARD -j destroy -i ${INTERFACE} \
 -o ${INTERFACE}
}

AcceptLocal sorgt dafür, daß der Datenverkehr über unseren Router problemlos vonstatten geht, solange Quelle und Ziel im internen LAN liegen. Diese Funktion ist nur nötig, wenn man mehr als eine interne Netzwerkschnittstelle hat. Man kann sich natürlich darüber streiten, ob es sinnvoll ist, auf dem Internet-Gateway diese Routerfunktion zu haben. Bei mir ist es im Moment eben so, aber ich habe vor, das zu ändern.

Als zusätzlichen Bonus (letzte Regel) vernichtet die Funktion alle Pakete, die aus dem Internet stammen und gleich wieder ins Internet geroutet werden wollen. Solche Pakete sind höchst verdächtig, da sie unseren Rechner als Router mißbrauchen.

InOutTCP und InOutUDP

Bis jetzt haben wir einen Rahmen geschaffen, der alle Pakete zwischen LAN und Internet sperrt und alles andere weitgehend erlaubt. Nun müssen wir daran gehen, einige Protokolle zwischen dem LAN und dem Internet freizugeben. Dies tun wir getrennt für Verbindungen, die von innen nach außen und umgekehrt gehen. Verbindungen von außen nach innen werden wir weitgehend gesperrt lassen, denn dafür besteht auf einem Heim-Rechner kaum ein Anlaß. Es sei denn, man betreibt einen Server, was bei den heutigen Internet-Zugängen mit dynamischen IPs aus mehreren Gründen problematisch ist.

Es folgen zunächst zwei Funktionen, mit denen man Protokolle in beiden Richtungen freigeben kann. Sie delegieren die ganze Arbeit an einfachere Funktionen, die wir gleich vorstellen werden. Alle diese Funktionen erwarten als Argumente beliebig viele Portnummern oder Protokollnamen. Wenn man Namen verwendet, müssen diese in der Datei /etc/services einer Portnummer zugewiesen sein. Beispiele sind oben in der Funktion Start zu finden.

InOutTCP()
{
 InTCP $*
 OutTCP $*
}
InOutUDP()
{
 InUDP $*
 OutUDP $*
}

InTCP

InTCP()
{
 for i in $*
 do
 ${IPTABLES} -A INPUT -j ACCEPT -i ${INTERFACE} -p tcp \
 --dport $i -m state --state NEW,ESTABLISHED,RELATED
 ${IPTABLES} -A OUTPUT -j ACCEPT -o ${INTERFACE} -p tcp \
 --sport $i -m state --state ESTABLISHED,RELATED
 ${IPTABLES} -A FORWARD -j ACCEPT -i ${INTERFACE} -p tcp \
 --dport $i -m state --state NEW,ESTABLISHED,RELATED
 ${IPTABLES} -A FORWARD -j ACCEPT -o ${INTERFACE} -p tcp \
 --sport $i -m state --state ESTABLISHED,RELATED
 done
}

Diese Funktion erlaubt hereinkommende Verbindungen auf einem oder mehreren Ports. Sie ist nicht zuständig für ausgehende Verbindungen. Zu einer ankommenden Verbindung gehören Pakete in beide Richtungen, die jedoch unterschiedlich behandelt werden. Daher benötigt man eine Regel für jede Richtung. Wenn man wie hier auch noch Pakete hat, die entweder für den lokalen Rechner bestimmt sind oder weitergeleitet werden, dann ergibt das vier Regeln insgesamt. Auf einem normalen Heimrechner, der nicht mit weiteren Rechnern im LAN verbunden ist, kann man die Regeln für die FORWARD-Chain weglassen. Umgekehrt könnte bzw. sollte man auf einem reinen Router, der keinerlei lokale Dienste zur Verfügung stellt, die ersten beiden Regeln weglassen.

Die Regeln machen Gebrauch von "Stateful Filtering", was bedeutet, daß sich das System den Zustand von Verbindungen merkt. Damit können alle Pakete, die den aktuellen Zustand der Verbindung verletzen oder gar nicht zu einer bestehenden Verbindung gehören können, ausgefiltert werden. Das Einschalten des Stateful Filtering geschieht mit der Option -m state. Mit der Option --state wird ausgewählt, in welchen Verbindungszuständen ein Paket passieren darf. Da wir hier ankommende Verbindungen freischalten wollen, erlauben wir den Zustand NEW für ankommende Pakete aus dem Internet. Durch die Option -i ${INTERFACE} wird sichergestellt, daß nur aus dem Internet kommende Pakete betroffen sind. Zusätzlich geben wir für beide Richtungen die Zustände ESTABLISHED und RELATED frei. ESTABLISHED steht für eine aufgebaute Verbindung, auf der ganz normal Pakete ausgetauscht werden. RELATED steht für Pakete, die mit der Verbindung in Zusammenhang stehen, besonders ICMP-Pakete.

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