[Vorige: Authpf: Gebruiker-Shell voor Authentiserende Gateways] [Inhoud] [Volgende: Firewall voor Thuis of Klein Kantoor]
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.
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.
ifconfig carpN create
ifconfig carpN vhid vhid [pass password] [carpdev carpdev] \
[advbase advbase] [advskew advskew] [state state] ipaddress \
netmask mask
Verder kan CARP gedrag geregeld worden via sysctl(8).
# 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
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:
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.
ifconfig pfsyncN syncdev syncdev [syncpeer syncpeer]
# ifconfig pfsync0 syncdev em1Dit 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.
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
|
Voorbeelden:
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.
pass in on fxp0 inet proto tcp from any to carp0 port 22maar de fxp0 vervangen door carp0 zou niet werken zoals u wenst.
Vergeet NIET proto carp en proto pfsync door te laten!
[Vorige: Authpf: Gebruiker-Shell voor Authentiserende Gateways] [Inhoud] [Volgende: Firewall voor Thuis of Klein Kantoor]