• Zielgruppen
  • Suche
 

IPTables unter Debian-Linux

Früher wurde IPTables unter Debian über ein Init-Skript gestartet, wie es auf der Seite Paketfilter für Linux als generische Lösung beschrieben wird. Dazu wurde immer ein Skript /etc/init.d/iptables mit dem Paket installiert. Dieses Vorgehen hat seine Grenzen bei sich im Betrieb ändernden Netzwerkschnittstellen, wie sie z.B. bei Notebooks vorkommen, und im Zusammenhang mit DHCP. Daher wird für Debian seit einiger Zeit empfohlen, die Firewall-Regeln an den Mechanismus für das Aktivieren und Deaktivieren von Netzwerkschnittstellen (ifupdown) anzuhängen. Möchte man weiterhin ein init-Skript verwenden, sollte man es mit update-rc.d den Runlevels zuordnen (anderenfalls evt. Probleme bei Systemupdates). Das alte Debian-Init-Skript zu IPTables ist als /usr/share/doc/iptables/oldinitdscript.gz im oldstable-Debianpaket noch zu finden.

In aktuellen Debian-Versionen gibt es das Debian-Paket iptables-persistent, dass in /etc/iptables/rules* mittels iptables-save abgelegte Konfigurationen verwendet.

Der ifupdown-Mechanismus wird über die Datei /etc/network/interfaces konfiguriert. Dort kann man für jede Netzwerkschnittstelle (eingeleitet mit einer iface-Zeile) Einstellungen vornehmen, u.a. pre-up und post-down Einträge, die Skripte oder Programme unmittelbar vor der Aktivierung bzw. nach der Deaktivierung einer Schnittstelle ausführen.

Quick & Dirty-Lösung

Möchte man einfach Regeln aus /etc/iptables.conf beim Hochfahren des Systems aktivieren, so kann man das etwas unelegant einfach an das Aktivieren der Loopback-Schnittstelle koppeln. Dazu muss nur eine pre-up-Zeile der Datei /etc/network/interfaces zugefügt werden (hier nur der relevante Abschnitt):

# The loopback network interface
auto lo
iface lo inet loopback
pre-up /sbin/iptables-restore < /etc/iptables.conf

Diese Lösung ist sicherlich noch einfacher als das init-Skript, aber weder ist eine einfache Deaktivierung der Firewall möglich noch wird dynamischen Änderungen in der Netzwerkkonfiguration Rechnung getragen.

Elegantere Skriptlösung

Neben den pre-up- und post-down-Zeilen gibt es noch die Verzeichnisse /etc/network/if-pre-up.d/ und /etc/network/if-post-down.d/, in denen Skripte hinterlegt werden können, die beim Hochfahren jeder Schnittstelle aufgerufen werden. In diesen Skripten sind Umgebungsvariablen verfügbar (vgl. manpage zu interfaces), mit denen eine Konfiguration je nach Schnittstelle möglich wird. Durch die Verwendung einer separaten chain je Schnittstelle und Richtung (in/out), lassen sich recht universelle und übersichtliche Skripte verwenden.

Up-Skript

Das Up-Skript /etc/network/if-pre-up.d/iptables-up muss an die eigenen Regeln angepasst werden. Dieses muss je Schnittstelle passieren (im jeweiligen case-Abschnitt).

Im Up-Skript werden zwei chains für die zu aktivierende Schnittstelle erzeugt und in die System-chains INPUT und OUTPUT für die Schnittstelle eingetragen. Die Standard-Policy für die System-chains wird hier bei jeder Schnittstelle auf DENY gesetzt und nie aufgehoben.

#!/bin/bash
# 2006-01-09, Hergen Harnisch, RRZN, Uni.Hannover
# Skript /etc/network/if-pre-up.d/iptables-up fuer Debian

IPTABLES=/sbin/iptables

# einige Server- bzw. Netz-Daten
UNIHANNOVER=130.75.0.0/16
DNSSERVER="130.75.1.32 130.75.1.40 192.76.176.9"
MAILSERVER="130.75.2.0/24 130.75.5.0/24 130.75.6.0/24" # etwas ungenau, egal

# Setzen der Default-Policies
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Pruefen ob dev-spezif. chains noch vorhanden (Ueberbleibsel von Fehlern),
# ggf. aufraeumen wie beim Runterfahren der Schnittstelle
if $IPTABLES -L IN-$IFACE >/dev/null 2>&1; then
/etc/network/if-post-down.d/iptables-down;
fi
# Neue chains erzeugen und einhaengen
$IPTABLES -N IN-$IFACE
$IPTABLES -A INPUT -i $IFACE -j IN-$IFACE
$IPTABLES -N OUT-$IFACE
$IPTABLES -A OUTPUT -o $IFACE -j OUT-$IFACE

