Firewall mit iptables unter Debian einrichten

iptables Firewall

Linux bringt mit netfilter bereits eine Firewall im Kernel mit, welche mit iptables konfiguriert werden kann. Das folgende Tutorial beschreibt die Einrichtung einer Firewall mit Basis-Regeln, die das System grundlegend absichern.

Funktionsweise von iptables bzw. des Kernel Paketfilters

Die Paketprüfung und die mit iptables zu erstellenden Filterregeln sind dreistufig aufgebaut. Es gibt:

  • Tables/Tabellen (filter, nat, mangle, raw)
    filter ist dabei die Standardtabelle und auch die einzige die für eine herkömmliche Firewall notwendig ist. Hier werden alle Filterregeln hinterlegt.
  • Chains/Ketten (INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING)
    Interessant für eine Firewall sind hier lediglich INPUT und OUTPUT. FORWARD, PREROUTING und POSTROUTING wird auf alle Pakete angewendet, die geroutet werden.
  • Rules/die eigentliche Filterregeln

Trifft eine in einer Table/Tabelle und Chain/Kette definierte Regel auf ein Paket zu, wird die in der Regel hinterlegte Aktion (z.B. -j ACCEPT) ausgeführt. Wenn keine Regel zutrifft, wird die in der Tabelle hinterlegte, allgemein gültige Policy (standardmäßig ACCEPT, lässt sich aber ändern) angewendet.

So viel zur Theorie, nun zur Praxis.

Schritt 1: Regelwerk erstellen und importieren

nano /etc/iptables.firewall.rules

Da die Datei in der Regel noch nicht existiert, ist diese zuerst einmal leer. Hier werden nun folgende Regeln eingefügt:

*filter

# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow connections from anywhere
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allow SSH connections
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Allow ping
-A INPUT -p icmp -j ACCEPT

# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Allow all outbound traffic
# Alternative: "-P OUTPUT ACCEPT" which sets default policy
-A OUTPUT -j ACCEPT

# Drop all other inbound traffic
# Alternative: "-P INPUT DROP" and "-P FORWARD DROP" which sets default policy
-A INPUT -j DROP 
-A FORWARD -j DROP

COMMIT

Hier ist es wichtig zu verstehen, dass bei einer iptables Firewall eingehende Pakete stets von oben nach unten auf Regeln geprüft werden. Wenn keine Regel greift, wird das Paket zugelassen (Standard unter Debian). Deshalb stehen am Ende noch die beiden DROP Regeln, welche alle anderen Pakete, auf die keine der darüber genannten Regeln greift, verworfen werden. Diese beiden Regeln lassen sich auch durch eine entsprechende Policy ersetzen (siehe auskommentierte Alternative oben).

Die oben genannten Regeln blocken demnach jegliche Zugriffe von außen auf das System, lassen aber loopback Verbindungen, inbound Verbindungen, SSH, HTTP, HTTPS, Ping (rot markiert) und natürlich ausgehende Verbindungen (outbound) zu. Weitere Portfreigaben lassen sich mit folgender Syntax hinzufügen:

-A INPUT -p PROTOKOLL (udp oder tcp) --dport PORTNUMMER -j ACCEPT

Das fertige Regelwerk muss nun nur noch gespeichert und geschlossen werden. Danach können die Regeln mit iptables-restore importiert werden.

iptables-restore < /etc/iptables.firewall.rules

Schritt 2: Script erstellen um Regeln automatisch zu laden

Damit die Regeln auch nach einem Neustart noch gelten muss ein Script erstellt werden, welches vor Aktivierung des Netzwerk-Interfaces ausgeführt wird.

nano /etc/network/if-pre-up.d/firewall

Hier fügt man die folgenden beiden Zeilen ein:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules

Nun wird die Datei ausführbar gemacht.

chmod +x /etc/network/if-pre-up.d/firewall

Die Firewall ist nun fertig eingerichtet und die Regeln werden auch nach einem Neustart wieder geladen.

Quelle: Linode Library

Ein Gedanke zu „Firewall mit iptables unter Debian einrichten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.