[Vorige: Authpf: Gebruiker-Shell voor Authentiserende
Gateways]
[Inhoud]
[Volgende: Firewall voor Thuis of Klein Kantoor]
PF: Firewall Redundantie met CARP en pfsync
Inhoudsopgave
Inleiding tot CARP
CARP is het Common Address Redundancy Protocol.
De hoofdbedoeling ervan is om meerdere hosts op hetzelfde netwerksegment
toe te laten een IP adres te delen.
CARP is een veilig, vrij alternatief voor het
Virtual Router Redundancy
Protocol (VRRP) en het
Hot Standby Router
Protocol (HSRP).
CARP werkt door een groep hosts op hetzelfde netwerksegment toe te laten
een IP adres te delen.
Deze groep van hosts wordt een "redundantiegroep" genoemd.
Aan de redundantiegroep wordt een IP adres toegekend dat tussen de
groepsleden gedeeld wordt.
Binnen de groep wordt één host tot "master" benoemd en de rest tot
"backups".
De master host is degene die momenteel het gedeelde IP "bezit"; hij
antwoordt op gelijk welk verkeer of ARP aanvragen die ernaar gericht zijn.
Elke host kan tot meer dan één redundantiegroep tegelijk behoren.
Een veel voorkomend gebruik voor CARP is het aanmaken van een groep van
redundante firewalls.
Het virtuele IP dat toegekend wordt aan de redundantiegroep wordt op client
machines als de standaard gateway geconfigureerd.
Wanneer de master firewall een storing krijgt of offline genomen wordt,
zal het IP naar één van de backup firewalls bewegen en de dienst zal
ongestoord verdergaan.
CARP ondersteunt IPv4 en IPv6.
CARP Werking
De master host in de groep zendt regelmatig aankondigingen naar het lokale
netwerk zodat de backup hosts weten dat hij nog steeds leeft.
Als de backup hosts geen aankondiging vanwege de master horen gedurende een
ingestelde periode, dan zal één van hen de plichten van de master overnemen
(welke backup host het ook is die de laagst geconfigureerde advbase
en advskew waarden heeft).
Het is mogelijk dat meerdere CARP groepen bestaan op hetzelfde
netwerksegment.
CARP aankondigingen bevatten de Virtual Host ID die groepsleden toelaat
om te identificeren tot welke redundantiegroep de aankondiging behoort.
Om te voorkomen dat een kwaadwillige gebruiker op het netwerksegment
CARP aankondigingen zou vervalsen, kan elke groep geconfigureerd worden met
een wachtwoord.
Elk CARP pakket dat naar de groep gezonden wordt, wordt dan beschermd door
een SHA1 HMAC.
Aangezien CARP zijn eigen protocol is, moet het een expliciete pass regel
hebben in filterregelsets:
pass out on $carp_dev proto carp keep state
$carp_dev is de fysische interface waarover CARP communiceert.
CARP Configureren
Elke redundantiegroep wordt vertegenwoordigd door een
carp(4) virtuele netwerkinterface. Als zodanig wordt CARP geconfigureerd
met
ifconfig(8).
ifconfig carpN create
ifconfig carpN vhid vhid [pass password]
[carpdev carpdev] \
[advbase advbase] [advskew advskew]
[state state] [group|-group group] \
ipaddress netmask mask
- carpN
- De naam van de carp(4) virtuele interface waarbij N een geheel
getal is dat het nummer van de interface voorstelt (bv. carp10).
- vhid
- De Virtual Host ID. Dit is een uniek getal dat gebruikt wordt om de
redundantiegroep te identificeren naar andere knooppunten in de groep en
om onderscheid te maken tussen groepen op hetzelfde netwerk.
Aanvaardbare waarden gaan van 1 tot 255.
Dit moet gelijk zijn voor alle leden van de groep.
- password
- Het authenticatiewachtwoord om te gebruiken bij het praten met andere
CARP-enabled hosts in deze redundantiegroep.
Dit moet hetzelfde zijn bij alle leden van de groep.
- carpdev
- Deze optionele parameter specificeert de fysische netwerkinterface
die toebehoort aan deze redundantiegroep.
Standaard zal CARP proberen te bepalen welke interface te gebruiken door
een fysische interface te zoeken die in hetzelfde subnet zit als de
ipaddress en mask combinatie gegeven aan de carp(4)
interface.
- advbase
- Deze optionele parameter specificeert hoe vaak, in seconden, aan te
kondigen dat we een lid van de redundantiegroep zijn.
De standaardwaarde is 1 seconde.
Aanvaardbare waarden gaan van 1 tot 255.
- advskew
- Deze optionele parameter specificeert hoeveel de
advbase te verdraaien bij het zenden van CARP aankondigingen.
Door advskew te manipuleren kan de master CARP host gekozen
worden.
Hoe hoger het getal, hoe minder voorkeur de host krijgt bij het
kiezen van een master.
De standaardwaarde is 0.
Aanvaardbare waarden gaan van 0 tot 254.
- state
- Dwing een carp(4) interface in een bepaalde toestand. Geldige toestanden
zijn init, backup en master.
- group, -group
- Voeg een carp(4) interface toe aan of verwijder hem uit een bepaalde
interface group.
Standaard worden alle carp(4) interfaces toegevoegd aan de carp group.
Iedere group heeft een carpdemote teller die betrekking heeft op
alle carp(4) interfaces die bij die group horen.
Zoals hieronder beschreven, kan het nuttig zijn om
bepaalde interfaces te groeperen ten behoeve van failover.
- ipaddress
- Dit is het gedeelde IP adres dat toegekend is aan de redundantiegroep.
Dit adres hoeft niet in hetzelfde subnet te zitten als het IP adres op de
fysische interface (indien aanwezig).
Dit adres moet echter hetzelfde zijn op alle hosts in de groep.
- mask
- Het subnet mask van het gedeelde IP.
Verder kan CARP gedrag geregeld worden via
sysctl(8).
- net.inet.carp.allow
- Aanvaard binnenkomende CARP pakketten of niet. Standaardwaarde is 1 (ja).
- net.inet.carp.preempt
- Laat hosts binnen een redundantiegroep die een betere advbase
en advskew hebben, toe om de plaats van master in te nemen.
Bovendien schakelt deze optie ook het falen over in van een groep van
interfaces wanneer één interface down gaat.
Als één fysische CARP-enabled interface down gaat, zal CARP de demotie-teller
carpdemote met 1 verhogen voor alle interface groups waar de carp(4)
inferface lid van is, en zorgt daarbij voor een failover van alle
groepsleden tegelijk.
net.inet.carp.preempt is standaard 0 (uitgeschakeld).
- net.inet.carp.log
- Log wijzigingen van de status, slechte packets en andere fouten.
Kan tussen 0 en 7 liggen, overeenkomend met syslog(3) prioriteiten.
Standaardwaarde is 2 (alleen wijzigingen van status).
CARP Voorbeeld
Hier is een voorbeeld van een CARP configuratie.
# sysctl -w net.inet.carp.allow=1
# ifconfig carp1 create
# ifconfig carp1 vhid 1 pass mekmitasdigoat carpdev em0 \
advskew 100 10.0.0.1 netmask 255.255.255.0
Dit stelt het volgende in:
- Schakelt ontvangst van CARP pakketten in (dit is de standaard instelling).
- Maakt een carp(4) interface, carp1, aan.
- Configureert carp1 voor virtuele host #1, schakelt een wachtwoord
in, stelt em0 in als de interface die behoort tot de groep, en
maakt deze host tot backup wegens de advskew van 100
(natuurlijk in de veronderstelling dat de master ingesteld is met een
advskew van minder dan 100).
Het gedeelde IP toegekend aan deze groep is 10.0.0.1/255.255.255.0.
Het uitvoeren van ifconfig op carp1 toont de toestand van de
interface.
# ifconfig carp1
carp1: flags=8802<UP,BROADCAST,SIMPLEX,MULTICAST> mtu 1500
carp: BACKUP carpdev em0 vhid 1 advbase 1
advskew 100
groups: carp
inet 10.0.0.1 netmask 0xffffff00 broadcast
10.0.0.255
Inleiding tot pfsync
De
pfsync(4) netwerkinterface legt bepaalde veranderingen bloot die gedaan
werden aan de
pf(4) toestandstabel.
Door deze device te monitoren met
tcpdump(8), kunnen veranderingen aan de toestandstabel in real time
geobserveerd worden.
Bovendien kan de pfsync(4) interface deze toestandsveranderingsboodschappen
naar buiten op het netwerk sturen zodat andere knooppunten die PF draaien
de veranderingen in hun eigen toestandstabel kunnen samensmelten.
pfsync(4) kan eveneens op het netwerk luisteren naar binnenkomende
boodschappen.
pfsync Werking
Standaard zendt of ontvangt pfsync(4) geen toestandstabel updates op het
netwerk; updates kunnen echter nog steeds gemonitord worden met tcpdump(8)
of andere zulke tools op de lokale machine.
Wanneer pfsync(4) ingesteld is om updates te zenden en te ontvangen op het
netwerk, is het standaard gedrag om updates te multicasten naar buiten op
het lokale netwerk.
Alle updates worden zonder authenticatie gestuurd.
De beste algemene praktijk is ofwel:
- Verbind de twee knooppunten die updates zullen uitwisselen rug-aan-rug
met een crossover kabel en gebruik die interface als de
syncdev (zie hieronder).
- Gebruik de ifconfig(8) syncpeer optie (zie hieronder) zodat
updates rechtstreeks naar de peer geünicast worden, configureer vervolgens
ipsec(4)
tussen de hosts om het pfsync(4) verkeer te beveiligen.
Wanneer updates verzonden en ontvangen worden op het netwerk, moeten pfsync
pakketten doorgelaten worden in de filterregelset:
pass on $sync_if proto pfsync
$sync_if is de fysische interface waarover pfsync(4) communiceert.
pfsync Configureren
Aangezien pfsync(4) een virtuele netwerkinterface is, wordt het geconfigureerd
met
ifconfig(8).
ifconfig pfsyncN syncdev syncdev [syncpeer
syncpeer] [defer|-defer]
- pfsyncN
- De naam van de pfsync(4) interface. pfsync0 bestaat
standaard bij gebruik van de GENERIC kernel.
- syncdev
- De naam van de fysische interface gebruikt om pfsync updates uit te zenden.
- syncpeer
- Deze optionele parameter specificeert het IP adres van een host waarmee
pfsync updates uitwisselt.
Standaard worden pfsync updates gemulticast op het lokale netwerk.
Deze optie heft dat gedrag op en unicast in de plaats de update naar de
gespecificeerde syncpeer.
- defer
- Als de defer vlag wordt gebruikt, dan wordt het initële packet
van een nieuwe connectie via de firewall niet verzonden totdat ofwel een
ander pfsync(4) systeem de toevoeging aan de statustabel heeft bevestigd,
ofwel totdat een timeout is opgetreden.
Dit voegt een kleine vertraging toe, maar staat verkeer toe om te stromen
als meer dan één firewall actief packets behandelt ("active/active"),
bijvoorbeeld met bepaalde ospfd(8), bgpd(8) of carp(4) configuraties.
pfsync Voorbeeld
Hier is een voorbeeld van een pfsync configuratie.
# ifconfig pfsync0 syncdev em1 up
Dit schakelt pfsync in op de em1 interface.
Buitengaande updates zullen gemulticast worden op het netwerk, wat gelijk
welke andere host die pfsync draait, toelaat ze te ontvangen.
CARP en pfsync Combineren voor Failover
Door de functionaliteiten van CARP en pfsync te combineren, kan een groep
van twee of meer firewalls gebruikt worden om een hoogst beschikbare, volledig
redundante firewall cluster te creëren.
- CARP:
- Zorgt voor de automatische failover van één firewall naar een andere.
- pfsync:
- Synchroniseert de toestandstabel tussen al de firewalls.
Bij een failover kan verkeer ononderbroken doorheen de nieuwe master
firewall stromen.
Een voorbeeldscenario.
Twee firewalls, fw1 en fw2.
+----| WAN/Internet |----+
| |
em2| |em2
+-----+ +-----+
| fw1 |-em1----------em1-| fw2 |
+-----+ +-----+
em0| |em0
| |
---+------Gedeelde LAN------+---
De firewalls zijn rug-aan-rug verbonden met een crossover kabel op
em1.
Beide zijn verbonden met de LAN op em0 en met een WAN/Internet
verbinding op em2.
IP adressen zijn als volgt:
- fw1 em0: 172.16.0.1
- fw1 em1: 10.10.10.1
- fw1 em2: 192.0.2.1
- fw2 em0: 172.16.0.2
- fw2 em1: 10.10.10.2
- fw2 em2: 192.0.2.2
- LAN gedeeld IP: 172.16.0.100
- WAN/Internet gedeeld IP: 192.0.2.100
Het netwerkbeleid is dat fw1 bij voorkeur master zal zijn.
Configureer fw1:
! schakel "preemption" en groep interface failover in
# sysctl -w net.inet.carp.preempt=1
! configureer pfsync
# ifconfig em1 10.10.10.1 netmask 255.255.255.0
# ifconfig pfsync0 syncdev em1
# ifconfig pfsync0 up
! configureer CARP aan de LAN zijde
# ifconfig carp1 create
# ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \
172.16.0.100 netmask 255.255.255.0
! configureer CARP aan de WAN/Internet zijde
# ifconfig carp2 create
# ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \
192.0.2.100 netmask 255.255.255.0
|
Configureer fw2:
! schakel "preemption" en groep interface failover in
# sysctl -w net.inet.carp.preempt=1
! configureer pfsync
# ifconfig em1 10.10.10.2 netmask 255.255.255.0
# ifconfig pfsync0 syncdev em1
# ifconfig pfsync0 up
! configureer CARP aan de LAN zijde
# ifconfig carp1 create
# ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \
advskew 128 172.16.0.100 netmask 255.255.255.0
! configureer CARP aan de WAN/Internet zijde
# ifconfig carp2 create
# ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \
advskew 128 192.0.2.100 netmask 255.255.255.0
|
Werkingsproblemen
Een aantal veel voorkomende werkingsproblemen ondervonden met CARP/pfsync.
CARP en pfsync Configureren tijdens het Booten
Aangezien carp(4) en pfsync(4) allebei types van netwerkinterfaces zijn,
kunnen ze bij het booten geconfigureerd worden door een
hostname.if(5) bestand aan te maken.
Het
netstart opstartscript zal de interface aanmaken en configureren.
Voorbeelden:
- /etc/hostname.carp1
-
inet 172.16.0.100 255.255.255.0 172.16.0.255 vhid 1 carpdev em0 \
pass lanpasswd
- /etc/hostname.pfsync0
-
up syncdev em1
Failover van de Master Dwingen
Er kunnen momenten zijn wanneer het nodig is met opzet failover te doen of
het master knooppunt opzij te zetten.
Voorbeelden zijn het laten down gaan van het master knooppunt voor onderhoud
of voor het oplossen van een probleem.
Het doel hier is om elegant verkeer te failoveren naar één van de backup
hosts zodat gebruikers geen enkel effect merken.
Om failover te doen voor een bepaalde CARP groep, schakelt u de carp(4)
interface uit op het master knooppunt.
Dit zal ertoe leiden dat de master zichzelf aankondigt met een "oneindige"
advbase en advskew.
De backup host(s) zal (zullen) dit zien en onmiddellijk de rol van master
overnemen.
# ifconfig carp1 down
Een alternatief is het verhogen van de advskew tot een waarde
die hoger is dan de advskew op de backup host(s).
Dit zal zorgen voor failover maar nog steeds toelaten dat de master in
de CARP groep participeert.
Een andere failover-methode is om de CARP degradatieteller
("demotion counter") te "tweaken".
De degradatieteller is een maat voor hoe "klaar" een host is om master
van een CARP groep te worden.
Terwijl een host bijvoorbeeld aan het opstarten is, is het een slecht idee
om deze de CARP master te laten worden totdat alle interfaces geconfigureerd
zijn, alle netwerkdaemons gestart zijn, etc.
Hosts die een hoge degradatiewaarde aankondigen, zullen minder de voorkeur
genieten als master.
Een degradatieteller wordt opgeslagen in elke interfacegroep waartoe de
CARP interface behoort.
Standaard zijn alle CARP interfaces leden van de "carp" interfacegroep.
De huidige waarde van een degradatieteller kan bekeken worden met
ifconfig(8):
# ifconfig -g carp
carp: carp demote count 0
In dit voorbeeld wordt de teller geassocieerd met de "carp" interfacegroep
getoond.
Wanneer een CARP host zichzelf aankondigt op het netwerk, neemt hij de
som van de degradatietellers voor elke interfacegroep waartoe de carp(4)
interface behoort en kondigt die waarde aan als zijn degradatiewaarde.
Neem nu het volgende voorbeeld.
Twee firewalls die CARP draaien met de volgende CARP interfaces:
- carp1 -- Departement Boekhouding
- carp2 -- Gewone Werknemers
- carp3 -- Internet
- carp4 -- DMZ
De doelstelling is om enkel de carp1 en carp2 groepen te failover'en
naar de secundaire firewall.
Ken ze eerst toe aan een nieuwe interfacegroep, in dit geval "internal"
genoemd:
# ifconfig carp1 group internal
# ifconfig carp2 group internal
# ifconfig internal
carp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
carp: MASTER carpdev em0 vhid 1 advbase 1
advskew 100
groups: carp internal
inet 10.0.0.1 netmask 0xffffff00 broadcast
10.0.0.255
carp2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
carp: MASTER carpdev em1 vhid 2 advbase 1
advskew 100
groups: carp internal
inet 10.0.1.1 netmask 0xffffff00 broadcast
10.0.1.255
Verhoog nu de degradatieteller voor de "internal" groep met ifconfig(8):
# ifconfig -g internal
internal: carp demote count 0
# ifconfig -g internal carpdemote 50
# ifconfig -g internal
internal: carp demote count 50
De firewall zal nu elegant op de carp1 en carp2 groepen failover doen naar
de andere firewall in de cluster, terwijl hij nog steeds de master blijft
op carp3 en carp4.
Als de andere firewall zichzelf begon aan te kondigen met een degradatieteller
hoger dan 50, of als de andere firewall stopte met zich aan te aankondigen,
dan zou deze firewall opnieuw master op carp1 en carp2 overnemen.
Om terug te vallen op de primaire firewall, draait u de veranderingen terug:
# ifconfig -g internal -carpdemote 50
# ifconfig -g internal
internal: carp demote count 0
Netwerkdaemons zoals
OpenBGPD en
sasyncd(8) maken gebruik van de degradatieteller om te verzekeren dat de
firewall geen master wordt voordat BGP sessies ingesteld zijn en
voordat IPsec SA's gesynchroniseerd zijn.
Regelset Tips
Filter de fysische interface.
Voor wat PF betreft, komt netwerkverkeer van de fysische
interface, niet van de CARP virtuele interface (bv. carp0).
Schrijf uw regelsets dus dienovereenkomstig.
Vergeet niet dat een interface-naam in PF ofwel de naam van een fysische
interface ofwel een adres geassocieerd met die interface kan zijn.
Deze regel zou bijvoorbeeld juist kunnen zijn:
pass in on fxp0 inet proto tcp from any to carp0 port 22
maar de fxp0 vervangen door carp0 zou niet werken zoals
u wenst.
Vergeet NIET proto carp en proto pfsync
door te laten!
Andere Referenties
Bekijk alstublieft deze andere bronnen voor meer informatie:
[Vorige: Authpf: Gebruiker-Shell voor Authentiserende
Gateways]
[Inhoud]
[Volgende: Firewall voor Thuis of Klein Kantoor]
www@openbsd.org
$OpenBSD: carp.html,v 1.28 2012/12/21 10:33:10 ajacoutot Exp $