"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

für alle die mal einen DSL Router aufbauen wollen

De@thbringer 28.07.2003 - 11:36 10149 19 Thread rating
Posts

De@thbringer

Addicted
Registered: Jul 2001
Location: zuhause
Posts: 411
Hi Leute,
da ich selber weiß wie schwer es für anfänger ist gscheite howto's für eine firewall zu finden hier mal ein leichtverständliches und nutzvolles.

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

Code:
wget http://www.pimpzkru.de/debian/firewall.sh
cp firewall.sh /etc/init.d/firewall


Hier nun das ganze Skript:

Code:
#!/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:

Code:
chmod 0755 /etc/init.d/firewall


Und dem Benutzer root zugeordnet werden:

Code:
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:

Code:
/etc/init.d/firewall start


Ein Deaktivieren ist ebenfalls möglich. Hierbei wird jedoch das Routing deaktiviert:

Code:
/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:

[url 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:

Code:
update-rc.d firewall defaults

edit: bin grad draufgekommen das der link zum skript net funzt, also dann händisch schreiben. oder mit putty copy paste machen.

was mir noch einfällt, bin grad dabei ein howto für einen ganzen DSL router zu machen, das ich dan posten werde, somit werden sich auch viele fragen die gestellt wurden bzw noch werden von alleine lösen
Bearbeitet von De@thbringer am 28.07.2003, 11:39

alex5612

Legend
Radiomann
Avatar
Registered: Oct 2000
Location: VR Brigittenau
Posts: 4766
hab das script grad am rennen :) gefallt mir muss ich sagen

hau evtl irgendwo im comment deine webpage rein

funka

Legend
ex-prophet(down below)
Registered: Sep 2000
Location: Vienna / SF
Posts: 6131
kenn mich ja nicht so aus aber was ist der grund hierfuer
Zitat
chmod 0755 /etc/init.d/firewall

ansonsten top faq

alex5612

Legend
Radiomann
Avatar
Registered: Oct 2000
Location: VR Brigittenau
Posts: 4766
naja vermutlich damit nicht root user nicht die firewall config verpfuschen

Zitat
chown root:root /etc/init.d/firewall

wie schauts aus wegen proxy ? kann mir da jemand irgendwas empfehlen ?

spunz

Super Moderator
tot durch snu-snu
Avatar
Registered: Aug 2000
Location: achse des bösen
Posts: 10526

shadowman

OC Addicted
Registered: Oct 2000
Location: Feldkirchen
Posts: 1612
Thx fürs script :)
Wollte gerade den Kernel compilieren und da gibts leider einen Haufen von Sachen die mit masquerading usw. zu tun haben.
Gibts da irgendwo ne gute Auflistung was man wirklich braucht und was nicht?.

DAO

Si vis pacem, para bellum
Avatar
Registered: Mar 2001
Location: Austria
Posts: 4591

De@thbringer

Addicted
Registered: Jul 2001
Location: zuhause
Posts: 411
Zitat von alex5612
naja vermutlich damit nicht root user nicht die firewall config verpfuschen



wie schauts aus wegen proxy ? kann mir da jemand irgendwas empfehlen ?

genau wegen dem.

othan

Layer 8 Problem
Avatar
Registered: Nov 2001
Location: Switzerland
Posts: 3964
Hab das Ganze mal gemacht hänge aber noch bei den clients


eth0:
ip 192.168.0.5

verbunden mit adsl modem/router 192.168.0.1

verbindung ins internet vom server aus kein problem


eth1:
ip 192.168.1.1

verbunden mit client 192.168.1.200 (über dhcp)

ping server -> client geht
ping client -> server geht nicht


einstellungen auf dem client:
ip 192.168.1.200
subnet 255.255.255.0
gateway 192.168.1.1
dns1+2 vom provider 212.90.xxx.xxx


Das script:

Code:
  # Schnittstelle zum lokalen Netzwerk
  IFACE_INT=eth1

  # Internetschnittstelle
  IFACE_EXT=eth0

der rest gleich wie vom original

/EDIT: Server is MEPIS/Debian

/EDIT2:

Hat sich erledigt, war irgend ein fehler beim eth0
nachm neustart gings
Bearbeitet von othan am 13.02.2004, 21:45

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
damit bei mir die firewall automatisch startet hab ich sie in /etc/init.d/firewall gelegt und dann einen links gesetzt:

ln -s /etc/init.d/firewall /etc/rc2.d/S30firewall

dann hats gepasst. :thumbsup:

De@thbringer

Addicted
Registered: Jul 2001
Location: zuhause
Posts: 411
unter debian kannst du dir das paket rcconf installieren dort kannst du services ab und anwählen die automatisch gestartet werden sollen.

somit ersparst du dir die symlinks

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
wenn ich

# Ports an einen Rechner im lokalen Netz weiterleiten
DEST_HOST="" # 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

auf

# Ports an einen Rechner im lokalen Netz weiterleiten
DEST_HOST="192.168.0.14" # Durch die IP-Adresse des Rechner ersetzen
PORTS_TCP="6881" # Falls dies nicht gewünscht ist, leer Klammer angeben
PORTS_UDP="" # Falls dies nicht gewünscht ist, leer Klammer angeben

ändere, und dann die fw restarte bekomm ich immer strange iptables fehler. hat das sonst auch noch wer?

wenn ich nur "" hab rennt alles pipifein.

fehlermeldung:

epia:/home/decode# /etc/init.d/firewall restart
Starting firewall: iptablesiptables v1.2.6a: invalid port/service `-d' specified
Try `iptables -h' or 'iptables --help' for more information.
.

kernel is 2.4.18-bf2.4


edit: hat sich geklärt
Bearbeitet von d3cod3 am 18.04.2004, 00:51

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
wieder mal probleme :(

i brauch diese ports hier: http://forum.massive.se/viewtopic.p...;highlight=port

wenn i die alle eintrag sagt er mir es sind zu viele.

was mich zur frage bringt: was is das maximum? bzw kann man ranges eingeben mit 5600-5700 zb?

shadowman

OC Addicted
Registered: Oct 2000
Location: Feldkirchen
Posts: 1612
--source-port PORT:PORT

das gleiche gilt für --destination-port

Ob das in diesem Script ohne weiteres fruchtet weiß ich leider nicht.
Bearbeitet von shadowman am 02.07.2004, 20:48

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4427
am besten is, du kopierst die zeilen mit den port-routes so oft wie du sie brauchst und änderst lediglich die ports um.

edit: am einfachsten verwaltest die firewall mit webmin, von dem script von darkangel ausgehend kann mans sehr fein erweitern :)
Bearbeitet von dio am 02.07.2004, 21:07
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz