• Zielgruppen
  • Suche
 

Paketfilter für Linux

Unter Linux ist eine Firewall bereits im Kernel bzw. in Kernelmodulen integriert, bei den Kernelversionen 2.4.xx und 2.6.xx kommt netfilter/iptables zum Einsatz. Die Konfiguration erfolgt grundsätzlich über die Kommandozeilenbefehle iptables (für IPv4) und ip6tables (für IPv6), es gibt aber auch eine Vielzahl grafischer Frontends. Zum Teil ist die Administration des Filters in das Konfigurationstool der jeweiligen Distribution integriert, oder es sind andere distributionsabhängige Dinge zu beachten:

Die Konfiguration ohne Zusatztools oder für spezielle Bedürfnisse erfordert vertiefte Kenntnisse, nicht nur des IP-Protokolls sondern auch auch des Netfilter-Aufbaus. Der Netfilter-Aufbau und der Einsatz von IPTables im Hinblick auf einzelne Rechner ist in unserem Kurzüberblick zu IPTables dargestellt. Eine gute und längere Einführung liefert ein IPTables-Tutorial, recht umfangreiche Informationen sind in den Howtos zu Netfilter zu finden.

Manuelle Einrichtung

Ohne Zusatztools teilt sich das Einrichten der Firewall in zwei Schritte, die Erstellung der Regeln und das Einbinden eines Startskripts in den Boot-Prozess.

Firewall-Regeln

Ein Regelsatz muss individuell angepasst werden. Ein Standardsatz, der allen ungefragten Verkehr von Außen abblockt und jeglichen Verkehr bis auf Einschränkungen bei DNS und Mail von Innen nach Außen zulässt, kann mit folgendem Skript erzeugt werden (ggf. sind Anpassungen bei Verwendung eigener DNS- oder Mail-Server nötig):

#!/bin/sh
# 2012-01-06, Hergen Harnisch, RRZN, Uni.Hannover
# iptables-Aufrufe zur Erzeugung einer Personal Firewall in der UH
# IPv6 zwar nicht im Einsatz, aber
#   1. bei Loopback schon
#   2. Link-Local ist konfiguiert, also auch zu firewallen

IPTABLES=/sbin/iptables
IP6TABLES=/sbin/ip6tables

# einige Server- bzw. Netz-Daten
UNIHANNOVER="130.75.0.0/16 194.95.112.0/22 194.95.156.0/22 10.0.0.0/8"
MAILSERVER="130.75.2.0/24 130.75.6.0/24" # etwas ungenau, egal

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

# Loeschen der bisherigen Filterregeln
$IPTABLES -F
$IP6TABLES -F

##### Regeln fuer Reinkommendes
# Antworten und bestehende Verbindungen akzeptieren
$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IP6TABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Loopback-Device oeffnen
$IPTABLES -A INPUT -i lo -j ACCEPT
$IP6TABLES -A INPUT -i lo -j ACCEPT
# z.B. folgende Zeile fuer ssh-Zugriff (Kommentar entfernen)
#$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
# oder ssh nur aus dem Bereich der UH
#for UNIHNET in $UNIHANNOVER; do
#	$IPTABLES -A INPUT -s $UNIHNET -p tcp --dport 22 -j ACCEPT
#done
# ICMP: Ping zulassen
# (ping hilft Nutzern & Admins, Angreifer ignorieren nicht-pingbar sowieso)
$IPTABLES -A INPUT -p icmp --icmp-type 8 -j ACCEPT

##### Regeln fuer Rausgehendes (REJECT statt DROP damit kein Timeout)
# Antworten und bestehende Verbindungen akzeptieren
$IPTABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IP6TABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Loopback-Device komplett oeffnen
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IP6TABLES -A OUTPUT -o lo -j ACCEPT
# noch SMTP filtern, da haeufig missbraucht (BOTS)
# das aber unbedingt Loggen, damit Infektion auffaellt
# SMTP nur auf oben angegebene Server
for MAILSERV in $MAILSERVER; do
	$IPTABLES -A OUTPUT -p tcp -d $MAILSERV --dport 25 -j ACCEPT
	$IPTABLES -A OUTPUT -p tcp -d $MAILSERV --dport 465 -j ACCEPT
done
$IPTABLES -A OUTPUT -p tcp --dport 25 -j LOG
$IPTABLES -A OUTPUT -p tcp --dport 25 -j REJECT
$IPTABLES -A OUTPUT -p tcp --dport 465 -j LOG
$IPTABLES -A OUTPUT -p tcp --dport 465 -j REJECT
# Rest zulassen
$IPTABLES -A OUTPUT -j ACCEPT
$IP6TABLES -A OUTPUT -j ACCEPT

