Montag, 4. Februar 2008

Linux und die Firewall

Guten Abend @ all,

ich wollte heute Abend die Gunst der Stunde nutzen und über mein kleines Intranet zuschreiben. Das wie folgt auf Gebaut ist. Die Verbindung geht vom WLan-Router zu meinem Linux-Rechner. Damit mein kleiner Läppi auch die Vorzüge des Internets nutzen kann, habe ich diesen per Cross-Over an meinem Linux-Server angeschlossen.
Nun hatte ich das Problem, dass mein Läppi, der hinterm dem Linux-Rechner befindet, natürlich nicht sofort Zugang zum Internet hat. Deshalb habe ich mich für das Package iptables entschieden. Mittels diesem kleinen Programm ist es möglich, dass man zu einem verschiedene Ports blocken kann und zum anderen Packte an eine weitere Schnittstelle weiterleiten kann.
Als erstes muss dazu die vom WLan-Router vorgegebene IP-Adresse ermitteln.

haribo@haribo-server:~$ ifconfig

Ich würde empfehlen, dass ihr vom Router her eine feste-IP geben lassen sollt. Das macht sich besser, damit ihr nicht immer in dem Firewall-Script herumhantieren müsst.

Wie eben schon angesprochen müsst ihr euch nun ein Firewall-Script anlegen.

haribo@haribo-server:~$ touch firewall

Nach dem ihr das mit dem Befehl in der Konsole gemacht habt, könnt ihr dieses dann mit einem beliebigen Editor öffnen und die gewünschten Befehle eingeben. Ich persönlich bevorzuge den Editor vim

Kommen wir nun zum Herzstück der Firewall.

Hier ist erstmal das Script:

#!/bin/sh
# ip forwarding einschalten
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t mangle -F
iptables -t nat -F

iptables -X
iptables -t mangle -X
iptables -t nat -X

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT

iptables -P INPUT DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.100.0/24 -i eth0 -j ACCEPT
iptables -A INPUT -s 192.168.2.100/24 -i eth0 -j ACCEPT
iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.100.0/24 -i eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.100.0/24 -m state --state RELATED,ESTABLISHED -o eth0 -j ACCEPT
iptables -A POSTROUTING -t nat -s 192.168.100.0/24 -j MASQUERADE

# SSH aus dem Internet erlauben
iptables -A INPUT -p tcp --dport 22 -i eth1 -j ACCEPT

# zugriffe aus dem internet auf dem webserver erlauben
iptables -A INPUT -p tcp --dport 80 -i eth1 -j ACCEPT

# zugrife auf den ftp server erlauben
iptables -A INPUT -p tcp --dport 21 -i eth1 -j ACCEPT

# zugriffe auf die webcam
iptables -A INPUT -p tcp --dport 8888 -i eth1 -j ACCEPT

# remote zugriff
iptables -A INPUT -p tcp --dport 3389 -i eth1 -j ACCEPT

#SAMBA für das intranet
iptables -A INPUT -p udp --dport 137 -i eth1 -j ACCEPT
iptables -A INPUT -p udp --dport 138 -i eth1 -j ACCEPT
iptables -A INPUT -p tcp --dport 139 -i eth1 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -i eth1 -j ACCEPT

#MYSQL Datenbank
iptables -A INPUT -p tcp --dport 3306 -i eth1 -j ACCEPT

#
# hier faengt das forwarding an
#

# skype
iptables -A FORWARD -p tcp -d 192.168.100.1 --dport 17152 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 17152 -j DNAT --to 192.168.100.1
iptables -A FORWARD -p udp -d 192.168.100.1 --dport 17152 -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport 17152 -j DNAT --to 192.168.100.1

# MSN Messanger
iptables -A FORWARD -p tcp -d 192.168.100.1 --dport 6891:6900 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 6891:6900 -j DNAT --to 192.168.100.1

# remote zugriff
iptables -A FORWARD -p tcp -d 192.168.100.1 --dport 3389 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to 192.168.100.1

# samba
iptables -A FORWARD -p tcp -d 192.168.100.1 --dport 139 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 139 -j DNAT --to 192.168.100.1


#
#allgmeines forwarding
#

iptables -A FORWARD -p tcp -d 192.168.100.1 --dport 445 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 445 -j DNAT --to 192.168.100.1
iptables -A FORWARD -p udp -d 192.168.100.1 --dport 137 -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport 137 -j DNAT --to 192.168.100.1

exit 0

In dem ersten oberen Teil werden die alten IPTABLES-Regeln gelöscht, damit es keine Problem gibt.
Die erste Regel besagt, dass die Netzwerkschnittstelle lo alles machen darf, um es mal einfach auszudrücken. Denn lo ist der localhost.
Danach werden die Regeln für die eth0 definiert. Auf dieser befindet sich der W-Lan-Stick, der Zugriff zum Internet und der gleichen hat. Zum allgemeinen Verständnis möchte ich hier noch mal die Netzwerkschnittstellen mit den jeweiligen IP´s aufzeigen:

WLAN-Stick == eth0 == 192.168.2.103
Netzwerkkarte == eth1 == 192.168.100.1

Mittels der Regel INPUT -s 192.168.100.0/24 sage ich, dass aus diesem IP-Bereich Zugriffe erlaubt werden dürfen. Die zweite Regel:
INPUT -s 192.168.2.100/24 ist der IP-Bereich, den ich von dem Router bekomme. Das heißt es können auch andere Rechner in dem WLAN-Netz auf den Router zugreifen. Diese wären dann sinnvoll, wenn zum Beispiel für den Samba zum Einsatz kommen würde.

Danach werden die Regeln definiert, wenn Zugriffe aus dem Internet auf den Server erlaubt werden sollen. Denn wenn das Programm IPTABLES gestartet wird, werden automatisch die Ports gelöscht und man kann sie dann nur mit diesen Regeln öffnen und weiterleiten.

Ebenso verhält sich das, wenn die Datenpaket von der WLAN-Karte an die Netzwerkadresse übergeben werden sollen.

Wenn das Script fertig gebastelt worden ist und die gewünschten Ports offen sind, wird dieses Script mit dem sudo Kommando nach /etc/init.d/ kopiert. Dort befinden sich im Allgemeine alle Scripte, die für Linux interessant sind. Zum starten des Scriptes braucht man dann nur noch den Befehl:

sudo /ect/init.d/firewall

Damit man nicht nach jedem Neustarten oder Hochfahren des System, in die Konsole gehen muss um das Firewallscript zustarten. Kann dies automatisch erfolgen. Dazu muss nur die Datei /etc/rc.local modifiziert werden. Dort wird nur der Pfad zu dem Firewallscript angegeben. Wichtig ist, wenn man ein solches Script nach jedem starten automatisch ausgeführt werden soll, muss dieses Script einen exit-Status besitzen.


Das wars dann eigentlich.
Viel Spass damit ;-)

Keine Kommentare: