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
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
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.