Sicherheit

Firewall IPTABLES

1. allgemeine Erläuterung:

Die Firewall Iptables ist keine Anwendungs - Firewall, wie man sie von Windowssystemen üblicherweise kennt. Sie ist ein Paketfilter, der nur bestimmte Datenpakete, die zu einem bestimmten Port, einer bestimmten IP-Adresse oder einem bestimmten Dienst ( z.B. ftp ) gehören, zulässt.

Ein Paketfilter überwacht alle Netzwerkschnittstellen und überprüft die IP-Pakete nach vorher definierten Regeln. Anhand der IP-Adressen stellt der Filter fest, ob Absender und Empfänger überhaupt kommunizieren dürfen. Eine Schicht tiefer im IP-Paket wird anhand des Transportprotokolls und des Anwendungsprotokolls entschieden, ob die Kommunikation erfolgen darf.

Iptables ordnet je nach Richtung den Netzverkehr standardmäßig einer von drei Regelketten zu, den so genannten Chains. Diese Chains werden in Tabellen festgelegt. Ist ein Paket direkt an den Computer adressiert, arbeitet es die INPUT-Chain ab. Bevor der Rechner es versendet, muss es die OUTPUT-Chain durchlaufen. Und wenn es vom Computer nur weitergeleitet wird -- ob vom inneren Netz zum äußeren oder umgekehrt -- passiert es die FORWARD-Chain.Die Abbildung stellt die Standardketten von Iptables schematisch dar.

Ein Paket wird in der jeweiligen Regelkette der Reihe nach mit den Filterregeln geprüft.
Im Falle einer Übereinstimmung kommt die Regel zur Anwendung, die Bearbeitung endet damit.
Falls keine Regel zutrifft, wird eine Standardregel angewandt, die sogenannte Policy.

Die Standard-Chains von Iptables:

BILD

Zu jeder Standard-Chain gehört eine solche Policy. Da man nicht jeden möglichen Fall genau regeln kann, muss es eine Standardantwort für den Rest geben. Dabei kann man zwei Strategien verfolgen: Die eine erlaubt alles, was nicht explizit geregelt ist. Damit stellt man sicher, dass erst einmal alles funktioniert, Unerwünschtes muss man ausdrücklich verbieten. Die zweite Strategie gestattet nur den explizit erwünschten Datenverkehr und verbietet den Rest. Die zweite Variante bietet deutlich mehr Sicherheit, erfordert jedoch in der Regel mehr Konfigurationsaufwand.

2. Start von iptables auf meine-domain.de
Der Startvorgang und die Sicherung des Rulesets:

Variante 1:
Iptables wird beim Start des Systems automatisch mitgestartet.
Da iptables in den Kernel kompiliert ist, wird es nicht wie Programme über eine Konfigurationsdatei gesteuert.
Das Ruleset ist ebenfalls nicht als Textdatei bearbeitbar.

Es ist wichtig, dass Ruleset vor dem stoppen mit folgendem Befehl zu sichern:
/etc/init.d/iptables save * > /home/mein-gesichertes-ruleset.txt

Das Startscript liegt unter /etc/init.d und heißt iptables.
Es kann mit den üblichen Start- und Stopparametern gesteuert werden.

/etc/init.d/iptables start | stop

Das Startscript bezieht sich auf ein weiteres Script /etc/default/iptables,
indem drei Parameter für die Handhabung der Firewall angegeben sind:

/etc/default/iptables
# enable ipv6 support, Unterstützung für neue IPAdressnorm enable_ipv6=false

# autosave wird aktiviert um das arbeitenden Ruleset
# beim Starten und Stoppen zu sichern.
enable_autosave=true

# das Rulset wird mit dem Zähler gesichert
enable_save_counters=true

Variante 2:

Ein Startscript wird erstellt, dass beim Booten des Rechners das gewünschte Ruleset initialisiert. Hierfür wird es in das entsprechende Runlevel verlinkt.

3. Firewallscript für allein stehenden Server:

Erläuterung:

iptables -F
iptables -X
-A --append
-i interface
-o interface
-p protokoll
--icmp-type
--dport portnummer
--sport portnummer

-m state --state
NEW / INVALID / ESTABLISHED / REALTED

-j ACCEPT
-j DROP

