Packet Filtering

Um den Verkehr zwischen den jeweiligen Teilnetzen einzuschränken wird nun IP - Packet - Filtering bzw. Spoofing - protection eingebaut. Wie schon oben erwähnt wird zu diesem Zweck das Softwarepaket „IPChains9 verwandt. Das Programm prüft alle eingehenden IP-Pakete auf Übereinstimmung mit den definierten Regeln und führt die erste zutreffende Aktionen aus. In der IPChains - Syntax steht ACCEPT für Akzeptieren, REJECT für ablehnen und DENY für fallen lassen des empfangenen Pakets.

Realisierung

Beim Einrichten der Filterung kann man sich nahe an der Dokumentation des IPChains - Paketes halten.10 Eine wichtige Richtlinie ist, wie überall bei sicherheitsrelevanten Angelegenheiten, alles zu verbieten, was nicht ausdrücklich erlaubt ist. Deshalb sollte die letzte Filterregel in der forward - Kette jeglichen Netzverkehr verbieten:

Somit werden alle Pakete abgelehnt, die nicht von dem angegebenen Regelwerk akzeptiert werden.

Um die Konfiguration übersichtlicher zu halten, werden danach Regelgruppen angelegt, um die verschiedenen Quell- und Zielbereiche zusammen zu fassen. Die folgenden Bezeichnungen werden für das interne LAN, die DMZ und das externe (als feindlich betrachtete) Netz verwendet:

