Suche


drucken PDF

Firewall


Um dieser Anleitung folgen zu können, müssen Sie bereits einige Erfahrungen mit Linux gesammelt haben. Die Manipulation einer Firewall kann gefährlich sein. Sie könnten hierdurch z.B. die Möglichkeit eines Hard Reboot blockieren. Falls Sie ein fehlerhaftes Skript erstellen und dieses in den Autostart legen, könnten Sie sich selbst den Zugang zu Ihrer Maschine verwehren. Seien Sie also bitte sehr aufmerksam und nehmen Sie keine Änderungen an der Firewall vor, falls Sie sich unsicher sind.

Firewall - was ist das?


Es ist ein Programm, das gewisse Ports Ihres Servers blockiet und andere widerum öffnet. Stellen Sie sich Ihr Haus vor: Sie haben vorne und hinten jeweils eine Tür. Die hintere ist nutzlos, also wird sie zugemauert. Warum? Weil hierdurch eine zusätzliche, unnötige Gefahr eines Einbruchs besteht. Mit der Firewall ist das genau so: es werden alle Ports (Türen), die nicht benötigt werden, geschlossen.

Welche Ports?


ACHTUNG!
Sie müssen bei jeder Änderung sehr aufmerkseim vorgehen. Sie könnten nämlich die zu schließenden Ports verwechseln, was natürlich sehr schlecht wäre. Stellen Sie sich vor, Sie würden den SSH-Port schließen! In diesem Fall hätten Sie evtl. nur noch Zugriff via Telnet oder Webmin. Oder man müsste den Server im Rescue Modus hochfahren und die fehlerhafte Konfiguration rückgängig machen.

Die von OVH standardmäßig geöffneten Ports sind:


21 - ftp (FTP-Server - zur Benutzung des FTP-Dienstes offen lassen).
22 - ssh (Zugang zur verschlüsselten Shell - offen lassen !).
23 - telnet (Zugang zur nicht verschlüsselten Shell - zur eventuellen Reparatur offen lassen !).
25 - smtp (Postausgangsserver - können meistens offen bleiben).
53 - dns (DNS-Server - können meistens offen bleiben).
80 - http (Webserver - offen lassen !).
110 - pop3 (Posteingangsserver - können meistens offen bleiben).
143 - imap (Posteingangsserver - als Alternative zu POP3 offen lassen).
443 - https (verschlüsselter Webserver- je nach Wunsch offen lassen).
10000 - webmin (Plattform zur Konfiguration des Servers - offen lassen, wenn Sie diese benutzen möchten).


Diese Ports sind standardmäßig geöffnet. Aber vielleicht haben Sie eine Software installiert die andere Ports benutzt. Es liegt an Ihnen, zu erkennen, welche geöffnet werden müssen und welche nicht. Es wird nun erklärt, wie Sie vorgehen müssen, wenn Sie spezielle Ports öffnen möchten.

IPTables


IPTables ist eine sehr leistungsstarke Firewall, welche von OVH auf allen Servern installiert wird. Ihre Funktionen sind folgende: Spezielle Ports zu öffnen und alle anderen zu schließen. Im folgenden Beispiel werden die beiden Ports 22 (ssh) und 80 (http) geöffnet. Dies ist nur ein Beispiel, welches Sie jedoch auf Ihre individuellen Bedürfnisse anpassen können:


Verbinden Sie sich per ssh als root mit Ihrem Server.
Der erste Schritt besteht darin, die Version von IPTables zu erfahren:
$ /sbin/iptables -V
iptables v1.2.4

Diese Version ist sehr alt. Es wird mittlerweile die Version 1.3.7 eingesetzt (Stand: 03.04.2007)
$ cd /root
$ wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.7.tar.bz2
$ tar xvfj iptables-1.3.7.tar.bz2
$ cd iptables-1.3.7
$ make KERNEL_DIR=/usr/src/linux
$ make install KERNEL_DIR=/usr/src/linux
$ cd /sbin
$ mv iptables iptables.old
$ mv iptables-restore iptables-restore.old
$ mv iptables-save iptables-save.old
$ ln -s /usr/local/sbin/iptables iptables
$ ln -s /usr/local/sbin/iptables-restore iptables-restore
$ ln -s /usr/local/sbin/iptables-save iptables-save
$ /sbin/iptables -V
iptables v1.3.7


IPTables wurde aktualisiert, nun folgt der nächste Schritt.

Eine Liste der bestehenden Regeln erhält man wiefolgt:


$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


Wie Sie sehen, gibt es drei Rubriken: INPUT, FORWARD und OUTPUT.
Wir werden uns zunächst um die Rubrik INPUT kümmern (für den eingehenden Verkehr).