##### Regeln fuer Weiterleitungen
# keine Regeln fuer FORWARD, nur noetig auf Routern etc.

Die damit erzeugten Filterregeln können über den Befehl iptables-save abgespeichert werden. Für das obige Skript ergibt sich die Ausgabe, die für eine spätere Wiederherstellung mittels iptables-restore in eine Datei gespeichert werden kann, als:

# Generated by iptables-save v1.4.10 on Fri Jan  6 12:00:00 2012
*filter
:INPUT DROP [67:12369]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT 
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -d 130.75.2.0/24 -p tcp -m tcp --dport 25 -j ACCEPT 
-A OUTPUT -d 130.75.2.0/24 -p tcp -m tcp --dport 465 -j ACCEPT 
-A OUTPUT -d 130.75.6.0/24 -p tcp -m tcp --dport 25 -j ACCEPT 
-A OUTPUT -d 130.75.6.0/24 -p tcp -m tcp --dport 465 -j ACCEPT 
-A OUTPUT -p tcp -m tcp --dport 25 -j LOG 
-A OUTPUT -p tcp -m tcp --dport 25 -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -p tcp -m tcp --dport 465 -j LOG 
-A OUTPUT -p tcp -m tcp --dport 465 -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -j ACCEPT 
COMMIT
# Completed on Fri Jan  6 12:00:00 2012

Und das ganze für IPv6 mit ip6tables-save:

# Generated by ip6tables-save v1.4.10 on Fri Jan  6 12:00:00 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -j ACCEPT 
COMMIT
# Completed on Fri Jan  6 12:00:00 2012
Startup-Skripte

Nun muss noch sichergestellt werden, dass diese Regeln bei jedem Systemstart aktiviert werden. Dafür speichert man den oben erzeugten Regelsatz mittels iptables-save >/etc/iptables.conf (bzw. ip6tables-save ...) ab. Die Einbindung geschieht normalerweise über ein Skript in /etc/init.d mit passenden Links in /etc/rc?.d, dieses hängt aber stark von der Distribution ab. Ein mögliches Skript wäre z.B.:

#!/bin/sh
# script /etc/init.d/iptables
# 2012-01-12 Hergen Harnisch, RRZN, Univ.Hannover
# added IPv6-support, return-value/error for IPv4 only

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES=/sbin/iptables
IP6TABLES=/sbin/ip6tables
IPTABLESREST=${IPTABLES}-restore
IP6TABLESREST=${IP6TABLES}-restore
IPTABCFG=/etc/iptables.conf
IP6TABCFG=/etc/ip6tables.conf

. /lib/lsb/init-functions

case "$1" in
	start|restart|reload|force-reload)
		RETVAL=0
		if test -f $IPTABCFG; then
			$IPTABLESREST $IPTABCFG
			RETVAL=$?
		else
			log_warning_msg "no iptables-rules for ipv4 specified, not firewalled."
		fi
		if test -f $IP6TABCFG; then
			$IP6TABLESREST $IP6TABCFG
		else
			log_warning_msg "no iptables-rules for ipv6 specified, not firewalled."
		fi
      		;;
	stop)
		$IPTABLES -P INPUT ACCEPT
		$IPTABLES -P OUTPUT ACCEPT
		$IPTABLES -P FORWARD ACCEPT
		$IPTABLES -F
		RETVAL=$?
		$IP6TABLES -P INPUT ACCEPT
		$IP6TABLES -P OUTPUT ACCEPT
		$IP6TABLES -P FORWARD ACCEPT
		$IP6TABLES -F
		;;
	*)
		echo "$0: unknown command: \"$*\""
		echo "$0 options:"
		echo "  start|restart|reload|force-reload"
		echo "     load the firewall ruleset - firewall active, secured system"
		echo "  stop"
		echo "     unload the ruleset - no firewall, unsecured system"
		RETVAL=1
		;;
esac

exit $RETVAL

Das Anlegen der Links in /etc/rc?.d sollte mit den von der jeweiligen Distribution bereitgestellten Mitteln erfolgen, da es ansonsten Probleme bei Updates geben könnte:

  • Novell-SUSE: chkconfig iptables on
  • Debian: update-rc.d iptables defaults
    (für Debian ist dem Skript wohl das Debian-Paket iptables-persistent mit ähnlicher Funktionalität vorzuziehen.)

Will man die Firewall für Testzwecke vorübergehend deaktivieren, so kann man das mit /etc/init.d/iptables stop. Eine Aktivierung der Firewall geschieht mit /etc/init.d/iptables start und ein Neuladen der Konfigurationsdatei mit /etc/init.d/iptables reload.

Zum Runterladen und Anpassen hier nochmal in gepackter Form die Skripte und Dateien.