case "$IFACE" in
lo)
# Loopback ganz frei:
$IPTABLES -A IN-$IFACE -j ACCEPT
$IPTABLES -A OUT-$IFACE -j ACCEPT
;;
eth0)
# Ethernet-Anschluss in der Uni-Hannover
##### Regeln für Reinkommendes
# Antworten und bestehende Verbindungen akzeptieren
$IPTABLES -A IN-$IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
# z.B. folgende Zeile für ssh-Zugriff (Kommentar entfernen)
#$IPTABLES -A IN-$IFACE -p tcp --dport 22 -j ACCEPT
# oder ssh nur aus dem Bereich der UH
#$IPTABLES -A IN-$IFACE -s $UNIHANNOVER -p tcp --dport 22 -j ACCEPT
# ICMP: Ping zulassen
$IPTABLES -A IN-$IFACE -p icmp --icmp-type 8 -j ACCEPT
# evt. aber auch nur aus der UH
#$IPTABLES -A IN-$IFACE -p icmp -s $UNIHANNOVER --icmp-type 8 -j ACCEPT
##### Regeln für Rausgehendes (REJECT statt DROP damit kein Timeout)
# Antworten und bestehende Verbindungen akzeptieren
$IPTABLES -A OUT-$IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
# noch DNS & SMTP filtern, da haeufig missbraucht (BOTS)
# DNS-Anfragen nur auf oben angegebene Server
for DNSSERV in $DNSSERVER; do
$IPTABLES -A OUT-$IFACE -p udp -d $DNSSERV --dport 53 -j ACCEPT
$IPTABLES -A OUT-$IFACE -p tcp -d $DNSSERV --dport 53 -j ACCEPT;
done # das waren die erlaubten, andere DNS sperren
$IPTABLES -A OUT-$IFACE -p udp --dport 53 -j REJECT
$IPTABLES -A OUT-$IFACE -p tcp --dport 53 -j REJECT
# SMTP nur auf oben angegebene Server
for MAILSERV in $MAILSERVER; do
$IPTABLES -A OUT-$IFACE -p tcp -d $MAILSERV --dport 25 -j ACCEPT
$IPTABLES -A OUT-$IFACE -p tcp -d $MAILSERV --dport 465 -j ACCEPT;
done
$IPTABLES -A OUT-$IFACE -p tcp --dport 25 -j REJECT
$IPTABLES -A OUT-$IFACE -p tcp --dport 465 -j REJECT
# Rest zulassen
$IPTABLES -A OUT-$IFACE -p tcp -j ACCEPT
$IPTABLES -A OUT-$IFACE -p udp -j ACCEPT
$IPTABLES -A OUT-$IFACE -p icmp -j ACCEPT
;;
*)
# wenn nichts anderes angegeben (sozusagen Standard), dann
# von Innen alles, von Aussen nichts (ausser Antworten):
$IPTABLES -A IN-$IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMP: Ping zulassen
$IPTABLES -A IN-$IFACE -p icmp --icmp-type 8 -j ACCEPT
$IPTABLES -A IN-$IFACE -j DROP
$IPTABLES -A OUT-$IFACE -j ACCEPT
;;
esac

Down-Skript

Das Down-Skript /etc/network/if-post-down.d/iptables-down ist das leichtere, da es keine anzupassenden Regeln enthält, sondern nur die Aufhebung der Regeln. Dieses geschieht durch Austragen der Umlenkung (auf die erzeugten chains) aus den System-chains und das Löschen der zwei beim Aktivieren erzeugten Schnittstellen-chains.

#!/bin/bash
# 2006-01-09, Hergen Harnisch, RRZN, Uni.Hannover
# Skript /etc/network/if-post-down.d/iptables-down fuer Debian

IPTABLES=/sbin/iptables

$IPTABLES -D INPUT -i $IFACE -j IN-$IFACE
$IPTABLES -F IN-$IFACE
$IPTABLES -X IN-$IFACE
$IPTABLES -D OUTPUT -o $IFACE -j OUT-$IFACE
$IPTABLES -F OUT-$IFACE
$IPTABLES -X OUT-$IFACE

Nach Installation der Up- und Down-Skripte kann die Firewall durch Aufruf von /etc/init.d/networking reload oder für eine Schnittstelle mit ifdown eth0; ifup eth0 (neu-) geladen werden. Alternativ kann ein neuer Regelsatz mit dem im unten angegebenen Tar-Paket enthaltenen Skript iptables-reload ohne Herunterfahren der Schnittstelle geladen werden. Beachten Sie, dass man sich bei einer Fernadministration per ssh sehr leicht selbst aussperren kann und nur noch ein Gang zur Konsole bleibt!

Will man die Firewall für Testzwecke vorübergehend deaktivieren, so kann man das mit dem Skript iptables-deactivate, das in dem unten angegebenen Tar-Paket enthalten ist. Das Skript deaktiviert die Filterregeln, wartet auf eine Eingabe und aktiviert die Regeln dann wieder.

Zum Runterladen und Anpassen hier nochmal in gepackter Form die IPTables-ifupdown-Skripte.

Nähere Informationen und Beispiele sind auf jedem Debian-System im Pfad /usr/share/doc/iptables/ zu finden, insbesondere in der Datei README.Debian.gz.