|
Einrichten einer kleinen Internet-Firewall
1. Einleitende Worte
In dieser HOWTO wird eine Schritt-für-Schritt-Anleitung zur
Konfiguration eines Internetrouters gegeben. Das hier verwendete
Paketfilterskript ist für NutzerInnen gedacht, die eine tiefere
Auseinandersetzung mit der Thematik scheuen. Daher ist das Skript auch
nicht der Weisheit letzter Schluss, biete aber dennoch einen passablen
Grundschutz. Es ist auch als Grundlage für eigene Skripte geeignet.
Das Grundprinzip in dem Skript ist es, zuerst allen Netzwerkverkehr
zu verbieten um dann wieder nur noch gewünschten zu erlauben. Verkehr
ins und vom lokalen Netzwerk (falls vorhanden) wird erlaubt. Aus dem
Internet werden nur angeforderte Daten-Pakete erlaubt, so dass es nicht
möglich ist, sich aus dem Internet zu einem Serverdienst auf dem Router
oder im Netzwerk dahinter zu verbinden.
Wie dies dennoch ermöglicht werden kann, wird im Abschnitt 4 erläutert.
2. Installation
Als Voraussetzung bedarf es einem Kernel aus der 2.4er Serie mit
aktiviertem netfilter (das ist die 'Firewall'). Dies ist bei allen
2.4er Kerneln von Debian der Fall. Mit "uname -r" lässt sich die
Versionsnummer des verwendeten Kernels ermittlen.
Der Paketfilter (Firewall) im Kernel wird mit Hilfe der
iptables-Skripte konfiguriert. Ein "apt-get install iptables"
versichert, dass diese installiert sind.
Auf das Einrichten des Internetzugangs wird hier nicht eingegangen.
Dies ist sehr gut und sehr ausführlih im Debian Handbuch beschrieben,
welches online unter[URL http://www.openoffice.de/linux/buch/internet.html verfügbar ist.
Auch die Konfiguration eines lokalen Netzwerkes entfällt hier.
Zuerst muss folgendes Skript auf dem Router nach
"/etc/init.d/firewall" kopiert werden. Das Skript ist auch über http zu
beziehen: [URL http://www.pimpzkru.de/debian/firewall
Hier nun das ganze Skript:
#!/bin/sh
# Kleine Paketfilterfirewall von Sebastian Heinlein
# 2003 - glatzor at pimpzkru.de
# GRUNDKONFIGURATION
# Schnittstelle zum lokalen Netzwerk
IFACE_INT=eth0
# Internetschnittstelle
IFACE_EXT=ppp+
# Loopback device
IFACE_LO=lo
# SERVERKONFIGURATION
# Ports auf dem Router aus dem Internet zugänglich machen
SERVER_PORTS_TCP="" # Falls dies nicht gewünscht ist, leer Klammer angeben
SERVER_PORTS_UDP="" # Falls dies nicht gewünscht ist, leer Klammer angeben
# Ports an einen Rechner im lokalen Netz weiterleiten
DEST_HOST="10.1.1.2" # Durch die IP-Adresse des Rechner ersetzen
PORTS_TCP="" # Falls dies nicht gewünscht ist, leer Klammer angeben
PORTS_UDP="" # Falls dies nicht gewünscht ist, leer Klammer angeben
# Ab hier nichts mehr editieren!
case "$1" in
start)
echo -n "Starting firewall: iptables"
# Alte Regeln löschen
iptables -F
iptables -F -t mangle
iptables -F -t nat
iptables -X
iptables -X -t mangle
iptables -X -t nat
# ************
# * POLICIES *
# ************
# Default-Policies setzen - alles fliegt raus
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Einschalten von ip-Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# ***********************
# * EINGEHENDER VERKEHR *
# ***********************
# Soll nicht sein
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
# Aus dem internen Netz: alles erlauben
iptables -A INPUT -i $IFACE_INT -j ACCEPT
# Über das Loopback: Alles erlauben
iptables -A INPUT -i $IFACE_LO -j ACCEPT
# Vom Internet: Darf nicht sein
iptables -A INPUT -i $IFACE_EXT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $IFACE_EXT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $IFACE_EXT -s 192.168.0.0/24 -j DROP
# Verkehr aus dem Internet auf bereits initialisierten Verbindungen erlauben
iptables -A INPUT -i $IFACE_EXT -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# Falls Serverdienste vom Internet zugänglich sein sollen, diese erlauben
if [ "$SERVER_PORTS_TCP" != "" ]; then
iptables -A INPUT -i $IFACE_EXT -m multiport \
--dport $SERVER_PORTS_TCP -j ACCEPT
fi
if [ "$SERVER_PORTS_UDP" != "" ]; then
iptables -A INPUT -i $IFACE_EXT -m multiport \
--dport $SERVER_PORTS_UDP -j ACCEPT
fi
# ****************************
# * WEITERGELEITETER VERKEHR *
# ****************************
# Lokal -> Internet: Alles erlauben
iptables -A FORWARD -i $IFACE_INT -o $IFACE_EXT -j ACCEPT
# Internet -> Lokales: Nur Verkehr über bereits bestehende Verbindungen erlauben
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# Internet -> Lokales Netz: Ports die weitergeleitet werden sollen
if [ "$PORTS_TCP" != "" ]; then
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -p tcp -m multiport \
--dport $PORTS_TCP -j DNAT --to $DST_HOST
fi
if [ "$PORTS_UDP" != "" ]; then
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -p udp -m multiport \
--dport $PORTS_UDP -j DNAT --to $DST_HOST
fi
# **********
# * OUTPUT *
# **********
# Ins lokale Netzwerk: Alles erlauben
iptables -A OUTPUT -o $IFACE_INT -j ACCEPT
# Ans Loopback: Alles erlauben
iptables -A OUTPUT -o $IFACE_LO -j ACCEPT
# Ins Internet : Alles erlauben
iptables -A OUTPUT -o $IFACE_EXT -j ACCEPT
# ***********
# * ROUTING *
# ***********
# Umleiten der Ports
if [ "$PORTS_TCP" != "" ]; then
iptables -A PREROUTING -i $IFACE_EXT -p tcp -m multiport \
--dport $PORTS_TCP -j DNAT --to $DST_HOST
fi
if [ "$PORTS_UDP" != "" ]; then
iptables -A PREROUTING -i $IFACE_EXT -p udp -m multiport \
--dport $PORTS_UDP -j DNAT --to $DST_HOST
fi
# Masquerading
iptables -A POSTROUTING -o $IFACE_EXT -t nat -j MASQUERADE
# ***********
# * LOGGING *
# ***********
# Alles was bis hier kommt, mitprotokollieren
iptables -A OUTPUT -j LOG --log-prefix "Nicht raus: "
iptables -A FORWARD -j LOG --log-prefix "Nicht durch: "
iptables -A INPUT -j LOG --log-prefix "Nicht rein: "
echo "."
;;
stop)
echo -n "Stopping firewall: iptables"
# Alte Regeln löschen
iptables -F
iptables -F -t mangle
iptables -F -t nat
iptables -X
iptables -X -t mangle
iptables -X -t nat
# ************
# * POLICIES *
# ************
# Default-Policies setzen - alles bis auf Weiterleitung erlaubt
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Deaktivierung des ip-Forwarding
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "."
;;
restart)
$0 start
;;
status)
iptables -L
;;
*)
echo "Usage: /etc/init.d/firewall start|stop|restart|status"
exit 1
;;
esac |
Das Skript muss nun ausführbar gemacht werden:
chmod 0755 /etc/init.d/firewall |
Und dem Benutzer root zugeordnet werden:
chown root:root /etc/init.d/firewall |
3. Anpassen der Grundkonfiguration
Im ersten Abschnitt des Skripts müssen eventuell einige Änderungen durchgeführt werden.
IFACE_INT gibt die Netzwerkschnittstelle ins lokale Netzwerk an.
Ist nur eine Netzwerkkarte vorhanden, so bedarf es keiner Änderung.
IFACE_EXT bezeichnet den Namen der Internetschnittstelle. Für
Analog-Modem und DSL-NutzerInnen ist hier keine Anpassung erforderlich.
Wird ISDN mit dem ipppd verwendet, so muss dieser Wert auf "ippp+"
geändert werden.
4. Serverdienste auf dem Router und im lokalen Netz
Soll ein Serverdienst auf dem Router zugänglich sein, müssen die
entsprechenden Ports im Konfigurationsabschnitt angegeben werden
(SERVER_PORTS_TCP und SERVER_PORTS_UDP). So verlangt zum Beispiel ein
Web-Server einen offenen Port 80: "SERVER_PORTS_TCP=80". Sollen mehrer
Ports freigeben werden, müssen sie durch ein Komma getrennt werden - es
sind maximal 15 möglich.
Das Skript bietet auch noch einen einfachen Weg Ports an einen
Rechner im lokalen Netz weiterzuleiten, damit auf diesem ein
Serverdienst betrieben werden kann. Hierfür bei DEST_HOST die
IP-Adresse des Rechners angeben, zu dem die Ports weitergeleitet werden
sollen. PORTS_TCP und PORTS_UDP enthalten die gewünschten Ports.
Es ist darauf zu achten, dass wenn diese Features nicht genutzt
werden, die Port-Variablen auf leere "" gesetzt sind. Ansonten kommt es
zu Fehlern im Skript.
5. Abschluss
Ist die Konfiguration erfolgt, so kann die Firewall mit folgendem Befehl gestartet werden:
/etc/init.d/firewall start |
Ein Deaktivieren ist ebenfalls möglich. Hierbei wird jedoch das Routing deaktiviert:
/etc/init.d/firewall stop |
Ist die Firewall problemlos gestartet, sollte ein Sicherheitscheck
durchgeführt werden. Die Firma sygate bietet hierfür freundlicherweise
einen kostenlosen scan auf ihrer Homepage an:
http://scan.sygate.com/
Das Skript kann nun mit foglendem Befehl zu den Startskripten mit
aufgenommen werden, so dass es automatisch bei jedem Neustart
ausgeführt wird:
update-rc.d firewall defaults |
Fragen und Anregungen gerne an renate at pimpzkru.de
|