Wenn Sie auf Ihrem Raspberry Pi das momentan aktuelle Raspbian Image vom 09.02.2013 (2013-02-09-wheezy-raspbian.zip) einsetzen, dann ist die Linux-Firewall iptables bereits installiert. In der Grundkonfiguration von Raspbian erlaubt iptables jedoch den Zugriff auf jeden Port für jede beliebige IP-Adresse. Dies ist oft nicht erwünscht weil Dienste nur für bestimmte Netzwerkbereiche verfügbar sein sollen oder generell alle Zugriffe auf das Linux-System und dessen Dienste durch eine Firewall gefiltert werden sollen.
Die folgende Anleitung soll zeigen, wie Sie iptables unter Raspbian konfigurieren und den SSH-Zugriff erlauben. Es soll anhand des SSH-Ports auch gezeigt werden, wie Sie diesen nur für das lokale Netzwerk freigeben können.
Standardmäßig gibt es im aktuellen Raspbian Image noch keine Konfigurationsdatei für die Firewall-Regeln. Daher erstellen Sie einfach die Datei /etc/network/iptables mit einem Editor.
Fügen Sie hier zum Beispiel die folgende Konfiguration ein. Die einzelnen Regeln werden im Anschluss erklärt.
*filter
:INPUT DROP [159:12505]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [140:13492]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
Die folgende Regel erlaubt alle Zugriffe welche über die Loopback-Schnittstelle lo ankommen. Dies können nur Zugriffe vom eigenen Linux-System sein.
Über die nächste Firewall-Regel werden ICMP-Anfragen wie zum Beispiel der ICMP Echo Request, auch bekannt als Ping, erlaubt.
Damit bereits aufgebaute eingehende Verbindungen generell erlaubt werden sorgt die folgende Regel.
Die nächste Firewall-Regel erlaubt den Zugriff auf den TCP-Port 22 welcher normalerweise vom SSH-Daemon genutzt wird. Hierbei erfolgt keine Unterscheidung ob die Verbindungsanfrage vom internen Netzwerk oder von einem anderen Netzwerk wie zum Beispiel dem Internet kommt.
Wenn Sie den Zugriff auf den SSH-Daemon nur aus dem internen Netzwerk erlauben wollen, können Sie die Regel wie folgt erweitern. Es wird hier angenommen, dass Sie sich im Netzwerk 192.168.10.0/24 befinden.
Wenn Sie zwei Netzerkschnittstellen verwenden, wie zum Beispiel LAN und WLAN, können Sie den SSH-Port auch nur auf einem Interface freigeben. Die folgende Regel erlaubt nur den Zugriff über die LAN-Schnittstelle eth0.
Die letzte Firewall-Regel in der hier gezeigten Beispielkonfiguration weist alle eingehenden Pakete ab, welche nicht durch eine der vorhergehenden Firewall-Regeln explizit erlaubt wurde. Aus diesem Grund muss diese Regel auch immer die letzte Regel in der sogenannten Firewall-Chain sein.
Wenn Sie die Konfigurationsdatei /etc/network/iptables erstellt haben, sollten Sie diese jetzt mit dem folgenden Befehl laden.
Ob die Firewall-Regeln geladen wurden können Sie wie folgt überprüfen.
pi@raspberrypi ~ $ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Alles anzeigen
Bevor Sie mit dem nächsten Schritt fortfahren, sollten Sie sicherstellen, dass der Zugriff über SSH und gegebenenfalls auf weitere freigegebene Ports funktioniert.
Damit die Firewall-Regeln bei einem Neustart des Systems oder des Netzwerkdienstes automatisch geladen werden, müssen Sie noch ein Pre-Up Skript erstellen.
Fügen Sie in die Datei /etc/network/if-pre-up.d/iptables die folgenden Zeilen ein.
Damit das Skript ausgeführt werden kann müssen Sie die Zugriffsrechte entsprechend anpassen.
Wenn Sie testen wollen ob die Firewall-Regeln auch nach dem Neustart geladen werden, können Sie jetzt einen Neustart des Systems durchführen.
Nach dem Neustart können Sie die Firewall-Regeln wieder mit dem folgenden Befehl auslesen.
pi@raspberrypi ~ $ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Alles anzeigen
Hinweis: Dieses und viele weitere Tutorials finden Sie auf meiner Webseite.
---------------------------------------------------------------------------------------------------------------------------------------------
Erweiterung vom 30.06.2013
Bisher wurde nur auf den TCP-Port 22, welcher vom SSH-Daemon genutzt wird, eingegangen. In dieser Vortsetzung der obigen Anleitung möchte ich noch weitere Firewall-Regeln aufzeigen, welche Sie verwenden können, wenn Sie die jeweiligen Server-Dienste auf Ihrem Raspberry Pi betreiben.
Wichtiger Hinweis
Beachten Sie beim Einfügen einer der folgenden Firewall-Regeln in die /etc/network/iptables, dass sich die Firewall-Regel vor der folgenden Zeile befindet. Andernfalls werden die eingehenden Pakete abgewiesen bevor die gewünschte Firewall-Regel angewendet wird.
FTP-Server
Für einen FTP-Server welcher im passiven Modus erreichbar sein soll, wird die folgende Firewall-Regel benötigt. Dadurch wird der TCP-Port 21 für FTP freigegeben.
Samba-Server
Bei einem Samba-Server müssen mehrere Ports in der Firewall geöffnet werden damit dieser ordnungsgemäß funktionieren kann.
-A INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
Webserver
Wird ein Webserver betrieben muss der TCP-Port 80 für HTTP in der Firewall geöffnet werden.
Ist der Webserver auch über HTTPS erreichbar, muss auch der TCP-Port 443 in der Firewall geöffnet sein.
Mailserver
Bei einem Mailserver werden wie bei Samba verschiedene Protokolle eingesetzt. Zum Empfangen von Mails muss der Mailserver über SMTP (TCP-Port 25) erreichbar sein.
Zum Abrufen von E-Mails kann man POP3 oder IMAP verwenden. Wird POP3 verwendet, muss man den TCP-Port 110 in der Firewall öffnen.
Das mit SSL abgesicherte POP3s nutzt hingegen den TCP-Port 995.
IMAP lauscht in der Regel auf dem TCP-Port 143.
Bei IMAPs handelt es sich ebenfalls um eine mit SSL abgesicherte IMAP-Verbindung welche den TCP-Port 993 nutzt.
DNS-Server
Beim Domain Name Service (DNS) müssen der TCP-Port 53 und der UDP-Port 53 in der Firewall geöffnet werden.
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT
DHCP-Server
Wenn Sie einen DHCP-Server betreiben, sollten Sie den TCP-Port 68 öffnen damit Anfragen aus dem Netzwerk beim DHCP-Daemon ankommen können.
TFTP-Server
Das Trivial File Transfer Protocol (TFTP) wird zum Beispiel bei einem PXE-Server verwendet und nutzt den UDP-Port 69.
NTP-Server
Betreibt man einen Zeitserver welcher das Network Time Protocol (NTP) nutzt, muss man den UDP-Port 123 in der Firewall öffnen.
Druckserver
Das Internet Printing Protocol (IPP) verwendet den TCP-Port 631 sowie den UDP-Port 631 und wird zum Beispiel von CUPS verwendet um Drucker im Netzwerk zur Verfügung zu stellen.
Rsync-Server
Rsync ist ein Protokoll zur Datensynchronisation und nutzt den TCP-Port 873.
OpenVPN-Server
Falls Sie einen OpenVPN-Server betreiben müssen Sie den TCP-Port 1194 öffnen. Beachten Sie hierbei, dass OpenVPN auch den UDP-Port 1194 nutzen kann wenn dies in der Konfigurationsdatei entsprechend definiert wurde.
Hinweis: Dieses und viele weitere Tutorials finden Sie auf meiner Webseite.