Firewall Konfiguration für Linux

Die Firewall des Linux Kernels wird mit dem Tool "iptables" konfiguriert. Es gibt einige GUIs für die Konfiguration, die irgendwelche Regeln zusammenstellen und eine Firewall verwalten können. Volle Kontrolle über die Firewall hat man aber nur, wenn man es selbst macht. Eine Firewall mit "iptables" selbst zu konfigurieren, ist nicht so schwer. Einfache Dinge sind einfach und Kompliziertes ist möglich.

Man kann für alle Distributionen mein Shell-Script 090firewall im Verzeichnis "/etc/network/if-up.d" speichern. Das Script wird nach dem Herstellen einer Netzwerkverbindung ausgeführt und aktiviert die Firewall Regeln.

Eine einfache Firewall Basis-Konfiguration für Desktop Rechner oder Laptops blockiert alle Verbindungsversuche von außen und erlaubt es allen Nutzern und Daemonen, Verbindungen ins Internet herzustellen: #!/bin/sh
set -e

# Nichts tun, wenn loopback aktiviert wird
[ "$IFACE" != "lo" ] || exit 0

# alte Konfiguration löschen
/sbin/iptables --flush
/sbin/iptables --delete-chain
/sbin/iptables -t mangle --flush
/sbin/iptables -t mangle --delete-chain
/sbin/iptables -t nat --flush
/sbin/iptables -t nat --delete-chain

# forwarding deaktivieren
echo 0 > /proc/sys/net/ipv4/ip_forward

# Default-Policies setzen
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT

# loopback freischalten
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

# Antworten auf bestehende Verbindungen erlauben
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Nach dem Download ist das Script in das Verzeichnis "/etc/network/if-up.d" zu kopieren (1) und als "ausführbar" zu markieren (2). Für beide Schritte sind root Rechte erforderlich. (1) > sudo cp Downloads/090firewall /etc/network/if-up.d
(2) > sudo chmod +x /etc/network/if-up.d/090firewall
Diese Firewall Konfiguration ist stealth. Der Rechner beantwortet keine Pings und ist nicht mit Portscans im lokalen Netz auffindbar.

Erweiterungen der Basiskonfiguration

Wenn Dienste auf dem Rechner von außen erreichbar sein sollen, dann kann man weitere Regeln anfügen, um einzeln Ports zu öffnen. Als Beispiel soll der Port 8888 (für den I2P-Router) für eingehenden TCP und UDP Traffic geöffnet werden: /sbin/iptables -A INPUT -i $IFACE -p tcp --dport 8888 -j ACCEPT
/sbin/iptables -A INPUT -i $IFACE -p udp --dport 8888 -j ACCEPT

Wenn nur bestimmte User und Daemonen Verbindungen ins Internet herstellen dürfen, kann man zusätzliche OUTPUT Regeln einfügen, die diesen UIDs den Aufbau von Verbindungen ins Internet ausdrücklich erlaubt und dann alle anderen Verbindungsversuche abweisen. Zuerst muss man das Kernelmodul "ipt_owner" laden: modprobe ipt_owner Die Regeln werden nach folgendem Muster definiert: # Freigabe definieren
/sbin/iptables -A OUTPUT -o $IFACE -m owner --uid-owner <user> -j ACCEPT

# den Rest blockieren
/sbin/iptables -t filter -A OUTPUT -j REJECT
Dafür sollte man sein System aber gut kennen und wissen, welche Dienste man benötigt.


Ein kleines Beispiel als Anregung für eigene Experimente:
  1. Es soll nur dem Nutzer "iuser" gestattet werden, im Internet zu surfen und Tor bzw. JonDo zu verwenden. Dafür reicht es, die Ports 80 und 443 für ausgehende TCP Verbindungen zu öffnen.
  2. Der DNScrypt-proxy kümmert sich um die Auflösung der DNS-Namen beim Surfen ohne Tor/JonDo und läuft als Daemon unter der UID "dcryp".
  3. Alle weiteren Tools zur Kommunikation werden mit Tor oder JonDo (Premium) anonymisiert, beide Anon-Dienste können Port 443 verwenden.
Dafür sind folgende Regeln nötig: modprobe ipt_owner

# Freigaben
/sbin/iptables -A OUTPUT -o $IFACE -m owner --uid-owner iuser -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A OUTPUT -o $IFACE -m owner --uid-owner iuser -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A OUTPUT -o $IFACE -m owner --uid-owner dcryp -p udp --dport 443 -j ACCEPT

# den Rest blockieren
/sbin/iptables -t filter -A OUTPUT -j REJECT
Was passiert, wenn man als "root" die Software aktualisieren will oder Software aus den Repositories installieren will? Entweder man nutzt Tor bzw. JonDo dafür, oder man fügt temporär eine weitere Regel für "root" hinzu. Viele Spielchen sind möglich.


Mit der Option -d (--destination) kann man zulässige IP-Adressen oder Netzwerkbereiche für ausgehenden Traffic definieren. Man könnte im Beispiel oben z.B. eine OUTPUT Regel vor der letzten REJECT Regel einfügen, die Verbindungen zu einem CUPS Netzwerkdrucker erlaubt. Die IP-Adresse des Netzwerkdrucker ist in diesem Beispiel 192.168.1.30. # Verbindungen zum Netzwerkdrucker erlauben
/sbin/iptables -A OUTPUT -o $IFACE -p tcp -d 192.168.1.30 --dport 631 -j ACCEPT
In Firmen könnte man pauschal Verbindungen zu allen Netzwerkdruckern im lokalen Netz erlauben, indem man den gesamten Netzwerkbereich 192.168.1.* freigibt: # Verbindungen zu allen Netzwerkdruckern im LAN erlauben
/sbin/iptables -A OUTPUT -o $IFACE -p tcp -d 192.168.1.0/24 --dport 631 -j ACCEPT
Prinzipiell kann man auch Hostnamen statt IP-Adressen verwenden. Die DNS-Auflösung der Hostnamen erfolgt aber nur einmalig vor der Übergabe der Regeln an den Kernel.

Logging

Zur Erkennung von Angriffsversuchen oder um Probleme mit eigenen, restriktiven Konfigurationen zu erkennen, kann man das Logging von iptables aktivieren. # Logging aktivieren
/sbin/iptables -N LOGGING
/sbin/iptables -A INPUT -j LOGGING
/sbin/iptables -A OUTPUT -j LOGGING
/sbin/iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
/sbin/iptables -A LOGGING -j DROP
Dieses Beispiel schreibt die Logs über gedroppte Paket nach "/var/log/syslog". Die Zeilen beginnen mit "IPTables-Dropped:", so dass man mit "grep" schnell filtern kann.
Lizenz: Public Domain