Firewall für Raspberry Pi mit iptabels

Für den Raspberry Pi bzw. den Banana Pi ist die Firewall iptables bereits mit an Board, jedoch nicht konfiguriert. Wer seinen Einplatinencomputer direkt im Internet hängen hat, sollte die Firewall aktivieren, um den Schutz des Systems zu erhöhen. Im Folgenden wird eine Beispielkonfiguration für eine statefull Firewall gezeigt. Diese kann je nach Einsatzzweck abweichen und erhebt keinesfalls den Anspruch auf Vollständigkeit. Es empfiehlt sich, ein aktuelles Backup vorzuhalten, um im worst case schnell wieder auf den Ursprungszustand zu kommen.

Als erstes wird ein Konfigurationsverzeichnis für iptables angelegt.

sudo mkdir /etc/iptables

Die tatsächlichen Firewallregeln befinden sich später in der Datei „/etc/iptables/iptables.rules“ für IPv4 bzw. „/etc/iptables/ip6tables.rules“ für IPv6. Um die Firewall zu initialisieren, können folgende Befehle in ein Skript kopiert werden, welches ausgeführt werden muss. Das Skript berücksichtigt sowohl die IPv4 als auch die IPv6 iptables statefull Firewall. Erklärungen der einzelnen Befehle sind als Kommentar im Skript hinterlegt.

sudo nano /usr/local/bin/iptables.sh
#!/bin/bash

# flush all existing chains and delete non default-chains
iptables -F
iptables -X
ip6tables -F
ip6tables -X

# custom chains
iptables -N TCP_IN
iptables -N UDP_IN
ip6tables -N TCP_IN
ip6tables -N UDP_IN

# FORWARD, OUTPUT and INPUT chain
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -P INPUT DROP

# allow existing established connections for INPUT and OUTPUT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# allow loopback interface for INPUT and OUTPUT
iptables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT

# drop invalid packages
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP

# ICMP
iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT

# DHCPv6
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
ip6tables -A OUTPUT -s fe80::/10 -j ACCEPT

# set TCP_IN and UDP_IN chain as INPUT chain 
iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP_IN
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP_IN
ip6tables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP_IN
ip6tables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP_IN

# reject incomming connections if ports are not opened
iptables -A INPUT -p udp -m recent --set --rsource --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
ip6tables -A INPUT -p udp -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
ip6tables -A INPUT -j REJECT

# allow incomming traffic
iptables -A TCP_IN -p tcp --dport 22 -j ACCEPT
iptables -A TCP_IN -p tcp --dport 80 -j ACCEPT
iptables -A TCP_IN -p tcp --dport 443 -j ACCEPT
ip6tables -A TCP_IN -p tcp --dport 22 -j ACCEPT
ip6tables -A TCP_IN -p tcp --dport 80 -j ACCEPT
ip6tables -A TCP_IN -p tcp --dport 443 -j ACCEPT

# save the firewall rules
iptables-save > /etc/iptables/iptables.rules
ip6tables-save > /etc/iptables/ip6tables.rules

Wer auf seinem System zusätzliche Dienste wie z.B. Seafile, NextCloud oder Jabber betreibt, muss die dafür benötigten Ports hinzufügen, da ansonsten der Dienst nicht mehr funktioniert! Das erzeugte Skript muss noch ausführbar gemacht werden.

sudo chmod +x /usr/local/bin/iptables.sh

Um die neuen Firewallregeln zu setzen und dauerhaft zu speichern, wird das Skript ausgeführt.

sudo sh /usr/local/bin/iptables.sh

Der Inhalt der Datei lässt sich ausgeben, um zu prüfen, ob alle Aktionen erfolgreich ausgeführt wurden.

cat /etc/iptables/iptables.rules

iptables statefull firewall

Damit die durchgeführten Änderungen auch nach einem Neustart bestehen bleiben, werden zum Starten der Firewall die iptables und ip6tables Dienste aktiviert und gestartet.

sudo systemctl enable iptables ip6tables
sudo systemctl start iptables ip6tables

Um den Status der Firewall zu prüfen, können die Dienste abgefragt werden.

systemctl status iptables ip6tables

iptables statefull firewall

Die Firewallkonfiguration lässt sich auch über das Terminal anzeigen.

sudo iptables -L

Die Firewall ist damit konfiguriert und sollte ab sofort Ihren Dienst erfüllen.