Einleitung
Wenn man Server oder ähnliche Systeme betreibt, auf die aus dem Internet zugegriffen werden kann, so möchte man diese natürlich auch vor Angriffen schützen. Die beste Lösung hierfür ist natürlich eine professionelle Firewall, die neben einem einfachen Paketfilter auch ein Intrusion Prevention System bereitstellt, mit dem selbst sehr komplexe Angriffe erkannt und geblockt werden können. Diese sind jedoch meist sehr teuer, so dass dies manchmal den finanziellen Rahmen sprengt. Da diese üblicherweise einzelne DMZs mit unterschiedlichen IP-Netzen verwenden, ist eine nachträgliche Einbindung in die Kommunikation meist mit mehr oder weniger umfangreichen Netzwerk-Umstrukturierungen verbunden.
Es gibt jedoch eine Alternative, die zwar einen geringeren Funktionsumfang bietet, dafür jedoch wesentlich günstiger ist und einfacher in ein bestehendes Netzwerk integriert werden kann: Eine Bridge-Firewall Diese Art von Firewall arbeitet transparent, wodurch sie einerseits ohne Anpassung des Netzwerks in einen Kommunikationsweg eingefügt werden kann. Zudem ist sie für keinen der Kommunikationspartner sichtbar, da sie den Datenstrom nur mitliest und (außer durch das Firewall-Regelwerk) nicht beeinflusst. Dieses Regelwerk besteht dagegen nur aus einem einfachen Paketfilter, mit dem eine Prüfung des Datenstroms nur anhand von Parametern der verwendeten Netzwerk-Protokolle möglich ist (z.B. IP-Adresse). Richtet man diese jedoch so ein, dass alles, was nicht explizit erlaubt ist, geblockt wird, so lassen sich allein dadurch bereits viele Angriffe von vornherein verhindern.
In nachfolgenden Anleitung wird nun erklärt, wie man selbst eine solche Bridge-Firewall mit Unterstützung von IPv4 und IPv6 unter Ubuntu 10.04 LTS erstellen kann und was dazu benötigt wird. Mit anderen Linux-Distributionen sollte es jedoch ähnlich möglich sein, so dass diese Anleitung prinzipiell natürlich auch für diese gilt.
Hardware-Anforderungen
Da eine Bridge-Firewall wie bereits erwähnt keine Paket-Manipulation (z.B. durch Routing) durchführen muss, sind Systeme, die bereits ein paar Jahre alt sind, meist ausreichen. Dies hängt natürlich auch immer von dem zu erwartenden Traffic ab. Als Referenz kann ich hier ein System nennen, das sich u.a. aus einem AMD Athlon 64 3200+ und 512MB DDR-RAM zusammensetzt. Bei diesem bleibt der Load-Average selbst bei einem Datendurchsatz von ca. 15Mbit/s stets unter 0,2.
Die benötigte Festplatten-Kapazität hängt stark davon ab, wie viel Log-Daten die Firewall generiert und wie lange diese vorgehalten werden. Doch bei Standard-Konfiguration wird die 20GB-Marke eigentlich nie überschritten.
Zudem werden insgesamt noch 2 Netzwerk-Schnittstellen benötigt. Dabei ist es egal, ob diese onboard sind oder über Erweiterungskarten bereitgestellt werden. Idealerweise sollten diese mit der selben Übertragungsrate arbeiten.
Installation und Konfiguration
Alle benötigten Programme und Tools werden von Ubuntu über entsprechende Pakete bereitgestellt. Daher müssen die Pakete bridge-utils, ebtables, shorewall und shorewall6 installiert werden.
Als nächstes wird das Bridge-Interface konfiguriert, zu dem die beiden physikalischen Netzwerk-Schnittstellen zusammengefasst werden
/etc/network/interfaces:
auto br0
iface br0 inet static
# Dieser Daten in diesem Abschnitt müssen individuell angepasst werden
address 10.0.0.10
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.1
dns-nameservers 10.0.0.1
dns-search network.local
# Angaben für die Erstellung des Bridge-Interfaces
pre-up /sbin/ip link set eth0 up
pre-up /sbin/ip link set eth1 up
pre-up /usr/sbin/brctl addbr br0
pre-up /usr/sbin/brctl addif br0 eth0
pre-up /usr/sbin/brctl addif br0 eth1
# IPv6-Adresse an Bridge-Interface binden und Default-Route setzen
post-up /sbin/ip -6 addr add 2001:db8::10/64 dev br0
post-up /sbin/ip -6 route add default via 2001:db8::1
# Angaben für das Entfernen des Bridge-Interfaces
pre-down /usr/sbin/brctl delif br0 eth0
pre-down /sbin/ip link set eth0 down
pre-down /usr/sbin/brctl delif br0 eth1
pre-down /sbin/ip link set eth1 down
post-down /usr/sbin/brctl delbr br0
Nach einem anschließenden Neustart des Netzwerks sollte das Bridge-Interface korrekt erstellt und konfiguriert werden. Unter Umständen kann hierzu manchmal auch ein Reboot erforderlich sein. Ob das Bridge-Interface korrekt funktioniert kann man nun einfach testen, in dem man an jedes physikalische Interface einen Rechner anschließt und beide mit IP-Adressen aus dem selben Netz konfiguriert. Lassen sich diese dann gegenseitig
anpingen, funktioniert die Bridge korrekt.
Da das Ziel aber eigentlich nicht die Verbindung von Netzwerk-Segmenten, sondern die Reglementierung von Verbindungen ist, fehlt diese Funktionalität noch. Diese wird mit dem im Linux-Kernel enthaltenen
Netfilter realisiert. Dieser lässt sich üblicherweise mittels
iptables (für IPv4) bzw.
ip6tables (für IPv6) konfigurieren. Da die Konfiguration damit jedoch nicht sehr komfortabel, gibt es mit
Shorewall ein praktisches Werkzeug, das dies wesentlich erleichtert. Dabei steht für jede IP-Version eine separate Variante (shorewall und shorewall6) zur Verfügung wobei die verwendeten Datei- und Verzeichnisnamen entsprechend benannt sind.
Soweit sich die betreffende Konfigurationsdatei bei beiden Varianten nicht unterscheidet, ist in der folgenden Beispiel-Konfiguration nur die IPv4-Variante aufgeführt, die ohne Anpassungen für IPv6 übernommen werden kann. Das Beispiel verwendet dabei eth0 als externes und eth1 als internes physikalisches Interface.
/etc/default/shorewall, /etc/default/shorewall6:
[...]
startup=1
[...]
/etc/shorewall/interfaces, /etc/shorewall6/interfaces:
world br0 detect bridge
ext br0:eth0
int br0:eth1
/etc/shorewall/shorewall.conf, /etc/shorewall6/shorewall.conf:
[...]
STARTUP_ENABLED=Yes
SHOREWALL_SHELL=perl
[...]
/etc/shorewall/zones:
fw firewall
world ipv4
ext:world bport4
int:world bport4
/etc/shorewall6/zones:
fw firewall
world ipv6
ext:world bport6
int:world bport6
/etc/shorewall/policy:
# Die nachfolgenden Anweisungen definieren die Default-Policies
# für Verbindungen zwischen den einzelnen Zonen (z.B. alle
# Verbindungsversuche von extern nach intern verwerfen).
$FW all ACCEPT
int ext REJECT info
int $FW REJECT info
int world REJECT info
ext $FW DROP info
ext int DROP info
ext world DROP info
world int DROP info
world ext DROP info
world $FW DROP info
/etc/shorewall/rules:
# Die nachfolgenden Anweisungen überschreiben die
# Default-Policies entsprechend der dabei angegebenen
# Kriterien und Aktionen.
SECTION NEW
# SSH-Zugriff auf Bridge-Firewall von 10.10.10.10
ACCEPT ext:10.10.10.10 $FW tcp 22
# Zugriff von extern auf internen Server (192.168.1.10)
FTP/ACCEPT ext int:192.168.1.10
HTTP/ACCEPT ext int:192.168.1.10
/etc/shorewall6/rules:
SECTION NEW
# ******************************************************************************************
# Regel zum Blocken von Angreifern o.ä. aus bestimmten IP-Bereichen
# ******************************************************************************************
DROP:notice ext:2001:db8:abcd::/48 all
# ******************************************************************************************
# Basis-Regeln, die für die reibungslose Kommunikation über IPv6 zwingend erforderlich sind
# ******************************************************************************************
# Path MTU Discovery
ACCEPT all all ipv6-icmp 2
# Router Solicitation
ACCEPT all all ipv6-icmp 133
# Router Advertisement
ACCEPT all all ipv6-icmp 134
# Neighbor Solicitation
ACCEPT all all ipv6-icmp 135
# Neighbor Advertisement
ACCEPT all all ipv6-icmp 136
# Redirect
ACCEPT all all ipv6-icmp 137
# ******************************************************************************************
# Zugriff auf die Bridge-Firewall von 2001:db8:10::10
# ******************************************************************************************
# SSH
ACCEPT ext:2001:db8:10::10 $FW tcp 22
# Ping
ACCEPT ext:2001:db8:10::10 $FW ipv6-icmp 128
# ******************************************************************************************
# Zugriff auf Server hinter der Bridge-Firewall
# ******************************************************************************************
# Zugriff von extern auf internen Server (2001:db8:11::10) per FTP und HTTP
FTP/ACCEPT ext int:2001:db8:11::10
HTTP/ACCEPT ext int:2001:db8:11::10
Abschließende Bemerkungen
Wenn man nur einen Paketfilter benötigt, ist dies meiner Meinung eine sehr einfach zu realisierende und vor allem auch sehr kostengünstige Lösung. Wer zur Konfiguration ein Web-Interface bevorzugt, kann sich ein solches beispielsweise mittels Webmin und dem entsprechenden Modul einrichten. Über dessen Qualität und Funktionsumfang kann ich mangels entsprechender Tests jedoch nichts sagen. Da die Konfiguration von Shorewall über die entsprechenden Konfigurationsdateien jedoch sehr einfach ist, ist eine GUI meiner Meinung aber auch nicht unbedingt erforderlich.