![]()
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.
Ohne Zusatztools teilt sich das Einrichten der Firewall in zwei Schritte, die Erstellung der Regeln und das Einbinden eines Startskripts in den Boot-Prozess.
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
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:
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.
Leibniz Universität IT Services - URL: www.rrzn.uni-hannover.de/fw_linux.html?&L=2
Hergen Harnisch, Letzte Änderung: 20.03.2012
Copyright Gottfried Wilhelm Leibniz Universität Hannover