Zur Öffnung der Ports 22 und 80 folgendes eingeben:


$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT


-A INPUT : Eine Eingangsregel wird für die Firewall konfiguriert.
-i eth0 : Für diese Netzwerkkarte wird die Regel definiert.
-p tcp : Die Regel gilt für das Protokoll TCP (wir behandeln vorerst nur dieses).
--dport 22 : Die Regel gilt für den SSH-Port (22).
-j ACCEPT : Die Regel erlaubt eingehende Daten (Pakete).

Eine erneute Ausgabe der Regeln sieht nun so aus:


$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


Die Rubrik INPUT wurde erweitert, das ist ein gutes Zeichen.
Wie man unschwer erkennen kann, wird alles aktzeptiert => Chain INPUT (policy ACCEPT). Wir wollen den gesamten Verkehr, der nicht zuvor erlaubt wurde, blockieren. Wir müssen also eine Regel hinzufügen, welche alle anderen Ports blockiert. Aber hierbei gibt es ein Problem: Wenn wir zum Beispiel eine Verbindung von unserem Server zum Server kernel.org herstellen möchten, um einen neuen Kernel herunterzuladen, muss eine Verbindung zu der Seite hergestellt und auf eine Antwort gewartet werden. Wie aber kann diese Verbindung hergestellt werden, wenn standardmäßig alle Verbindungen blockiert werden? Glücklicherweise ist IPTables sehr leistungsfähig und kann Pakete gemäß ihres Zustandes sortieren und kann diverse Ausnahmeregelungen treffen. Es muss also eine neue Regel hinzugefügt werden:


$ /sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT


Es gibt zwei Möglichkeiten oder Stufen dieser Regel. Man droppt, d.h. man verwirft ein Paket, wenn es ankommt und nicht aktzeptiert wird. Der Client seinerseits wird bis zum timeout vergeblich auf eine Antwort warten. Die zweite Möglichkeit besteht darin, die Pakete abzulehnen (REJECT anstatt DROP). Wenn ein ungültiges Paket ankommt, erhält der Client einen Fehler und er wartet nicht mehr da er eine negative Antwort erhalten hat. Ein Paket abzulehenen ist sauberer, aber es zu verwerfen ist sicherer. Es ist also möglich, dass jemand versuchen wird, Ihnen ständig Pakete an den falschen Port zu schicken. Ihr Server wird nicht reagieren, aber mit der Regel REJECT werden diese Pakete beantwortet. Sie haben die Wahl.

Um Ihre Firewall "auf Null" zu setzen, müssen Sie folgendes eingeben:


$ /sbin/iptables -F INPUT


Dieser Befehl wird alle Regeln in der Rubrik INPUT löschen.

Wenn Sie eine Regel zwischen der ersten und der zweiten hinzufügen möchten, geben Sie folgendes ein:


$ /sbin/iptables -I INPUT 2 ... ihre Regeln


Um die dritte Regel zu löschen, geben Sie folgendes ein:


$ /sbin/iptables -D INPUT 3


Um eine IP komplett zu blockieren:


$ /sbin/iptables -I INPUT 1 -s -j DROP



Die Firewall ist nun aktiviert. Wenn nun ein Portscann an Ihrem Server vorgenommen wird, sind nur die beiden Ports 80 und 22 geöffnet. Es ist nicht ungewöhnlich dass der Scan sehr langsam ist. Dies ist auf die Regel DROP zurückzuführen.


IP ausschließen/erlauben


Für einen dedizierten Server


Falls Sie das ICMP-Protokoll (Ping-Abfrage) blockieren möchten, dann müssen Sie Ausnahmeregeln für folgende Server erstellen, damit diese Ihren Server weiterhin anpingen können: ping.ovh.net, ping.ovh.ca, proxy.sbg.ovh.net, proxy.bhs.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.rbx2.ovh.net, proxy.rbx3.ovh.net, proxy.rbx4.ovh.net, proxy.ovh.net und a2.ovh.net.
Dies erlaubt es den OVH-Teams, den Zustand Ihres Servers trotzdem überwachen zu können.
Sie müssen ausserdem die erhaltene IP-Adresse auf folgende Art und Weise durchlassen:
Die IP Ihres Servers hat die Form: aaa.bbb.ccc.ddd
Sie müssen dann folgende IP durchlassen: aaa.bbb.ccc.250
Beispiel: Die IP 213.186.57.143 muss 213.186.57.250 für den SLA Server und 213.186.57.251 für den MRTG Server durchlassen, um RTM verwenden zu können.

