[OpenBSD]

[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 en het Hot Standby Router Protocol.

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] ipaddress 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 op het netwerk toe. Aanvaardbare waarden gaan van 1 tot 255.
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 advbase 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 1 tot 254.
state
Dwing carp(4) interface in een bepaalde toestand. Geldige toestanden zijn init, backup en master.
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 alle interfaces in wanneer één interface down gaat. Als één fysische CARP-enabled interface down gaat, zal CARP advskew op 240 zetten op alle andere CARP-enabled interfaces, en doet daarbij in essentie failover van zichzelf. Deze optie is standaard 0 (uitgeschakeld).
net.inet.carp.log
Log slechte CARP pakketten. Standaardwaarde is 0 (uitgeschakeld).
net.inet.carp.arpbalance
Verdeel de belasting van verkeer tussen meerdere hosts in de redundantiegroep. Standaardwaarde is 0 (uitgeschakeld). Zie carp(4) voor meer informatie.

CARP Voorbeeld

Een voorbeeld 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 255.255.255.0

Dit stelt het volgende in:

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
     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:

  1. Verbind de twee knooppunten die updates zullen uitwisselen rug-aan-rug met een crossover kabel en gebruik die interface als de syncdev (zie hieronder).
  2. Gebruik de syncpeer ifconfig(8) 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]
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.

pfsync Voorbeeld

Een voorbeeld pfsync configuratie.
# ifconfig pfsync0 syncdev em1
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:

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 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 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 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 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, 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

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]


[terug] www@openbsd.org
$OpenBSD: carp.html,v 1.8 2006/05/01 09:48:11 jufi Exp $