Löscht alle chains
Löscht alle benutzerdefinierten Regelketten
Filterregel an chain anhängen
Interface, das Pakete empfaengt
Interface, über das Pakete gesendet werden
Protokoll tcp, udp oder icmp
mit dem Parameter wird die Nummer des ICMP-Types übergeben
Destination Port – an welchen Port das Paket weitergereicht wird
Source Port – von welchem Port das Paket kommt

Verbindungszustand:
Neue Verbindung / Keinen Bezug zu einer Verbindung / gehoert zu bestehender Verbindung / Eroeffnet neue Verbindung

Sprungziel, das Paket wird akzeptiert
Das Paket wird verworfen

Beispiel eines einfachen Firewallscripts:

Das Ruleset wurde mit den unten notierten Schaltern erstellt. Die freigeschalteten Ports sind im Script selbst notiert.

/etc/init.d/my_firewall.sh

#!/bin/bash
##
IPTABLES=/sbin/iptables
#
## Variablen für geschütztes Netz
MYNET=eth0
## Freizuschaltende Ports auf TCP Ebene
# ftp (21), ssh (22), smtp (25), http (80), https (443),ntp (123), imap (143), imaps (993)
MYPORT_TCP=(21 22 25 80 137 138 139 143 443 993)

## Freizuschaltende Ports auf UDP Ebene
# ftp (21), ssh (22), smtp (25), http (80), https (443),ntp (123), imap (143), imaps (993)
MYPORT_UDP=(22 123137 138 139)

## Freizuschaltende ICMP Pakete:
# 8 Echo (Ping), 0 Echo Reply (Pong), 3 Destination Unreachable 4 Source Quench, Typ 5
# Redirect, 11 Time Exceeded 12 Parameter Problem 30 Traceroute
MYICMP_IN=(0 3 5 8 11 12 30)
## zugelassene ICMP Antworten
MYICMP_OUT=(8 30)

## alle chains entleeren Tabelle filter / nat / mangle
$IPTABLES -F
# eventuell selbst erstellte Tabellen entleeren:
$IPTABLES -X

## Default-Policy auf DROP setzen
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP

## ungueltige Pakete abweisen
$IPTABLES -A INPUT -m state --state INVALID -j DROP
## alle bereits bestehenden Verbindungen werden akzeptiert
$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
## alle Pakete, die an 127.0.0.1 gehen, werden akzeptiert
$IPTABLES -A INPUT -s 127.0.0.0/255.255.255.0 -j ACCEPT
## alles was von innen kommt darf raus
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

###################################################
# DIE INPUT CHAIN ( für eingehende Verbindungen )
## Akzeptiere definierte icmp (MYICMP_IN) Pakete an eth0
for a in ${MYICMP_IN[*]}; do
$IPTABLES -A INPUT -i $MYNET -p icmp -m icmp --icmp-type $a -j ACCEPT;
done
## Akzeptiere Pakete an definierten TCP Ports ($MYPORT_TCP)an eth0 ($MYNET):
for i in ${MYPORT_TCP[*]}; do
$IPTABLES -A INPUT -i $MYNET -p tcp --dport $i --sport 1024:65535 -j ACCEPT;
done
## Akzeptiere Pakete an definierten UDP Ports ($MYPORT_TCP)an eth0 ($MYNET):
for j in ${MYPORT_UDP[*]}; do
$IPTABLES -A INPUT -i $MYNET -p tcp --dport $j --sport 1024:65535 -j ACCEPT;
done

####################################################
# DIE OUTPUT CHAIN ( für ausgehende Verbindungen )
## ICMP Antorten, die raus duerfen
for b in ${MYICMP_OUT[*]}; do
$IPTABLES -A OUTPUT -o $MYNET -p icmp -m icmp --icmp-type $b -j ACCEPT;
done
## Alle TCP Pakete der Dienste duerfen raus
for k in ${MYPORT_TCP[*]}; do
$IPTABLES -A OUTPUT -o $MYNET -p tcp --sport $k --dport 1024:65535 -j ACCEPT;
done
## Alle UDP Pakete der Dienste duerfen raus
for l in ${MYPORT_UDP[*]}; do
$IPTABLES -A OUTPUT -o $MYNET -p tcp --sport $l --dport 1024:65535 -j ACCEPT;
done

Mit Dank an:
http://linuxseiten.kg-it.de/index.php?index=fw_firewall_mit_iptables
http://de.wikibooks.org/wiki/Linux-Kompendium:_Linux-Firewall_mit_IP-Tables
http://forum.unixfreunde.de/allgemein/faqs-tipps/