Wenn Sie einen HG Server haben, dann lassen Sie ausserdem noch die IP aaa.bbb.ccc.249 (temporäre Regel) durch.

Wenn Sie alle Ping Anfragen - auch die von OVH - sperren, dann können wir den Zustand Ihrer Maschine nicht mehr überwachen, und wenn diese ausfällt erhalten wir keinen Alarm. Um Pings von unseren Servern aus zu erlauben tragen Sie folgende Regeln ein:

/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx3.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx4.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.ca -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.250 -j ACCEPT # IP = aaa.bbb.ccc Anhand der oben erklärten Regel bestimmt
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.249 -j ACCEPT # temporär, nur für HG Server
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.251 -j ACCEPT # IP für das Monitoringsystem


Falls Sie den SSH-Zugang nur auf Ihre IP beschränken wollen, ist es empfehlenswert, auch cache.ovh.net den Zugriff zu gestatten. Wenn Sie den Port 22 für die OVH-Techniker schließen, können wir nicht mehr direkt auf den Server zugreifen, um Probleme zu lokalisieren oder zu beheben.

Um den OVH-Servern den Zugriff per SSH auf Ihren Server zu ermöglichen, müssen Sie folgendes eingeben:

/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT

Wenn Sie einen RAID-Filer haben, dürfen Sie nicht vergessen, dem NFS eine Verbindung zu ermöglichen. Hierfür sollte einfach alles aktzeptiert werden, was aus dem internen Netz 192.168.0.0/16 kommt:
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT

Wenn Sie einen Cluster haben, dann müssen Sie auch den Port 79 öffnen, damit OCO mit dem Lastenverteiler kommunizieren kann:
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT


Für einen RPS Server:


Das von OVH gemonitorte Interface ist eth0, die Firewall Regeln beziehen sich auf dieses Interface.

Wenn Sie alle Ping Anfragen - auch die von OVH - sperren, dann können wir den Zustand Ihrer Maschine nicht mehr überwachen, und wenn diese ausfällt erhalten wir keinen Alarm. Um Pings von unseren Servern aus zu erlauben tragen Sie folgende Regeln ein:

/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx3.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx4.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.ca -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.250 -j ACCEPT # IP für das RTM Monitoringsystem
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.251 -j ACCEPT # IP für das SLA Monitoringsystem


Sie müssen auch Ihren Filer freigeben, verwenden Sie folgenden Befehl, um sich diesen anzeigen zu lassen:

r12xxx ~ # netstat -tanpu | grep iscsi
tcp 0 0 91.121.xx.xx:38632 91.121.191.16:3260 ESTABLISHED 3097/iscsid

Die IP Ihres Filers ist also: 91.121.191.16
Und die hinzuzufügende Regel ist dann:

/sbin/iptables -A INPUT -i eth0 -p tcp --source 91.121.191.16 -j ACCEPT



Konfigurationsbeispiel


Hier ein Beispiel einer vollständigen Konfiguration, um Ihren Server via iptables zu schützen. Durch den Einsatz dieser Konfiguration wäre Ihr System größtenteils geschützt und die wichtigsten Dienste werden zugelassen. Sie kann als Basis für Ihre individuell angepasste Konfiguration dienen:

/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx3.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx4.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.ca -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j REJECT


In diesen Regeln muß man natürlich xx.xx.xx.xx durch die IP-Adresse des eigenen Servers ersetzen, auf dem die freizuschaltenden Dienste laufen.


Firewall automatisieren


Ihre Firewall wurde nun vollständig konfiguriert und für sie sollte jetzt ein Skript erstellt werden, das bei jedem Systemstart automatisch geladen wird.

Hier ein Beispiel, in dem ein Skript namens "Firewall" im /etc/init.d/-Register eingetragen wird:

#!/bin/sh
  1. chkconfig: 3 21 91
  2. description: Firewall

IPT=/sbin/iptables

case "$1" in
start)
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx3.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx4.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source ping.ovh.ca -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
$IPT -A INPUT -i eth0 -j REJECT
exit 0
;;

stop)
$IPT -F INPUT
exit 0
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop}"
exit 1
;;
esac

Erteilen Sie dem Skript nun das Recht 700 und geben Sie „/etc/init.d/firewall start“ ein, um es auszuführen und “/etc/init.d/firewall Stopschild ", um es anzuhalten.
Um es beim Systemstart automatisch auszuführen:


$ /sbin/chkconfig --level 3 firewall on
$ /sbin/chkconfig --level 06 firewall off


Achten Sie darauf, dass das Skript ordnungsgemäß funktioniert, bevor Sie es automatisch starten lassen, damit Ihr Server nicht automatisch blockiert wird !