Echte Firewall - Johannes Hofmeister

Werbung
Firewalls mit FreeBSD und Linux
Johannes Hofmeister © 2008, http://cessor.de/
Beschreibung
Das folgende Dokument beschreibt das aufsetzen mehrerer Firewall Lösungen auf der Basis von
FreeBSD. FreeBSD ist ein quelloffenes Betriebssystem und kann unter http://www.freebsd.org
heruntergeladen werden.
Dieses Dokument kann unter
http://cessor.de/misc/fw/Firewall.docx (Word 2007)
http://cessor.de/misc/fw/Firewall.doc (Word 2003)
http://cessor.de/misc/fw/Firewall.pdf (PDF)
herunter geladen werden.
Die erstellten Konfigurationsdateien sind zu finden unter:
http://cessor.de/misc/fw/
Inhalt
Beschreibung ........................................................................................................................................... 1
Allgemeines ............................................................................................................................................. 3
Client Firewall ...................................................................................................................................... 3
Echte Firewall ...................................................................................................................................... 3
Technik ................................................................................................................................................ 3
Netzwerktopologie .................................................................................................................................. 4
Konfiguration des Gateways ................................................................................................................... 4
IPFIREWALL (IPFW) .................................................................................................................................. 7
Regel Syntax ........................................................................................................................................ 8
Scripting ............................................................................................................................................. 10
IPFILTER (IPF) ......................................................................................................................................... 13
Verwenden von ipf ............................................................................................................................ 13
Regel Syntax ...................................................................................................................................... 14
NAT mit IPF .................................................................................................................................... 15
IPF Firewall Script .......................................................................................................................... 16
IPNAT Network Address Translation Script ................................................................................... 17
Packet Filter (PF).................................................................................................................................... 18
Verwendung ...................................................................................................................................... 18
Regel Syntax ...................................................................................................................................... 18
Ausblick ................................................................................................................................................. 21
Traffic Shaping ................................................................................................................................... 21
Bridging.............................................................................................................................................. 21
Kernel Compilierung .......................................................................................................................... 21
Anhang .................................................................................................................................................. 22
Quellen .............................................................................................................................................. 22
Verwendete Programme ................................................................................................................... 22
Downloads ......................................................................................................................................... 22
Allgemeines
Allgemeines Vertrauen in die Motive von Datenpaketen ist grundsätzlich falsch – es existiert eine
Vielzahl böswilliger Benutzer und automatischer Programme wie Viren und Trojaner. Ein
Virenscanner selbst reinigt Rechner nur von laufenden Prozessen, um bestimmte Daten von
vorneherein nicht anzunehmen benötigt man eine Firewall. Diese filtert den Netzwerkverkehr.
Client Firewall
Clientfirewalls oder auch Personal Firewalls sind keine richtigen Firewalls. Meist werden diese als
sog. Firewalls verkauft, aber sie entsprechen nicht dem Konzept einer richtigen Firewall. Diese
Firewalls sind meist in der Lage bestimmte Ports und Verbindungen zu überprüfen, bieten aber nicht
die echte Sicherheit einer Firewall. Sie dienen meist nur dem Ausgleich von Fehlern im
Betriebssystem und finden meist nur auf Windowsbasierten Rechnern Anwendung. Dennoch sind
Clientfirewalls nützlich, da diese meist im Paket mit einem Viren- und Malwarescanner angeboten
werden. Sie bieten dadurch zumindest rudimentäre Sicherungsmechanismen des Systems, welche
aber für erfahrene Benutzer meist obsolet sind.
Echte Firewall
Eine echte Firewall bietet eine Vielzahl von Vorteilen gegenüber der Clientfirewall. Echte Firewalls
werden auf einem dedizierten Host im Netz installiert, dadurch spart sich der eigentliche Client im
Netz, der geschützt werden soll, Rechenleistung gegenüber der Clientfirewall. Die Firewall ist in der
Lage weitere Schutzmechanismen aufzubauen. So ist ein Rechner mit einer Clientfirewall im Netz
sichtbar und damit verwundbar, eine dedizierte Firewall ist im Netz selbst unsichtbar und kann auch
die Hosts die sie schützt verstecken.
Technik
Firewalls kontrollieren den Netzwerkverkehr mit Hilfe von bestimmten Listen, die Regeln für
zuzulassenden oder für zu verweigernde Verbindungen enthalten. Diese Listen können inklusive oder
exklusive sein. Exklusive Listen erlauben zunächst alles und enthalten dann eine Liste mit gesperrten
Verbindungen. Dieses Verfahren nennt man auch Black List. Inklusive Firewalls verwenden hingegen
eine White List. Diese verweigert jeglichen Verkehr, der nicht explizit erlaubt wurde. Inklusive
Firewalls sind wesentlich sicherer als exklusive Firewalls.
Die Interpretation der Regeln geschieht meist in OSI Layer 3 und 4, also Network und Transport
Layer. Die Regeln beinhalten daher meist angaben über das Protokoll, bzw. einen bestimmten Port
(TCP, UPD, etc) oder ip Adressen.
Die Regellisten können unterschiedlich implementiert werden, FIRST MATCH WINS und LAST MATCH
WINS. Mit FIRST MATCH endet die Auswertung der Regeln, sobald eine Regel zutrifft. LAST MATCH
wertet alle Regeln aus. Treffen mehrere Regeln zu, so wird die letzte verwendet.
Firewalls können so eingestellt werden, dass sie die Verbindungen dauerhaft verwalten. Wird eine
Anfrage von einem Host hinter der Firewall gestellt, so kann der antwortende Host (beispielsweise
der Server) nur mit einem Packet des selben Typs antworten. Dadurch wird die Firewall zwar
potentiell verwundbar gegen DDoS Attacken, daher wird sie meist mit einem hybriden Verhalten,
also teils stateful und teils stateles implementiert.
Im Folgenden sollen die Implementierungen Firewalls auf der Basis von BSD und Linux Systemen
erklärt werden. Unter Linux steht die Software „iptables“ unter FreeBSD „ipfw“ und „ipf“ zur
Verfügung.
Netzwerktopologie
Um die Firewall sinnvoll zu implementieren wird die folgende Topologie verwendet:
Der Zugriff über das Internet geschieht über einen Router. Dieser hat die lokale IP Adresse
192.168.1.1. Direkt am Router angeschlossen ist der Firewall Rechner. Dieser fungiert als Gateway
und besitzt zwei Netzwerkinterfaces. Das an den Router angeschlossene Interface hat die IP Adresse
192.168.1.3, das Interface am Client Netz hat die Adresse 192.168.2.1. Es befinden sich also zwei
Netze in der aktuellen Topologie, x.x.2.0 und x.x.1.0.
Die Host befinden sich alle im Netz 192.168.2.0.
Konfiguration des Gateways
Der Rechner besitzt zwei Interfaces. Eine interne Netzwerkkarte des nForce Mainboard Chipsatzes.
Treiber ist nfe, daher heisst das Interface nfe0. Das interface rl0 hingegen ist an einen PCI Slot
angeschlossen und benutzt einen Realtek Chipsatz.
Die Interfaces werden mit dem Tool ifconfig konfiguriert:
ifconfig
ifconfig
ifconfig
ifconfig
nfe0 inet 192.168.1.3 netmask 255.255.255.0
rl0 inet 192.168.2.1 netmask 255.255.255.0
nfe0 up
rl0 up
Die Korrektheit der einstellungen kann über eine Ping abfrage geprüft werden.
ping 192.168.2.1
ping 192.168.1.3
Um die Einstellungen zu persistieren müssen sie in der Datei
/etc/rc.conf
Festgeschrieben werden. Um für ein Interface DHCP zu aktivieren verwendet man den Eintrag:
ifconfig_nfe0=“DHCP“
Diese Konfiguration trifft aber nicht auf den aktuellen Fall zu, daher werden stattdessen die
folgenden Einträge verwendet:
ifconfig_nfe0=“inet 192.168.1.3 netmask 255.255.255.0“
ifconfig_nfe0=“inet 192.168.1.3 netmask 255.255.255.0“
Danach wird der Rechner als Gateway konfiguriert. Dazu wird der folgende Eintrag in der Datei
/etc/rc.conf vorgenommen:
gateway_enable=“YES“
Dieser Eintrag kann auch über das Tool Sysctl vorgenommen werden.
sysctl –a
Zeigt diverse Kerneleinstellungen an. Über das Tool können diese Einstellungen verändert werden:
sysctl
sysctl
sysctl
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
net.inet.ip.fastforwarding=1
Das erste Kommando hat den selben Effekt wie gateway_enable =”YES”.
Danach wird die defaultroute auf den Internet Router gesetzt:
defaultrouter=“192.168.1.1“
Der Befehl
netstat –r
zeigt alle verfügbaren Routen an. Diese können die folgenden Flags aufweisen:
Flags:
Flag
U
H
G
S
C
W
L
Bedeutung
Up: Route ist aktiv
Route zu einem konkreten Host
Route zum Gateway
Statische Route
Clone: Route wurde geklont
Route ist bereits geklont worden
Link Route
Mit diesen Einstellungen gelangen Pakete aus dem x.2.0 Netz bereits ins x.1.0 Netz, jedoch nicht
zurück. Pingsignale schlagen daher fehl (genau wie jeder andere Verkehr). Damit Pakete aus dem
x.1.0er Netz wieder zurück ins x.2.0 er Netz gelangen können muss der Router mit der IP 192.168.1.1
eine Route ins Netz 2.0 kennen, welche über das Interface nfe0 ( 192.168.1.3) am BSD Gateway führt.
Dadurch wären jedoch Hosts nach außen hin sichtbar, was keineswegs erwünscht ist. Daher werden
die Hosts hinter dem Gateway mit Network Address Translation versteckt.
Dadurch senden die Hosts dem Gateway Anfragen an beliebige Adressen (beispielsweise im
Internet). Diese werden vom GW an den Router weitergeleitet, erhalten jedoch als Source IP die
Adresse des Gateways. Der Router bearbeitet die Pakete dann für den Gateway und sendet ihm diese
zurück. Der Gateway verteilt diese wiederum an die entsprechenden Hosts im x.2.0er Netz.
firewall_enable=”YES”
firewall_type=”OPEN”
natd_enable=”YES”
natd_interface=”nfe0”
natd_flags=”-f /etc/natd.conf”
Zunächst wird die Firewall aktiviert. Die og. Eintragung führt dazu, dass die in der Datei
/etc/rc.firewall spezifizierten Regeln verwendet werden, um Pakete zu filtern. Der zweite Eintrag
verwendet ein allgemeines Regelwerk, welches alle Pakete durchlässt.
Danach wird der NAT Daemon natd aktiviert. Alle ausgehenden Pakete zum Internet sollen mit NAT
gekapselt werden, also muss als Interface das zum Router zeigende angegeben werden (nfe0). Um
weitere Konfigurationen festzulegen wird eine Konfigurationsdatei in den Bootflags von natd
angegeben. In dieser können weiter NAT Regeln eingetragen werden wie beispielsweise für Port
Forwarding…
IPFIREWALL (IPFW)
IPFW ist das Standardpaket von FreeBSD. Es implementiert eine Simple Stateful Logic. Das Paket
besteht aus sieben verschiedenen Komponenten:
-
Kernel Firewall Filter Rule Processor
Packet Accounting
LoggingNAT
Dummynet Traffic Shaper
Bridge
Stealth
IPFW ist in der Basisinstallation von FreeBSD enthalten.
Um Logging persistent einzuschalten müssen über sysctl die folgenden Statements gesetzt werden:
sysctl net.inet.ip.fw.verbose=1
sysctl net.inet.ip.fw.verbose_limit=5
Danach wird die Firewall aktiviert.
firewall_type="open"
firewall_logging="YES" # gleiche Funktion wie sysctl verbose = 1
Mögliche Typen sind
Typ
open
client
simple
closed
UNKNOWN
filename
Erklärung
Allen Verkehr zulassen
Nur diesen Host Schützen
Ganzes Netz beschützen
Verkehr blockieren
Verhindert das Laden von FW Regeln
Pfad zur Regel Datei
Die genaue Konfiguration kann durch den Eintrag
firewall_script=“/etc/ipfw.rules“
geladen werden. Die Konfiguration selbst wird in die Rules File geschrieben. Das Tool ipfw kann diese
Einstellungen zwar ändern, jedoch sind die Änderungen nicht persistent.
Das Kommandot
ipfw –a list
Zeigt alle derzeitig aktiven Regeln an.
Jeder Dienst im Netzwerk ist über ein Protokoll und einen Port eindeutig spezifiziert. Dadurch
können Regeln eindeutig festgelegt werden.
Regel Syntax
Die Syntax lässt sich im Allgemeinen wie folgt beschreiben:
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL
CMD
Das Kommando lautet add zum Hinzufügen der Regel zur Firewall
RULENUMBER
Jede Regel erhält eine Nummer zwischen 0 und 65535.
Hierbei gilt „First Match Wins“, also die erste Regel die zutrifft wird angewendet. Das letzte
Statement ist immer
deny ip from any to any
Welche in Kraft tritt, wenn keine explizite Erlaubnis für ein Paket gegeben ist. Das Paket wird dann
ohne eine Benachrichtigung an den Sender zu schicken verworfen. Die Firewall ist damit eine
„inklusive“, enthält also eine Whitelist. Es alles verboten was nicht ausdrücklich zugelassen ist.
ACTION
Um Verkehr zuzulassen kann eines der folgenden Schlüsselwörter verwendet werden:
-
accept
add
pass
permit
Das verweigern einer Verbindung geschieht über die Schlüsselwörter
-
deny
drop
Wird
-
check-state
angegeben so wird die dynamische Regeltabelle überprüft. Diese Aktion verwendet kein Selektions
Satement.
LOGGING
Mögliche Werte sind
-
log
logamount
Wird logamount angegeben, so wird die Anzahl an Ereignissen geloggt, die in Amount angegeben
sind. Wird nur log angegeben so wird der Wert aus net.inet.ip.fw.verbose_limit verwendet.
Die Log Einträge werden an den System Log Daemon syslogd weitergeleitet. Dieser wird über die
Datei /etc/syslog.conf konfiguriert und loggt (laut deren Standard) alle Einträge in die Datei
/var/log/security.
SELECTION
Die Selektion setz sich aus den folgenden Teilen zusammen:
PROTOKOLL IP_MATCH PORT DIRECTION INTERFACE END
PROTOKOLL
Das Protokoll entstammt einem Wert aus der Datei /etc/protocols. Allgemein wird hier
tcp | udp | icmp
verwendet.
IP_MATCH
Als zutreffende IP Adresse für die Regel wird
from <src> to <dest>
verwendet. Src entspricht der Quelle (Source) dest der Destination, also dem Ziel das Pakets.Statt
einer IP Adresse kann hier auch das Schlüsselwort
any
angegeben werden, das sämtlichen Verkehr beinhaltet. Das Schlüsselwort
me
hingegen wertet alle zugewiesenen Adressen aller konfigurierten Interfaces aus.
Adressen werden in der Punktform angegeben: 192.168.0.1. Es kann auch die Subnetzmaske
nachgestellt werden: 172.21.255.2/24
PORT
Danach folgt die Portnummer des Verkehrs, sofern das angegebene Protokoll Portnummern
interpretiert (TCP / UDP). Anstatt numerischer Portnummern können auch die Einträge aus der Datei
/etc/services verwendet werden.
DIRECTION
Die Richtung des Verkehrs muss mit angegeben und wird über in oder out spezifiziert.
INTERFACE
Das Interface gibt an, an welchem Interface die Pakete geprüft werden. Dies ist meist vom Routing
abhängig. Die syntax lautet
via <interfacename>
END
Am Ende eines Statements muss die folgende Phrase auftauchen:
setup keep-state
Das Schlüsselwort Setup dient der Statusverbindung von TCP Paketen. Keep-state dient der Stateful
Eigenschaft der Firewall.
Wird schließlich das Schlüßelwort
limit
mit angegeben, so können nur eine bestimmte Anzahl an Verbindungen aufgebaut werden. Dieses
Schlüsselwort und keep-state schließen sich gegenseitig aus.
Scripting
Zum Scripten der Firewallregeln dient ein Shellscript. Dieses Script kann ausgeführt werden, ohne das
System neu zu starten und kann Variablen verwenden was die Tipparbeit erleichtert. Das Script lässt
sich in vier Bereiche gliedern:
-
Alles zulassen für bestimmte Teilnehmer
Ausgänge zulassen
Eingänge zulassen
Restlichen Verkehr loggen und aussperren
Normalerweise würde eine geordnete Liste nach diesem Schema genügen, jedoch ist in der aktuellen
Topologie ist NATD aktiv, der den DIVERT Befehl erfordert. Divert löst die Kapselung der Pakete auf
(in), so dass diese wieder an die Hosts hinter der Firewall geschickt werden können. Dazu
überspringen alle Pakete die zugelassen werden sollen die Verarbeitung der Regeln bis zur Regel 500.
#################################
# ipfw config script
## Run this script with:
# sh /etc/ipfw.rules
#################################
# flush all
ipfw -q -f flush
cmd="ipfw -q add"
pif="nfe0"
ks="keep-state"
skip="skipto 500"
# -q: Quiet qxecution
# outbound interface
# Allowed services using the following ports
# ports: ssh, smtp, time, whois, dns, http, https, pop, pops,
# imap, imaps, icq/aim
tcp_services="22,25,37,43,53,80,443,110,995,143,993,5190"
$cmd 002 allow all from any to any via rl0 # lan
$cmd 003 allow all from any to any via lo0 # loopback
$cmd 100 divert natd ip from any to any in via $pif
$cmd 101 check-state
# Special - needed to allow DNS requests to the router ()
$cmd 120 $skip udp from any to any 53 out via $pif $ks
$cmd 125 $skip tcp from any to any $tcp_services out via $pif setup $ks
$cmd 130 $skip icmp from any to any out via $pif $ks
$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918
$cmd 301 deny all from 172.16.0.0/12 to any in via $pif
$cmd 302 deny all from 10.0.0.0/8
to any in via $pif
$cmd 303 deny all from 127.0.0.0/8
to any in via $pif
$cmd 304 deny all from 0.0.0.0/8
to any in via $pif
$cmd 305 deny all from 169.254.0.0/16 to any in via $pif
# dhcp auto conf
$cmd 306 deny all from 192.0.2.0/24
to any in via $pif # RFC 3330 TESTNET
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif # sun cluster
$cmd 308 deny all from 224.0.0.0/3
to any in via $pif
# class d & e multicast
# allow inbound traffic
# eg. webserver, limited to 2 connections per client (contra DDoS)
## $cmd 400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
# Kill unauthorized traffic from/to internet
$cmd 450 deny log ip from any to any
$cmd 500 divert natd ip from any to any out via $pif
$cmd 510 allow ip from any to any
$cmd 999 deny log all from any to any
Erklärung des Scripts:
-
002: Der Lan Verkehr wird nicht angefasst
003: Loopback Verkehr wird nicht angefasst
100: NATD Auflösung für eingehenden Verkehr
101: Check State Überprüfung ob packet Antwort einer angeforderten „stateful“ Verbindung
ist
120 – 130: Zulassen des ausgehenden Verkehrs für verschiedene Dienste für Email und Web
300 – 308: Sperren von eingehendem Verkehr bestimmter Netzbereiche (private Netze und
Dienste)
450: Logging und sperren von nicht festgelegtem ausgehenden und eingehenden Verkehr mit
dem Internet
500: Einsprungspunkt für NAT Kapselung
999: Logging des restlichen Verkehrs
Die Konfiguration kann als Script ausgeführt werden. Wird diese in der Datei /etc/ipfw.rules
gespeichert, dann kann es mit dem Befehl
sh /etc/ipfw.rules
ausgeführt werden.
Das Script legt hohen Wert auf Sicherheit. Die RFC 1918 Bereiche für interne Netze sowie NETBIOS
Dienste werden blockiert. Aller Verkehr von außen wird abgeleht, sofern er nicht angefordert ist.
Vom internen Netz aus erlaubt sind Email und Http Verkehr sowie diverse andere Dienste, auch mit
SSL Verschlüsselung. Erlaubt sind:
-
22: SSH
25: smtp
-
37: time
43: whois
53: dns
80: http
443: https
110: pop
995: pop mit SSL
143: imap
993: imaps
5190: icq / aim
IPFILTER (IPF)
Ipfilter ist eine quelloffene Firewalllösung. Diese Firewall ist plattformunabhängig und verfügbar für
OpenBSD, NetBSD, FreeBSD sowie SunOS.
IPF verwendet das „ipf“ Tool zur Konfiguration. Logging geschieht über das tool „ipmon“, Statistiken
sind mit „ipstat“ abrufbar. NAT geschiet mittels „ipnat“.
Ursprünglich war IPF nicht stateful und implementierte das LAST MATCHING RULE Konzept. Eine
modernere Version von IPF deckt jedoch stateful logic ab.
Verwenden von ipf
Aktivieren über Eintragungen in /etc/rc.conf
ipfilter_enable="YES" # Start ipf firewall
ipfilter_rules="/etc/ipf.rules"
ipmon_enable="YES" # logging
ipmon_flags="-Ds" # -D: daemon, -s: to syslog
gateway_enable="YES"
Das NAT für das LAN wird nicht mehr über NATD sondern über ipnat gelöst:
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
Die aktiven Regeln können mit
ipstat –in
für eingehenden Verkehr oder
ipstat –on
für ausgehenden Verkehr abgerufen werden.
Regel Syntax
ACTION DIRECTION OPTIONS SELECTION PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM
TCP_FLAG STATEFUL
ACTION
Mögliche Werte:
-
block – Verkehr Blockieren
pass – Verkehr zulassen
DIRECTION
Mögliche Werte:
-
in
out
OPTIONS
Mögliche Werte:
-
-
log: Loggt die Verbindung
quick: Trick, um das LAST MATCHING RULE Verfahren zu umgehen.
Sind die Selektionsparameter der Regel zutreffend, wird diese Regel zuletzt geprüft. Dieser
Parameter muss angegeben werden.
on <interface>
SELECTION
PROTO
Proto wird benötigt um das zu prüfende Protokoll anzugeben. Proto wird dann gefolgt von
proto tcp/udp | tcp | udp | icmp
oder vom entsprechenden Protokoll aus der Datei /etc/protocols
SRC, DST
Danach folgt die Route des Pakets. Diese wird mit
from <source> to <dest>
angegeben. Die Adresse wird in der Punktnotation, die SN in Bitdarstellung angegeben, also
0.0.0.0/8 oder 192.168.5.6/24. Auch sind any und me verwendbar.
PORT
Als Port kann entweder ein Integerwert (Portnummer) oder der entsprechende Dienstname aus der
/etc/services verwendet werden.
Um Portbereiche festzulegen können Vergleichsoperatoren verwendet werden. Diese halten sich an
die Syntax der boolschen Logik aus C. Sie können auch über ein Literalesäquivalent angegeben
werden, also = als eq, kurz für equals.
Operatoren:
Operator
=, eq
!=, ne
<, lt
>, gt
<=, le
>=, ge
Beschreibung
Equals, Ist Gleich
Not Equals, Ist Nicht Gleich
Less Than, Kleiner als
Greater Than, Größer als
Less Equals, Ist Kleiner Gleich
Greater Equals, Ist Größer Gleich
TCP Flags
STATEFUL
Danach wird die Statefulness aktiviert.
Soll eine verbindung eine Sitzung aufbauen so erhält sie als Schlüsselwort
flags S keep state
Flags S hat die gleiche Wirkung wie „setup“ bei ipfw.
Eine komplette Regel hat nun die Syntax:
pass out quick on nfe0 proto tcp from any to any port = 80 flags S keep state
Diese Regel ermöglicht HTTP Verkehr nach aussen.
NAT mit IPF
Um NAT Funktionalität für das LAN zu aktivieren verwendet man in der /etc/rc.conf die folgenden
Einträge:
ipnat_enable=“YES“
ipnat_rules=“/etc/ipnat.rules“
Um die Regeldatei neu zu laden wird der folgende Befehl verwendet:
ipnat –CF –f /etc/ipnat.rules
Die aktuellen NAT Regeln werden mit
ipnat –l
angezeigt.
Die eigentliche Konfiguration der NAT Regeln läuft über ein SH Script.
IPF Firewall Script
# sh symbols
pif="nfe0"
fsk="flags S keep state"
router=”192.168.1.1”
# flags S needed to establish session,
# compares to "setup" statement on ipfw
# flush all and pass script to ipf.
# by doing this the script can be run by sh and use symbolic substitution
# this is helpful for the current developing purposes
# -Fa: flush all, -f: rules file to load
/sbin/ipf -Fa -f - << EOF
# don't touch inside lan traffic
pass out quick on rl0 all
pass in quick on rl0 all
# don't touch loopback
pass in quick on lo0 all
pass out quick on lo0 all
# dns
pass out quick on $pif proto tcp from any to $router port = 53 $fsk
pass out quick on $pif proto udp from any to $router port = 53 keep state
# allow used services behind
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
pass out quick on $pif proto
the
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
tcp
fw
from
from
from
from
from
from
from
from
from
from
from
from
any
any
any
any
any
any
any
any
any
any
any
any
to
to
to
to
to
to
to
to
to
to
to
to
any
any
any
any
any
any
any
any
any
any
any
any
port
port
port
port
port
port
port
port
port
port
port
port
=
=
=
=
=
=
=
=
=
=
=
=
22 $fsk # ssh
25 $fsk # smtp
37 $fsk # time
43 $fsk # whois
53 $fsk # dns
80 $fsk # http
443 $fsk # https
110 $fsk # pop
995 $fsk # pops
143 $fsk # imap
993 $fsk # imaps
5190 $fsk # icq
#ping
pass out quick on $pif proto icmp from any to any icmp-type 8 keep state
# SPECIAL: Allow FTP (for clients behind fw or pkg_add), sftp uses ssh port
pass out quick on $pif proto tcp from any to any port = 21 $fsk
# block and log
block out log first quick on $pif all
# block all inbound traffic
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
block in quick on $pif from
from non routable or reserved addr spaces
192.168.0.0/16 to any
# rfc 1918 priv ip
172.16.0.0/12 to any
10.0.0.0/8 to any
127.0.0.0/8 to any
# loopback
0.0.0.0/8 to any
169.254.0.0/16 to any
# DHCP auto conf
192.0.2.0/24 to any
# doc net
204.152.64.0/23 to any
# sun cluster
224.0.0.0/3 to any
# class D&E MC
# dont log fragmented, late arriving packets
block in quick on $pif all with frags
block in quick on $pif proto tcp all with short
# block source routed packtes (?!)
block in quick on $pif all with opt lsrr
block in quick on $pif all with opt ssrr
# Kill and log Fingerprint attempts
# fingeprint determines the os and open ports
# (usually done with nmap by hackers)
block in log first quick on $pif proto tcp from any to any flags FUP
block in quick on $pif all with ipopts
# block public pings
block in quick on $pif proto icmp all icmp-type 8
# block ident
block in quick on $pif proto tcp from any to any port = 113
# netbios, hosts2name srv req
block in log first quick on $pif
block in log first quick on $pif
block in log first quick on $pif
block in log first quick on $pif
proto
proto
proto
proto
tcp/udp
tcp/udp
tcp/udp
tcp/udp
from
from
from
from
any
any
any
any
to
to
to
to
any
any
any
any
port
port
port
port
=
=
=
=
137
138
139
81
# # if webserver available allow inbound http traffic
# pass in quick on $pif proto tcp from any to any port = 80 $fsk
# blocks the rest making the script inclusive
block in log first quick on $pif all
# eof is required for this script to be passed as a shell call parameter
EOF
Das Script erlaubt allen nötigen Diensten den Zugriff ins Internet und blockt Nicht-Routbare Bereiche
und potentielle Attacken aus dem Internet. Der Lan - Verkehr wird nicht beeinträchtigt.
IPNAT Network Address Translation Script
Die Regeldatei für IPNAT weist eine Besonderheit auf. Unter normalen Umständen ist das Betreiben
von FTP Clients hinter einer NAT Firewall nur schwer möglich. Das liegt daran dass NAT in die
Adressen eingreift die sich für FTP dann auf falsche Ports beziehen können. IPNAT bietet dafür eine
Proxy Konfiguration:
map nfe0 192.168.2.0/24 -> 0/32 proxy port 21 ftp/tcp
map nfe0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
map nfe0 192.168.2.0/24 -> 0/32
Die erste und zweite Zeile dienen als FTP Proxy. Dieser ist transparent für den Client hinter der
Firewall. Ist eine FTP Funktion nicht erwünscht, so können die ersten beiden Zeilen weggelassen
werden. Die letzte Zeile ist wichtig, sofern NAT erwünscht oder erforderlich ist; Sie verwaltet
allgemeines NAT und mappt allen Verkehr aus dem x.2.0 er Netz auf die Firewall.
Packet Filter (PF)
Im July 2003 wurde die OpenBSD Software „Packet Filter“, im Folgenden kurz PF genannt auf
FreeBSD portiert. Sie stellt das dritte Firewall Packet dar, das unter FreeBSD verfügbar ist.
PF wurde entwickelt als OpenBSD, welches als Standard IPFilter enthielt damit Lizenzprobleme
bekam. Als Ersatz wurde PF entwickelt, daher sind sich die beiden Programme sehr ähnlich,
besonders bei der Erstellung der Regeln.
Verwendung
Auch PF wird über Einträge in der /etc/rc.conf beim Booten als Dienst gestartet.
pf_enable="YES"
pf_rules="/etc/pf.rules"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Das Tool „pfctl“ erlaubt weitere Einstellungen von PF.
Um die Regeldatei neu zu laden ohne das System neu zu starten kann das folgende Kommando
verwendet werden:
pfctl –F all –f /etc/pf.rules
Das Kommando löschst zunächst alle vorhandenen Regeln und läd sie dann aus der Date /etc/pf.rules
neu. Um eine Regeldatei lediglich zu parsen um sie beispielsweise auf Fehler zu prüfen kann der
folgende befehl verwendet werden:
pfctl –vnf /etc/pf.rules
Regel Syntax
action [direction] [log] [quick] [on interface] [af] [proto protocol] \ [from src_addr [port sr_port]] [to
dst_addr [port dst_port]] \ [flags tcp_flags] [state]
Die Syntax entsprich weitestgehend der Syntax von IPFilter, daher wird an dieser Stelle lediglich das
fertige PF Script der Firewall vorgestellt. Auch IPF verwendet LAST MATCH WINS, sofern nicht das
QUICK Schlüsselwort angegeben wird. QUICK dreht (wie auch bei IPF) das Prinzip zu FIRST MATCH
WINS um.Die folgenden Regeln sind daher mit dem Schlüsselwort Quick versehen um weiterhin die
Verwendung des FIRST RULE WINS Paradigmas zu implemtieren, welches auch für die anderen
Firewalllösungen verwendet wurde.
ext_if="nfe0"
int_if="rl0"
localnet=$int_if:network
tcp_services="{ ftp-data, ftp, ssh, smtp, domain, auth, pop3, pop3s, imap,
imaps, http, https, 5190 }"
udp_services="{ domain, ntp }"
# Run this as a shell script with
# # sh /etc/pf.rules
# pf rule files (should be named pf.conf, i know) support symbolic
substitution
# and macros but i like to make shell comments and stuff. . .
# Using the quick keyword the interpretation of the rules turns the concept
to
# first rule wins.
# Flush and reload packet filter config
pfctl -F all -f - << EOF
set loginterface $ext_if
# do nat mapping
nat on $ext_if from $localnet to any -> ($ext_if)
# don't touch lan and loopback traffic
pass out quick on $int_if all
pass in quick on $int_if all
pass in quick on lo0 all
pass out quick on lo0 all
# allow dns requests
pass out quick on $ext_if proto tcp from any to 192.168.1.1 port = 53 flags
S/SA keep state
pass out quick on $ext_if proto udp from any to 192.168.1.1 port = 53 keep
state
# allow tcp service, web, mail, im, etc.
pass out quick on $ext_if proto tcp from any to any port $tcp_services
flags S/SA keep state
# allow outbound pings
pass out quick on $ext_if proto icmp from any to any
# block & log the rest (out)
block out log(all) quick on $ext_if all
# block inbound traffic from reserved locations
block in quick on $ext_if from 192.168.0.0/16 to any
block in quick on $ext_if from 172.16.0.0/12 to any
block in quick on $ext_if from 10.0.0.0/8 to any
block in quick on $ext_if from 0.0.0.0/8 to any
block in quick on $ext_if from 169.254.0.0/16 to any # dhcp auto
block in quick on $ext_if from 192.0.2.0/24 to any
# doc net
block in quick on $ext_if from 204.152.64.0/23 to any
# sun cluster
block in quick on $ext_if from 224.0.0.0/3 to any
# cls D&E mc
#ping
block in quick on $ext_if proto icmp from any to 192.168.2.0/24
#netbios
block
= 137
block
= 138
block
= 139
block
= 81
in log (all) quick on $ext_if proto { tcp, udp } from any to any port
in log (all) quick on $ext_if proto { tcp, udp } from any to any port
in log (all) quick on $ext_if proto { tcp, udp } from any to any port
in log (all) quick on $ext_if proto { tcp, udp } from any to any port
# allow ws traffic if available
pass in quick on $ext_if proto tcp from any to any port = 80 flags S/SA
keep state
#block and lock anything else
block in log(all) quick on $ext_if
#end of file for shell script
EOF
Das Script entspricht den anderen. Es lässt benötigte Dienste zu, blockiert mögliche Angreifer und
nicht routbare Bereiche. Interessant ist das Logging, sowie die NAT Konfiguration.
set loginterface $ext_if
# do nat mapping
nat on $ext_if from $localnet to any -> ($ext_if)
# . . .
block in log(all) quick on $ext_if
Hier unterscheidet sich die Notation von der des ipf.
IPTABLES
Unter Linux werden Firewalls mit der Software Netfilter aufgesetzt. Das Konfigurationsprogramm für
Netfilter nennt sich IPTABLES. Als Distribution wird Debian verwendet.
Zunächst wird die Datei /etc/sysctl.conf angepasst. Diese entspricht in etwa der /etc/rc.conf unter
FreeBSD. Darin befinden sich auskommentiert die beiden folgenden Einträge
net.ipv4.conf.default.forwarding=1
net.ipv6.conf.default.forwarding=1
Diese werden durch entfernen der Auskommentierung aktiviert. Sind die Einträge nicht vorhanden
können sie per Hand hinzugefügt werden. Damit fungiert Debian als Gateway. Diese Einstellung wird
beim Systemstart verwendet. Zur Laufzeit kann die Variable über das Tool sysctl gesetzt werden:
sysctl net.ipv4.conf.default.forwarding=1
Script
[Script Here]
Ausblick
Dieses Dokument deckt nicht alle Komponenten ab, die eine gute Firewall ausmachen. Es ist zu
empfehlen, den folgenden Bereichen Aufmerksamkeit zu widmen, um die gesamt Mächtigkeit einer
Firewall ausnutzen zu können.
Traffic Shaping
Um die Firewall sinnvoll einzusetzen können zusätzlich QoS Dienste aktiviert werden. Diese dienen
beispielsweise dem Traffic Shaping, also dem garantieren von Bandbreitenkontingenten für
bestimmte Dienste. IP Telefonie könnte beispielsweise regulärem http Verkehr vorgezogen werden.
Es gibt mehrere Pakete die dies ermöglichen. Direkt verbandelt mit PF ist Alternative Queing (altq),
mit ipf/ipfw eignet sich „dummynet“.
Bridging
Wird die Firewall als Bridge implementiert, so ist sie im Netzwerk nicht sichtbar und dadurch
schwerer anzugreifen. In der Regel besitzt sie dann keine IPs. Mit OpenBSD ist sie trotzdem noch in
der Lage Pakete zu filtern. Ohne die Erreichbarkeit aus dem Netzwerk muss die FW jedoch direkt
über die Konsole konfiguriert werden, weil keine Remote Verbindung über ssh oder telnet zu ihr
aufgebaut werden kann.
Kernel Compilierung
Um nicht zu tief in die eigentliche Unix Materie einzusteigen wurde in dieser Doku der Bezug zum
Kernel Compiling weggelassen. Laufen die Firewalls als Module, so ist deren
Anhang
Quellen
FreeBSD Handbook
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls.html
Diverse Threads aus BSDForen.de
http://www.bsdforen.de/
“Firewalling with OpenBSD's PF packet filter” von Peter Hansteen
http://home.nuug.no/~peter/pf/en/long-firewall.html
http://home.nuug.no/~peter/pf/
“TCP/IP Primer” von Daryl Banttari
http://www.ipprimer.com/overview.cfm
IPTables Tutorial von Oskar Andreasson
http://iptables-tutorial.frozentux.net/iptables-tutorial.html
Andrew S. Tannenbaum – Computernetzwerke, 4. Auflage, ISBN 3-8273-7046-9
Verwendete Programme
Microsoft Word
FreeBSD: IPFW, IPF, PF, ee
Debian: IPTABLES
VMWare Workstation
Downloads
Alle Downloads verfügbar unter
http://cessor.de/misc/fw/
Herunterladen