nbkr
Guru
Hallo,
ein kleines Howto wie man einen hochverfügbaren Firewallcluster mit OpenBSD (ja ich weiß, ist kein Linux - aber man darf ja mal über den Tellerrand schauen ;-) ), pf und pfsync aufsetzt. Das Originaldokument findet sich wieder unter:
http://www.benjaminfleckenstein.de/de/anl_pfcluster.html
ein kleines Howto wie man einen hochverfügbaren Firewallcluster mit OpenBSD (ja ich weiß, ist kein Linux - aber man darf ja mal über den Tellerrand schauen ;-) ), pf und pfsync aufsetzt. Das Originaldokument findet sich wieder unter:
http://www.benjaminfleckenstein.de/de/anl_pfcluster.html
Code:
# vim: set textwidth=80 syn=conf:
#
## Titel:
# Firewallcluster mit OpenBSD, pf und pf_sync
#
## Autor:
# Benjamin Fleckenstein, http://www.benjaminfleckenstein.de/
#
## Version
# 1.0
#
## Datum
# 2007-01-07
#
## Vorüberlegungen:
# Ziel ist es einen Firewallcluster auf Basis von OpenBSD, pf
# und pf_sync zu erstellen. Grund hierfür ist die Tatsache das eine solche
# Lösung vermutlich in der Lage ist mit kommerziellen Firewalls von Cisco und
# bezüglich der Basisfunktionalität auch mit anderen Firewalls zu konkurieren.
# Da alle Komponenten Open Source und kostenlos sind ist diese Lösung bezüglich
# Herstellerunabhängigkeit zu bevorzugen.
#
# Die Installation erfolgt über VMWare Workstation da diese einfacher zu
# Handhaben ist als echte Hardware herumschleppen zu müssen. Der Host ist Ubuntu
# 6.10
#
# Der Netzwerkaufbau ist in der Datei netzwerdesign.dia gespeichert. Alle
# dargestellten Maschinen sind virtuell und laufen auf dem gleichen Ubuntu 6.10
# Host.
#
# Im ersten Schritt machen die Firewalls ein Masquerading. D.h. sie verbergen
# das dahinter liegende virtuelle Netzwerk. In einem zweiten Schritt lässt sich
# ein OSPF Daemon installieren, welcher sich im dem nächsten Router unterhält
# um das virtuelle Netzwerk allgemein bekannt zu machen.
#
## Voraussetzungen:
# Funktionierendes VMware
# Grundwissen zum Thema Firewalling
#
## Quellen:
# [1] http://www.openbsd.org/faq/faq4.html
# [2] http://www.openbsd.org/cgi-bin/man.cgi?query=disklabel&sektion=8
# [3] http://www.openbsd.org/ftp.html
# [4] http://www.openbsd.org/faq/faq6.html
# [5] http://archives.neohapsis.com/archives/openbsd/2001-03/0410.html
# [6] http://wiki.debianforum.de/QemuVirtuelleMaschine
# [7] http://www.openbsd.org/cgi-bin/man.cgi?query=carp
# [8] http://www.countersiege.com/doc/pfsync-carp/
# [9] http://www.webservertalk.com/archive247-2005-3-957953.html
# [10] http://www.openbsd.org/cgi-bin/man.cgi?query=hostname.if
# [11] http://www.openbsd.org/faq/pf/carp.html#forcefail
# [12] http://www.warp9.de/pub/pfcluster.pdf
# [13] http://www.openbsd.org/faq/pf/de/carp.html#pfsyncconfig
#
## Weitere Dokumente:
# [w1] Netzplan http://www.benjaminfleckenstein.de/images/anleitungen/pfcluster/pfcluster.png
#
## Vereinbarungen:
# $MEDIA = Speicherort der CD Images
# $FIREWALL1 = Name der ersten Firewall im Cluster
# $FIREWALL2 = Name der zweiten Firewall im Cluster
# $DOMAIN = Die lokale Domain falls vorhanden
# $DNS = Die IP Adresse des DNS Servers
# $GATEWAY = IP Adresse des Primärgateways im Netzwerk
# $PASS = Rootpasswort der neuen Firewallmaschinen
#
## Lizenz dieser Anleitung:
# http://creativecommons.org/licenses/by/2.0/de/deed.de
#
## Anmerkung:
#
#####################################################################################
# Los gehts - zuerst das Bootimage von openbsd.org herunterladen: Von diesem
# Image kann man booten, allerdings enthält es nicht die eigentliche Software.
# Diese wird per FTP nachinstalliert. Alternativ kann man sich auch die OpenBSD
# Cds bestellen. Kostenpunkt 50 Euro - die dem OpenBSD Projekt zugute kommen.
cd $MEDIA
wget ftp://openbsd.ftp.fu-berlin.de/pub/OpenBSD/4.0/i386/cd40.iso
# Nun braucht man natürlich ein neues VMWare Image. Alternativ kann man
# natürlich auch mit echter Hardware arbeiten, aber dafür fehlt mir einfach der
# Platz im Haus ;-). Folgende Daten sollten für die VMWare als auch für die
# echte Hardware gelten.
#
# 2 GB Festplattenplatz
# CD Laufwerk (für das Installationsimage)
# 64 MB Arbeitsspeicher
# 3 Netzwerkkarten
#
# Netzwerkkarte 0 wird stellt das Outsideinterface da und wird unter VMWare im
# Bridged Modus (vmnet0) betrieben. Es ist als per Netzwerkbrücke an das
# Netzwerkinterface des Hostsystems angeschlossen und verhält sich im Netz wie
# eine echte Maschine.
#
# Das zweite Interface ist das Syncinterface. Über dieses Netz tauschen die
# Firewalls Verbindungsinformationen aus. Diese Netzwerkkarte ist rein virtuell,
# wird in VMware also als "Custom" Netzwerk eingerichtet (z.B. vmnet2).
#
# Das dritte Interface ist das Insideinterface. Es ist an das virtuelle
# Netzwerk angeschlossen. Auch hierfür bracht man ein "Custom" Netzwerk
# (z.B. vmnet3)
#
# Da OpenBSD die Netzwerkinterfaces in den Promiscuous Mode versetzt muss auch
# VMWare dies können. Hierfür müssen die Zugriffsrechte unter /dev/vmnet* auf
# 0666 gestellt sein, so dass auch VMWare darauf zugreifen kann.
# Sobald die Maschine gestartet ist liefert OpenBSD den Prompt
boot> # Enter drücken
(I)nstall, (U)pgrade, (S)shell? # i drücken
Terminal Type [vt220] # Enter drücken
kdb(8) mappling? ('L' for list) # de eingeben, Enter drücken
Proceed with install [no] # yes eingeben, Enter drücken
# Jetzt kommt man zur Einteilung der Festplatte
Which one is the root disk? (or 'done') [wd0] # Enter drücken
Do you want to use *all* of wd0 for OpenBSD? [no] # yes eigengeben, Enter drücken
# Nun muss man die Platte wd0 in Slices unterteilen. Slices sind im Prinzip
# Partitionen in Partionen. D.h. man unterteilt eine Partition nochmals in
# einzelne Bereiche. Dafür kommt das Programm disklabel zu Einsatz.
# Die Bedienungsanleitung von disklabel findet sich unter: [2]
#
# Wir wollen die einzelnen Bereich folgendermaßen aufteilen:
# wd0a: / (root) - 150MB
# wd0b: (swap) - 300MB
# wd0d: /tmp - 120MB
# wd0e: /var - 400MB
# wd0g: /usr - 930MB
# wd0h: /home - 100MB
#
# Diese Werte entsprechen einigermaßen den Vorgaben von [1] mit dem Unterschied,
# das für /home wesentlich weniger Platz und für /var wesentlich mehr Platz
# berücksichtigt wurde. Grund hierfür ist die Tatsache das es auf einer Firewall
# praktisch keine Benutzer gibt die Platz bräuchten, dafür aber durchaus einiges
# an Logdaten und /var anfallen kann.
#
# Nun muss man diese Vorgaben disklabel mitteilen
-> Eingeben: p <enter>. Das zeigt die Partitionstabelle an.
#
# Gegenwärtig gibt es nur a und c. c stellt die gesamte Platte dar und a eine
# automatisch angelegte root Partition. c lassen wir wie es ist aber a wollen
# wir löschen.
-> Eingeben: d a <enter>. Damit ist a gelöscht
# Nun werden neue Slices angelegt.
-> Eingeben: a a <enter>
offset [63] # Enter drücken
size [4193217] # 150m eingeben, Enter drücken
FS type: [4.2BSD] # Enter drücken
mount point: [none] # / eingeben, Enter drücken
# Damit wäre / erstellt. Kommen wir zu den nächsten Slices
-> Eingeben: a b <enter>
offset [307440] # Enter drücken
size [3885840] # 300m eingeben, Enter drücken
FS type: [swap] # Enter drücken
-> Eingeben: a d <enter>
offset [922320] # Enter drücken
size [3270960] # 120m eingeben, Enter drücken
FS type: [4.2BSD] # Enter drücken
mount point: [none] # /tmp eingeben, Enter drücken
-> Eingeben: a e <enter>
offset [1168272] # Enter drücken
size [3025008] # 400m eingeben, Enter drücken
FS type: [4.2BSD] # Enter drücken
mount point: [none] # /var eingeben, Enter drücken
-> Eingeben: a g <enter>
offset [1987776] # Enter drücken
size [2205504] # 930m eingeben, Enter drücken
FS type: [4.2BSD] # Enter drücken
mount point: [none] # /usr eingeben, Enter drücken
-> Eingeben: a h <enter>
offset [3892896] # Enter drücken
size [300384] # 100m eingeben, Enter drücken
FS type: [4.2BSD] # Enter drücken
mount point: [none] # /home eingeben, Enter drücken
# Damit wäre die Erstellung der Slices fertig. Jetzt muss das ganze noch
# gesichert werden.
-> Eingeben: q <enter>
Write new label?: [y] # Enter drücken
# Anschließend muss man nochmal alle Mountpoints bestätigen.
Mount point for wd0d (size=122976k)? (or 'none' or 'done') [/tmp] # Enter drücken
Mount point for wd0e (size=409752k)? (or 'none' or 'done') [/var] # Enter drücken
Mount point for wd0g (size=952560k)? (or 'none' or 'done') [/usr] # Enter drücken
Mount point for wd0h (size=102312k)? (or 'none' or 'done') [/home] # Enter drücken
Mount point for wd0d (size=122976k)? (or 'none' or 'done') [/tmp] # done eingeben, Enter drücken
# Jetzt folgt noch eine Sicherheitsabfrage
Are you really sure that you're ready to proceed? [no] # yes eingeben, Enter drücken
# Nun kommt man zum Hostname in unserem Fall $FIREWALL1 (bei mir also "firewall1")
System hostname? (short form, e.g. 'foo') # $FIREWALL1 eingeben, Enter drücken
# Der nächste Schritt ist die Konfiguration des Netzwerks
Configure the network? [yes] # Enter drücken
Available interfaces are: pcn0 pcn1 pcn2.
Which one do you wish to initialize (or 'done') [pcn0]
# pcn0 ist das outside interface da dies das erste ist welches beim Aufruf von
# qemu angegeben wurde. Entsprechend sind pcn1 das Sync Interface und pcn2 das
# inside Interface. Wir konfigurieren als zuerst das Outside Interface.
# Entsprechend muss man bei obiger Frage einfach Enter drücken. Die Daten des
# Interfaces finden sich in beigefügtem Netzplan [w1]
Symbolic (host) name for pcn0? [firewall1] # Enter drücken
The media options of pcn0 are currently
media: Ethernet autoselect (autoselect)
Do you want to change the Media options? [no] # Enter drücken
IPv4 address for pcn0? (or 'none' or 'dhcp') # 192.168.2.21 eingeben, Enter drücken
Netmask? [255.255.255.0] # 255.255.255.128 eingeben, Enter drücken
IPv6 address for pcn0? (or 'rtsol' or 'none') [none] # Enter drücken
# Jetzt müssen noch die anderen Netzwerkkarten konfiguriert werden. Das
# Sync Interface ist als nächstes dran.
Available interfaces are: pcn1 pcn2.
Which one do you wish to initialize (or 'done') [pcn1] # Enter drücken
Symbolic (host) name for pcn0? [firewall1] # Enter drücken
The media options of pcn0 are currently
media: Ethernet autoselect (autoselect)
Do you want to change the Media options? [no] # Enter drücken
IPv4 address for pcn0? (or 'none' or 'dhcp') # 172.16.0.1 eingeben, Enter drücken
Netmask? [255.255.255.0] # 255.255.255.252 eingeben, Enter drücken
IPv6 address for pcn0? (or 'rtsol' or 'none') [none] # Enter drücken
# Als letztes das Inside interface
Available interfaces are: pcn2.
Which one do you wish to initialize (or 'done') [pcn2] # Enter drücken
Symbolic (host) name for pcn0? [firewall1] # Enter drücken
The media options of pcn0 are currently
media: Ethernet autoselect (autoselect)
Do you want to change the Media options? [no] # Enter drücken
IPv4 address for pcn0? (or 'none' or 'dhcp') # 10.1.1.2 eingeben, Enter drücken
Netmask? [255.255.255.0] # Enter drücken
IPv6 address for pcn0? (or 'rtsol' or 'none') [none] # Enter drücken
# Jetzt folgt die DNS Konfiguration
DNS domain name? (e.g. 'bar.com') [my.domain] # $DOMAIN eingeben, Enter drücken
DNS nameserver? (IP address of 'none') [none] # $DNS eingeben, Enter drücken
Use the nameserver now? [yes] # Enter drücken
Default IPv4 route? (IPv4 address, 'dhcp' or 'none') # $GATEWAY eingeben, Enter drücken
Edit hosts with ed? [no] # Enter drücken
Do you want to do any manual network configuration? [no] # Enter drücken
# Jetzt geht es an das Passwort für den Root account
Password for root account? (will not echo) # $PASS eingeben, Enter drücken
Password for root account? (again) # $PASS eingeben, Enter drücken
# Soweit so gut. Jetzt nur noch die Installationsquelle angeben und es kann
# losgehen
Location of sets? (cd disk ftp http or 'done') [cd] # ftp eingeben, Enter drücken
# Man wird nach einem Proxy gefragt. Da ich keinen Verwende kann ich einfach
# Enter drücken. Falls ein Proxy im Einsatz ist muss man dessen Daten hier
# eingeben.
HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] # Enter drücken
Display the list of known ftp servers? [no] # Enter drücken
# Nun muss man den zu verwendenden FTP Server angeben. Eine Liste von
# Installationsservern findet sich unter [3]. Man sollte einen Server verwenden
# der Räumlich am nächsten zu einem ist. Ich verwenden einen Mirror in Nürnberg.
Server? (IP address, hostname, or 'done') # Server eingeben, Enter drücken
# Ich gebe also ein
# mirror.roothell.org
Does the server support passive mode ftp? [yes] # Enter drücken - die meisten Server
# können passiv FTP.
Server directory? [pub/OpenBSD/4.0/i386] # Hier kann ich Enter drücken,
# da die Daten bei dem von mir
# benutzen Server wirklich unter
# der Vorgabe URL liegen. Falls
# dies bei anderen Server anders
# ist muss man dies natürlich
# anpassen.
Login? [anonymous] # Enter drücken. Alle öffentlichen Installationsserver bieten
# anonymous login.
# Jetzt wird einem die Liste der verfügbaren Pakete angezeigt. Standardmäßig
# werden alle Pakte bis auf bsd.mp und die x-Pakete installiert. Ich möchte aber
# auch das game40.tgz Paket nicht haben, da Spiele auf einer Firewall nichts
# verloren haben und der Plattenplatz knapp ist. Deshalb wähle ich es ab.
-> Eingeben -game40.tgz <enter>
-> Eingeben done <enter>
Ready to install sets? [yes] # Enter drücken
# Jetzt werden die Pakete geholt. Anschließend wird man nochmal nach einer
# Setlocation gefragt
Location of sets? (cd disk ftp http or 'done') [cd] # done eingeben, Enter drücken
# Anschließend wird man noch gefragt ob man sshd standardmäßig starten will.
# Da die Administration der Firewall später per SSH erfolgen soll aktzeptieren
# wir die Standardvorgabe "yes"
Start sshd(8) by default? [yes] # Enter drücken
# Auch den NTP wollen wir standardmäßig starten damit die Zeiten in den Logs
# immer korrekt sind.
Start ntpd(8) by default? [no] # yes eingeben, Enter drücken
# Den Xserver wollen wir aber nicht starten
Do you expect to run the X Window System? [no] # Enter drücken
# Die Umleitung der Ausgabe auf die Konsole wäre bei einer echten
# Firewall die keinen Tastatur/Monitor Anschluss durchaus sinnvoll. Bei
# unsere virtuellen Firewall macht das aber keinen Sinn.
Change the default console to com0? [no] # Enter drücken
# Nun kommen wir zur Einstellung der Zeitzone
What timezone are you in ('?' for list) [Canada/Mountain] # Europe eingeben, Enter drücken
What sub-timezone of 'Europe/' are you in? ('?' for list) # Berin eingeben, Enter drücken
# Nun läuft die eigentlich Installation welche recht flott fertig ist.
# Wir müssen nun die Maschine herunterfahren, die CD aus dem virtuellen Laufwerk
# nehmen und neu starten
-> Eingeben: halt <enter>
# Die CD nun entfernen und die Maschine neu starten.
# Die Maschine sollte jetzt von alleine hochfahren und noch letzte Aufgaben
# erledigen wie z.B. das erstellen von SSH Schlüsseln. Gerade dieses
# Schlüsselerstellen kann ein wenig dauern.
# Sobald der Loginprompt angezeigt wird kann man sich auch via SSH an der
# Maschine anmelden. Dazu eine Konsole (z.B. gnome-terminal) öffnen und sich per
# SSH auf die Maschine verbinden.
ssh -l root 192.168.2.21
# Nach diesem ersten Test muss nun die zweite Firewall installiert werden.
# Da ich VMWare verwende kann ich mir die Sache etwas einfacher machen. Ich
# klone einfach die erste Firewall. Wenn man mit echter Hardware arbeitet muss
# man nun das eben gezeigt nochmal auf der zweiten Firewall wiederholen.
# Natürlich muss man die IP Adressen gemäß [w1] verwenden.
# Nun starten wir die zweite Firewall.
# und loggen uns ein sobald die Maschine läuft
ssh -l root 192.168.2.21
# Zuerst passen wir den Hostnamen an.
vi /etc/myname
-> $FIREWALL1.$DOMAIN ersetzen durch $FIREWALL2.$DOMAIN
# Nun passen wir die IP Adressen der Netzwerkkarten an
vi /etc/hostname.pcn0
-> 192.168.2.21 durch 192.168.2.22 ersetzen.
vi /etc/hostname.pcn1
-> 172.16.0.1 durch 172.16.0.2 ersetzen.
vi /etc/hostname.pcn2
-> 10.1.1.2 durch 10.2.2.3 ersetzen.
# Nun müssen noch die ssh-keys neu angelegt werden damit es zu keinen Problemen
# kommt wenn zwei Firewalls laufen.
-> Eingeben: ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key
Overwrite (y/n)? # y eingeben, Enter drücken
Enter passphrase (empty for no passphrase): # Enter drücken
Enter same passphrase again: # Enter drücken
-> Eingeben: ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
Overwrite (y/n)? # y eingeben, Enter drücken
Enter passphrase (empty for no passphrase): # Enter drücken
Enter same passphrase again: # Enter drücken
-> Eingeben: ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
Overwrite (y/n)? # y eingeben, Enter drücken
Enter passphrase (empty for no passphrase): # Enter drücken
Enter same passphrase again: # Enter drücken
# Nun sollte man die Maschine einmal neu starten. Theoretsich könnte man auch
# einfach ein "sh /etc/netstart" aber ein Neustart stellt sicher das wirklich
# alles was angepasst werden muss angepasst wurde.
halt
# Jetzt kann man Firewall2 wieder starten. Nun sollte die Firwall2 unter der IP
# Adresse 192.168.2.22 erreichbar sein.
ping 192.168.2.22
# Jetzt kann man auch Firewall1 starten.
# Nun sollte man testen ob sich die zwei Firewalls untereinander sehen können.
# Dazu verbindet man sich mit Firewall1 und pingt von dort alle Interfaces von
# Firewall2 an.
ssh -l root 192.168.2.21
-> ping 192.168.2.22
-> ping 172.16.0.2
-> ping 10.1.1.3
# Da die beiden Maschinen nun laufen ist der nächste Schritt das Routing auf den
# Maschinen zu aktivieren und das Failover zu konfigurieren. Wir werden dies
# zuerst auf Firewall1 machen, und anschließend auf Firewall2. Die Verbindung
# zu Firewall1 per SSH steht ja schon.
# Zuerst aktivieren wir das Routing
vi /etc/sysctl.conf
-> Das Routezeichen vor der Zeile "net.inet.ip.forwarding=1" entfernen.
# Damit das Routing nicht nur nach einem Reboot funktioniert, sondern sofort
# muss man noch folgenden Befehl eingeben.
sysctl net.inet.ip.forwarding=1
# Nun muss man carp configurieren. Carp ist für das Failover der Firewalls
# zuständig. Es werden ständig Pakete hin und her geschickt um zu sehen ob die
# Primärmaschine des Clusters noch aktiv ist. Sollte dies nicht der Fall sein
# übernimmt die Sekundärmaschine. Um Carp zu aktivieren legt man einfach ein
# spezielles Carp Interface an.
#
# Es verhält sich im Prinzip wie ein normales Interface. Die einzigen
# zusätzlichen Informationen die man liefern muss ist ein Passwort und die VHID.
# Das Passwort dient der Authentifzierung der Clusterknoten untereinander. Damit
# werden die Datenpakete die der Zustandsüberwachung dienen verschlüsselt. Die
# VHID ist eine ID die pro verbundenen Netzwerkkarte eindeutig ist. In diesem
# Beispiel hätte also die beiden Outside Karten eine eindeutige VHID und die
# beiden Inside Karten ebenfalls.
#
# Wie jedes Interface bekommt auch dieses Carp Interface eine IP Adresse. Diese
# IP Adresse muss man später auch den Clients als Gatewayadresse mitteilen. Gibt
# man statt dessen nämlich die IP Adresse einer bestimmten Firewall an und diese
# fällt aus, funktioniert die Verbindung der Clients nicht mehr.
#
# Da eine Firewall zwei Interface hat die Hochverfügbar sein müssen, nämlich das
# Inside Interface, als auch das Outside Interface, muss man auch zwei Carp
# Interfaces anlegen. Eines für Outside, eines für Inside.
#
# Legen wir also zuerst das Carp Interface für Outside auf Firewall1 an.
ifconfig create carp0
ifconfig carp0 vhid 1 pass PassWorD 192.168.2.20 netmask 255.255.255.128
# Nun müssen wir die Interfacekonfiguration noch speichern, damit das Interface
# auch bei nächsten Booten noch vorhanden ist.
vi /etc/hostname.carp0
-> Einfügen "inet 192.168.2.20 255.255.255.128 192.168.2.127 vhid 1 pass PassWorD"
-> Natürlich ohne die Anführungszeichen.
# Nun folgt die Konfiguration des Inside Carp Interfaces
ifconfig create carp1
ifconfig carp1 vhid 2 pass PassWorD 10.1.1.1 netmask 255.255.255.0
# Nun müssen wir die Interfacekonfiguration noch speichern, damit das Interface
# auch bei nächsten Booten noch vorhanden ist.
vi /etc/hostname.carp1
-> Einfügen "inet 10.1.1.1 255.255.255.0 10.1.1.255 vhid 2 pass PassWorD"
-> Natürlich ohne die Anführungszeichen.
# Der nächste Schritt besteht nun im Konfigurieren von pfsync. pfsync ist ein
# Programm welchen den Status des OpenBSD eigenen Paketfilters zwischen zwei
# Maschinen synchronisiert.
ifconfig create pfsync0
ifconfig pfsync0 syncdev pcn1
# Jetzt noch das ganze dauerhaft im System verankern.
vi /etc/hostname.pfsync0
-> Einfügen:
-> up syncdev pcn1
# Abschließend müssen wir nun noch die Firewallregeln schreiben und die Firewall
# aktivieren. Wir werden nur ein ganz einfaches Regelwerk implementieren. Die
# Firewall lässt keinerlei Zugriffe auf sich selbst zu, erlaubt neben den PFSync
# und den Carp Paketen nur DNS und HTTP vom Clientaus.
vi /etc/pf.conf
-> Alles löschen und nachfolgendes einfügen
#Standardpolicy (rein darf nix, raus darf alles)
block in all
pass out all keep state
#Loopback ignorieren
set skip on lo0
#Pfsync zulassen
pass in quick on { pcn1 } proto pfsync keep state (no-sync)
#Carp zulassen
pass in quick on { pcn0 pcn2 } proto carp keep state
#HTTP vom Client zulassen
pass in on { pcn2 } proto tcp from 10.1.1.4 to any port 80 keep state
#DNS vom Client zulassen
pass in on { pcn2 } proto udp from 10.1.1.4 to any port 53 keep state
#ICMP vom Client zulassen
pass in on { pcn2 } proto icmp from 10.1.1.4 to any keep state
# Jetzt müssen wir die Firewall aktivieren
pfctl -e -f /etc/pf.conf
# Jetzt müssen wir noch dafür sorgen, dass die Firewall beim Neustart aktiviert
# wird.
echo pf=Yes >> /etc/rc.conf.local
# Die Carp Interfaces, pf und pfsync sind nun soweit konfiguriert. Jetzt muss dies
# ebenfalls auf Firewall2 eingestellt werden. Da die Konfiguration exakt
# identisch ist, werde ich sie nicht nochmals hier aufführen.
# Jetzt da die Firewalls laufen brauchen wir noch einen Host im Inside Netzwerk.
# Hierzu setze ich eine Ubuntu-Linux Maschine als virtuelle Maschine auf. Diese
# Maschine bekommt, wie in [w1] geschildert die IP Adresse 10.1.1.4 und das
# Defaultgateway ist die virtuelle Inside IP Adresse der Firewall. Der DNS
# Server ist der gleiche wie bei den Firewalls (also $DNS). Ebenso muss
# natürlich das Routing im LAN angepasst werden, so dass auch das virtuelle Netz
# 10.1.1.0/24 erreichbar ist. Die genaue Installation dieser Maschine sowie das
# Routingsetup ist nicht Bestandteil dieser Anleitung.
#
# Sobald die Maschine läuft kann man die Verbindung testen.
ping heise.de
# Wenn dieser Ping funktioniert startet man einen größeren Download. Man kann
# z.B. die aktuellen Quellen des Linuxkernels herunterladen.
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.1.tar.bz2
# Wärend der Download läuft macht man ein Failover auf der aktiven Firewall
# in dem man folgendes Kommando ausführt:
ifconfig carp1 down; ifconfig carp1 up; ifconfig carp0 down; ifconfig carp0 up
# Die Verbindung sollte immer noch weiterlaufen. Alternativ bzw. anschließend
# kann man auch die aktive Maschine einfach ausschalten. Auch hier sollte es zu
# keinen Verbindungsproblemen kommen.