Die Regelgruppen tragen somit die Namen in-aus, in-dmz, dmz-in, dmz-aus, aus-in, aus-dmz und zeigen die Verbindungsrichtung an. So bedeutet also in-aus, dass die Verbindung von innen nach aussen aufgebaut wird. Ebenso empfiehlt die Dokumentation eine Gruppe für ICMP-ACCEPT - Packets (name: icmp-acc) und für direkte Adressierung der drei Netzwerkkarten einzurichten. Der Befehl zum Einrichten einer neuen Gruppe (hier „in-aus") lautet:

Im Anschluss daran werden die Sprungregeln definiert, mit denen in die jeweilige Gruppe verzweigt wird. Hier ein Beispiel für eine Verzweigung von der Quelladresse 192.168.144.0 (intern) zu dem Ziel - Interface eth1 (DMZ):

In den so erstellten Gruppen werden anschliessend die Regeln zum Akzeptieren verschiedener Protokolle (genauer: deren Ports) eingerichtet. Der Befehl zum Erlauben von z.B. WWW - Verbindungen (zu Port 80) vom Quellnetz 192.168.144.0 (innen) nach aussen lautet:

Im Gegenzug muss die Antwort des WWW-Servers von aussen nach innen erlaubt werden. Dies wird dadurch erreicht, dass Pakete mit dem Quellport 80, ohne SYN-Flag und der Quelladresse des Webservers zugelassen sind:

Der Befehl für DNS-Anfragen von innen an die DMZ lautet:

Um die Filterregeln zu entwerfen muss darauf geachtet werden, dass Verbindungen Aus der Tabelle im Kapitel Routing können folgende geforderte Kombinationen für Port, Quell- und Zieladressraum erstellt werden:

in-aus

dns-request, ftp, nntp, ping, pop3, smtp, telnet, traceroute, www

in-dmz

dns-request, ftp, ping, pop3, smtp, www

dmz-in

dns-reply, ftp-reply, pong, smtp-reply, www-reply, Datenbank

dmz-aus

dns-request, dns-reply, pong, pop3, smtp, smtp-reply, www-reply

aus-in

dns-reply, ftp-reply, pong, smtp-reply, www-reply

aus-dmz

dns-request, dns-reply, ftp, ping, pong, pop3, smtp, smtp-reply, www

In

dns-request, ping, pong

Aus

pong

dmz

dns ,dns-reply, pong

Icmp-acc

destination-unreachable, source-quench, time-exceeded, parameter-problem

In der input chain werden Pakete behandelt, die direkt an den Firewall Rechner adressiert sind, abhängig von der angesprochenen Netzwerkkarte.

Konfiguration

Zum vereinfachten Einspielen und Auslesen der erstellten Filterregeln werden die Tools ipchains-save bzw. ipchains-restore verwendet. Das erste der beiden Programme sichert die aktuelle Konfiguration in eine Datei, wobei das zweite aus der Konfigurationsdatei die Filterregeln wieder herstellt.

Sind die Regeln komplett, wird ein Script zum Einrichten der Filterung erstellt. Am Ende der Datei wird 'squid' gestartet. Es handelt sich hierbei um das verwendete Proxy - Programm, auf welches später genauer eingegangen wird.

Der Aufruf des Scriptes erfolgt beim Booten des Rechners in der Datei /etc/rc.d/boot.local und muss manuell eingetragen werden. Um es abzusichern, müssen ihm noch entsprechende Rechte zugewiesen werden (chmod 700), damit es nur von root ausgeführt werden kann.

Hier der Inhalt der Datei /etc/rc.d/rc.firewall (Kommentare sind mit dem Zeichen "#" gekennzeichnet):

#!/bin/sh
#
# enable IP-forwarding (nedded for redirection)
echo 1 > /proc/sys/net/ipv4/ip_forward
#
# startup ipchains

# mit -P wird die Policy fuer die Kette gesetzt
ipchains -P input ACCEPT
ipchains -P forward DENY
ipchains -P output ACCEPT
# -N dient dem Anlegen von benutzerdefinierten Ketten
ipchains -N in-aus
ipchains -N in-dmz
ipchains -N dmz-in
ipchains -N dmz-aus
ipchains -N aus-in
ipchains -N aus-dmz
ipchains -N ftp-data
ipchains -N icmp-acc
ipchains -N vpn
ipchains -N in
ipchains -N aus
ipchains -N dmz

# Die input Kette dient der Kontrolle des direkten Zugriffs
# auf den Firewall - Rechner (Folgeketten: aus, in, dmz)
ipchains -A input -s 192.168.144.0/24 -d 192.168.144.10/32 -j in
ipchains -A input -s 192.168.112.0/24 -d 192.168.112.10/32 -j dmz
ipchains -A input -s 0.0.0.0/0 -d 192.168.1.10/32 -j aus

# Die forward Kette teilt den Verkehr in Unterketten, abhängig
# von Quell- und Zielnetzwerk
ipchains -A forward -s 192.168.200.0/24 -d 192.168.144.0/24 -i eth2 -j vpn
ipchains -A forward -s 192.168.144.0/24 -d 0.0.0.0/0 -i eth1 -j in-dmz
ipchains -A forward -s 192.168.144.0/24 -d 0.0.0.0/0 -i eth2 -j in-aus
ipchains -A forward -s 192.168.112.0/24 -d 0.0.0.0/0 -i eth2 -j dmz-aus
ipchains -A forward -s 192.168.112.0/24 -d 0.0.0.0/0 -i eth0 -j dmz-in
ipchains -A forward -s 0.0.0.0/0 -d 0.0.0.0/0 -i eth1 -j aus-dmz
ipchains -A forward -s 0.0.0.0/0 -d 0.0.0.0/0 -i eth0 -j aus-in
ipchains -A forward -s 0.0.0.0/0 -d 0.0.0.0/0 -j DENY -l

ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 9037:9037 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 23:23 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 8:8 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 25:25 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 110:110 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 21:21 -p 6 -j ACCEPT
# Die Kette ftp-data legt dynamisch die Regeln für antwortende Datenverbindungen.
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 20:20 -p 6 -j ftp-data
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 443:443 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 119:119 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 37:37 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 37:37 -p 17 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 192.12.144.10/32 53:53 -p 6 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 192.12.144.10/32 53:53 -p 17 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 33434:33500 -p 17 -j ACCEPT
ipchains -A in-aus -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l

ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 25:25 -p 6 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 110:110 -p 6 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 21:21 -p 6 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 20:20 -p 6 -j ftp-data
ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.53/32 53:53 -p 6 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 -d 192.168.112.53/32 53:53 -p 17 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 8:8 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A in-dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -p 1 -j icmp-acc
ipchains -A in-dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l

ipchains -A dmz-in -s 192.168.112.53/32 53:53 -d 0.0.0.0/0 -p 17 -j ACCEPT
# Die Option -y bezeichnet SYN-Pakete, ! verneint eine Regel.
ipchains -A dmz-in -s 192.168.112.53/32 53:53 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-in -s 192.168.112.80/32 20:20 -d 0/0-p 6 -j ftp-data
ipchains -A dmz-in -s 192.168.112.80/32 21:21 -d 0/0-p 6 -j ACCEPT ! -y
ipchains -A dmz-in -s 192.168.112.80/32 25:25 -d 0/0-p 6 -j ACCEPT ! -y
ipchains -A dmz-in -s 192.168.112.80/32 110:110 -d 0/0-p 6 -j ACCEPT ! -y
ipchains -A dmz-in -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A dmz-in -s 0.0.0.0/0 -d 0.0.0.0/0 -p 1 -j icmp-acc
ipchains -A dmz-in -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l

ipchains -A dmz-aus -s 192.168.112.80/32 25:25 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-aus -s 192.168.112.80/32 110:110 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-aus -s 192.168.112.80/32 80:80 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-aus -s 192.168.112.53/32 53:53 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-aus -s 192.168.112.53/32 53:53 -d 0/0 -p 17 -j ACCEPT
ipchains -A dmz-aus -s 192.168.112.80/32 20:20 -d 0/0 -p 6 -j ftp-data
ipchains -A dmz-aus -s 192.168.112.80/32 21:21 -d 0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz-aus -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 53:53 -p 17 -j ACCEPT
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 53:53 -p 6 -j ACCEPT
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 25:25 -p 6 -j ACCEPT
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 110:110 -p 6 -j ACCEPT
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 -p 1 -j icmp-acc
ipchains -A dmz-aus -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l

ipchains -A aus-in -s 0.0.0.0/0 9037:9037 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A aus-in -s 0.0.0.0/0 23:23 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 17 -j ACCEPT
ipchains -A aus-in -s 0.0.0.0/0 37:37 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 443:443 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 21:21 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 20:20 -d 0.0.0.0/0 -p 6 -j ftp-data
ipchains -A aus-in -s 0.0.0.0/0 110:110 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 119:119 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-in -s 0.0.0.0/0 -d 0.0.0.0/0 -p 1 -j icmp-acc
ipchains -A aus-in -s 0.0.0.0/0 -d 0.0.0.0/0 -j DENY -l

ipchains -A aus-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 25:25 -p 6 -j ACCEPT
ipchains -A aus-dmz -s 0/0 -d 192.168.112.80/32 110:110 -p 6 -j ACCEPT
ipchains -A aus-dmz -s 0/0 25:25 -d 192.168.112.80/32 -p 6 -j ACCEPT ! -y
ipchains -A aus-dmz -s 0/0 110:110 -d 192.168.112.80/32 -p 6 -j ACCEPT ! -y
ipchains -A aus-dmz -s 0.0.0.0/0 -d 192.168.112.0/24 80:80 -p 6 -j ACCEPT
ipchains -A aus-dmz -s 0.0.0.0/0 80:80 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-dmz -s 0.0.0.0/0 -d 192.168.112.80/32 21:21 -p 6 -j ACCEPT
ipchains -A aus-dmz -s 0/0 -d 192.168.112.80/32 20:20 -p 6 -j ftp-data
ipchains -A aus-dmz -s 0.0.0.0/0 -d 192.168.112.53/32 53:53 -p 6 -j ACCEPT
ipchains -A aus-dmz -s 0.0.0.0/0 -d 192.168.112.53/32 53:53 -p 17 -j ACCEPT
ipchains -A aus-dmz -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 17 -j ACCEPT
ipchains -A aus-dmz -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus-dmz -s 0.0.0.0/0 8:8 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A aus-dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -p 1 -j icmp-acc
ipchains -A aus-dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -j DENY -l

# Diese Kette dient dem flüssigeren Ablauf des Netzwerks
ipchains -A icmp-acc -s 0.0.0.0/0 3:3 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A icmp-acc -s 0.0.0.0/0 4:4 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A icmp-acc -s 0.0.0.0/0 11:11 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A icmp-acc -s 0.0.0.0/0 12:12 -d 0.0.0.0/0 -p 1 -j ACCEPT

# Alle Pakete, die sich innerhalb des VPN bewegen sind zugelassen
# Wichtig: Der Router zum Internet darf keine privaten Adressen weiterleiten!
ipchains -A vpn -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT

ipchains -A in -s 0.0.0.0/0 -d 0.0.0.0/0 -i ! eth0 -j DENY -l
ipchains -A in -s ! 192.168.144.0/24 -d 0.0.0.0/0 -j DENY -l
ipchains -A in -s 0.0.0.0/0 -d 0.0.0.0/0 53:53 -p 6 -j ACCEPT
ipchains -A in -s 0.0.0.0/0 -d 0.0.0.0/0 53:53 -p 17 -j ACCEPT
ipchains -A in -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A in -s 0.0.0.0/0 -d 0.0.0.0/0 -j icmp-acc
ipchains -A in -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l

ipchains -A aus -s 0.0.0.0/0 80:80 -d 0.0.0.0/0 -p 6 -j ACCEPT
ipchains -A aus -s 0.0.0.0/0 -d 0.0.0.0/0 -i ! eth2 -j DENY -l
ipchains -A aus -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A aus -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A aus -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 17 -j ACCEPT
ipchains -A aus -s 0.0.0.0/0 -d 0.0.0.0/0 61000:65096 -p 17 -j ACCEPT -l
ipchains -A aus -s 0.0.0.0/0 -d 0.0.0.0/0 61000:65096 -p 6 -j ACCEPT -l
ipchains -A aus -s 0.0.0.0/0 -d 0.0.0.0/0 -j icmp-acc -l
ipchains -A aus -s 0.0.0.0/0 -d 0.0.0.0/0 -j DENY -l

ipchains -A dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -i ! eth1 -j DENY -l
ipchains -A dmz -s ! 192.168.112.0/24 -d 0.0.0.0/0 -j DENY -l
ipchains -A dmz -s 192.168.112.80/32 80:80 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz -s 0.0.0.0/0 0:0 -d 0.0.0.0/0 -p 1 -j ACCEPT
ipchains -A dmz -s 192.168.112.53/32 53:53 -d 0.0.0.0/0 -p 6 -j ACCEPT ! -y
ipchains -A dmz -s 0.0.0.0/0 53:53 -d 0.0.0.0/0 -p 17 -j ACCEPT
ipchains -A dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -j icmp-acc
ipchains -A dmz -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT -l
#
# running squid proxy
# using default values in /etc/squid.conf
# depending on /etc/firewall.allow
/etc/rc.d/squid start

Mit -s wird die Quelladresse und mit -d die Zieladresse festgelegt. Der Ausdruck X/Y bezeichnet die IP Adresse X mit der Netzmaske (Anzahl relevanter Bits) Y. Anschliessend gibt es noch die Möglichkeit einen Bereich von Portnummern an zu geben. Dies geschieht in der Form von:bis. Die Option -p bezeichnet das verwendete Protokoll. Hierbei steht 1 für ICMP, 6 für TCP und 17 für UDP. Verwendet man das Zeichen ! vor einem Kriterium, so wird dieses verneint. Vor allem bei der Option -y (SYN-Packets) wird es gern verwendet, um aktiven Verbindungsaufbau zu untersagen.

Test

Der nun folgende Test ist schnell erklärt. Es muss jeder Netzverkehr simuliert werden, der durch die Filterregeln abgedeckt werden soll. Angefangen beim einfachen ping, über Zugriffe auf Web- oder Mailserver bis hin zu Domain - Registration - Anfragen.

Auch wenn dieser Teil der Arbeit einfach ist, so nimmt er doch viel Zeit in Anspruch. Vor allem die Menge der erlaubten Dienste führt zu hoher Fehleranfälligkeit bei der Konfiguration. Um diesen Schritt zu erleichtern, bietet es sich an, jeden erlaubten Netzverkehr (z.B. WWW - Verbindung von aussen in die DMZ) einzeln zu aktivieren und gleich im Anschluss das Ergebnis zu prüfen.