Wechseln zu: Navigation, Inhalt, Suche

Permalink

0

HowTo: Firewall mit iptables unter Debian oder Ubuntu einrichten

Nachdem dieses Blog einige Jahre auf einem Webspace gehostet war, bin ich nun auf einen eigenen vServer umgezogen. Damit bekommt man zum gleichen Preis eine höhere Leistung, da man sich die zur Verfügung stehenden Ressourcen mit niemandem teilen muss. Außerdem hat man beim Setup wesentlich mehr Freiheiten und kann beispielsweise Webserver und Datenbanken selbst wählen. Das bedeutet aber auch, dass man sich um die Administration kümmern muss.

Zum Einstieg ist es bei mir ein VPS (Virtual Private Server) mit 256 MB RAM, 20 GB Speicherplatz und 250 GB Traffic auf OpenVZ-Basis geworden, den ich auf LowEndBox gefunden habe. In diesem und den folgenden Artikeln werde über meine Erfahrungen beim Installieren berichten.

Bild von Vladimir Kramer auf Unsplash, lizenziert unter CC0 1.0

Bild von Vladimir Kramer auf Unsplash, lizenziert unter CC0 1.0

Erster Schritt nach der Installation des Betriebssystems sollte das Einrichten einer Firewall sein. Bei mir ist die Wahl auf iptables gefallen, das sich unter Debian und Ubuntu als Paket installieren lässt:

sudo apt-get install iptables

IPv4

Zum Initialisieren löscht man erstmal alle bereits vorhandenen Regeln:

sudo iptables -F

Anschließend kann man eigene Regeln anlegen, wobei die Ports natürlich an die eigenen Bedürfnisse angepasst werden müssen, damit man sich nicht versehentlich aussperrt:

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 25 -j ACCEPT # SMTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
sudo iptables -A INPUT -p tcp --dport 110 -j ACCEPT # POP3
sudo iptables -A INPUT -p tcp --dport 143 -j ACCEPT # IMAP
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPT # SSMTP
sudo iptables -A INPUT -p tcp --dport 587 -j ACCEPT # Submission
sudo iptables -A INPUT -p tcp --dport 993 -j ACCEPT # IMAPS
sudo iptables -A INPUT -p tcp --dport 995 -j ACCEPT # POP3S
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # SSH
sudo iptables -A INPUT -p tcp --dport 5656 -j ACCEPT # HTTPS (Admin)
sudo iptables -A INPUT -p tcp --dport 6523 -j ACCEPT # Infinoted (Gobby)
sudo iptables -A INPUT -p icmp -j ACCEPT # ICMP (Ping, Traceroute)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j REJECT
sudo iptables -A OUTPUT -j ACCEPT

Mit diesen Regeln werden Antworten auf ausgehende Verbindungen, Loopback-Verbindungen, die angegebenen Ports der Protokolle HTTP, SMTP, SSH & Co. sowie Pings akzeptiert. Die Ports müssen hierbei noch an die eigenen Bedürfnisse angepasst werden. In der obigen Konfiguration habe ich den SSH-Port beispielsweise von 22 auf 2222 geändert. Alle anderen eingehenden Verbindungen werden dann ignoriert, Weiterleitungen abgelehnt und ausgehende Verbindungen immer zugelassen.

Zum Auflisten der eingerichteten Regeln lässt sich der folgende Befehl verwenden:

sudo iptables -L

Damit die Konfiguration auch nach einem Neustart noch vorhanden ist, wird sie mittels iptables-save abgespeichert:

sudo sh -c "iptables-save > /etc/iptables.rules"

Nun erstellt man einen Anhang zur Interface-Konfiguration, in dem man festlegt, dass die iptables-Regeln beim Starten geladen werden. Wer möchte, dass die Regeln beim Herunterfahren automatisch gespeichert werden, kann die zweite Zeile auch noch einkommentieren:

sudo vi /etc/network/interfaces.tail
pre-up iptables-restore < /etc/iptables.rules
# post-down iptables-save > /etc/iptables.rules

IPv6

Es ist allerdings wichtig zu wissen, dass sich die gezeigten Befehle nur auf die IPv4-Implementation von iptables beziehen. Ist der vServer auch per IPv6 erreichbar, sollten die Regeln unbedingt auch mit ip6tables gepflegt werden, da er über IPv6 ansonsten ungeschützt erreichbar wäre.

sudo ip6tables -F
sudo ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT # SMTP
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
sudo ip6tables -A INPUT -p tcp --dport 110 -j ACCEPT # POP3
sudo ip6tables -A INPUT -p tcp --dport 143 -j ACCEPT # IMAP
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
sudo ip6tables -A INPUT -p tcp --dport 465 -j ACCEPT # SSMTP
sudo ip6tables -A INPUT -p tcp --dport 587 -j ACCEPT # Submission
sudo ip6tables -A INPUT -p tcp --dport 993 -j ACCEPT # IMAPS
sudo ip6tables -A INPUT -p tcp --dport 995 -j ACCEPT # POP3S
sudo ip6tables -A INPUT -p tcp --dport 2222 -j ACCEPT # SSH
sudo ip6tables -A INPUT -p tcp --dport 5656 -j ACCEPT # HTTPS (Admin)
sudo ip6tables -A INPUT -p tcp --dport 6523 -j ACCEPT # Infinoted (Gobby)
sudo ip6tables -A INPUT -p icmp -j ACCEPT # ICMP (Ping, Traceroute)
sudo ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables denied: " --log-level 7
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j REJECT
sudo ip6tables -A OUTPUT -j ACCEPT

Auch hier speichert man die Konfiguration mittels ip6tables-save ab:

sudo sh -c "ip6tables-save > /etc/ip6tables.rules"

An die zuvor erstellte Konfiguration hängt man nun noch folgendes an, damit die ip6tables-Regeln beim Starten geladen werden:

sudo vi /etc/network/interfaces.tail
pre-up ip6tables-restore < /etc/ip6tables.rules
# post-down ip6tables-save > /etc/ip6tables.rules

Somit ist die grundlegende Konfiguration von iptables und ip6tables abgeschlossen. Ein weiterer sinnvoller Schritt zur Absicherung des vServers ist, die Fernwartung mit SSH auf Authentifizierung über öffentliche Schlüssel umzustellen.

Schreibe einen Kommentar