[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 (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] 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 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 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 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

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:

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:

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

Hier is een voorbeeld van een 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 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:

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]


[terug] www@openbsd.org
$OpenBSD: carp.html,v 1.15 2007/11/19 10:43:15 tobias Exp $