[OpenBSD]

[Vorige: Packet Queueing en Prioritisering] [Inhoud] [Volgende: Pakketmarkering]

PF: Adrespools en Load Balancing


Inhoudsopgave


Inleiding

Een adrespool is een voorraad van twee of meer adressen waarvan het gebruik gedeeld wordt onder een groep van gebruikers. Een adrespool kan gespecificeerd worden als het omleidingsadres in rdr regels, als het vertalingsadres in nat regels, en als het doeladres in route-to, reply-to en dup-to filteropties.

Er zijn vier methodes om een adrespool te gebruiken:

Behalve voor de round-robin methode, moet de adrespool uitgedrukt worden als een CIDR (Classless Inter-Domain Routing) netwerkblok. De round-robin methode zal meerdere individuele adressen aannemen bij gebruik van een lijst of tabel.

De sticky-address optie kan gebruikt worden met de random en round-robin pooltypes om te verzekeren dat een bepaald bronadres steeds afgebeeld wordt op hetzelfde omleidingsadres.

NAT Adrespool

Een adrespool kan gebruikt worden als het vertalingsadres in nat regels. Het source adres van verbindingen zal vertaald worden naar een adres van de pool op basis van de gekozen methode. Dit kan nuttig zijn in situaties waar PF NAT uitvoert vor een heel groot netwerk. Aangezien het aantal NAT-verbindingen per vertalingsadres beperkt is, zal het toevoegen van bijkomende vertalingsadressen de NAT gateway toelaten te vergroten om een groter aantal gebruikers te bedienen.

In dit voorbeeld wordt een pool van twee adressen gebruikt om buitengaande pakketten te vertalen. Voor elke buitengaande verbinding zal PF doorheen de adressen roteren op een "round-robin" manier.

nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }

Eйn nadeel met deze methode is dat opeenvolgende verbindingen vanaf hetzelfde interne adres niet altijd zullen vertaald worden naar hetzelfde vertalingsadres. Dit kan interferentie veroorzaken, bijvoorbeeld wanneer men naar websites surft die gebruikerlogins traceren op basis van IP adres. Een alternatieve aanpak is om de source-hash methode te gebruiken zodat elk intern adres altijd vertaald wordt naar hetzelfde vertalingsadres. Om dit te doen, moet de adrespool een CIDR netwerkblok zijn.

nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash

Deze nat regel gebruikt de adrespool 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) als het vertalingsadres voor buitengaande pakketten. Elk intern adres zal altijd vertaald worden naar hetzelfde vertalingsadres omwille van het source-hash sleutelwoord.

Load Balance van Binnenkomende Verbindingen

Adrespools kunnen ook gebruikt worden om de belasting te verdelen voor binnenkomende verbindingen. Binnenkomende webserver verbindingen kunnen bijvoorbeeld verdeeld worden onder een webserver farm:
web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"

rdr on $ext_if proto tcp from any to any port 80 -> $web_servers \
    round-robin sticky-address

Opeenvolgende verbindingen zullen omgeleid worden naar de webservers op een "round-robin" manier waarbij verbindingen van hetzelfde bronadres naar dezelfde webserver gestuurd worden. Deze "sticky" verbinding zal bestaan zolang er toestanden zijn die naar deze verbinding verwijzen. Zodra de toestanden vervallen, zal ook de sticky verbinding dat doen. Verdere verbindingen vanaf die host zullen omgeleid worden naar de volgende webserver in de round robin.

Load Balance van Buitengaand Verkeer

Adrespools kunnen gebruikt worden in combinatie met de route-to filteroptie om de belasting te verdelen van twee of meer Internetverbindingen wanneer een echt multi-path routeringsprotocol (zoals BGP4) niet beschikbaar is. Door route-to te gebruiken met een round-robin adrespool, kunnen buitengaande verbindingen gelijk verdeeld worden tussen meerdere uitwaartse paden.

Een bijkomend stuk informatie dat nodig is om dit te doen is het IP adres van de nabijgelegen router op elke Internetverbinding. Dit wordt aan de route-to optie meegegeven om de bestemming van buitengaande pakketten te regelen.

Het volgende voorbeeld balanceert buitengaand verkeer over twee Internetverbindingen:

lan_net = "192.168.0.0/24"
int_if  = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"

pass in on $int_if route-to \
   { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
   from $lan_net to any keep state

De route-to optie wordt gebruikt op verkeer dat binnen komt op de interne interface om de buitengaande netwerkinterfaces te specificeren waartussen verkeer gebalanceerd zal worden, samen met hun respectievelijke gateways. Merk op dat de route-to optie aanwezig moet zijn op elke filterregel waarvoor verkeer gebalanceerd moet worden. Terugkerende pakketten zullen teruggerouteerd worden naar dezelfde externe interface die ze verlieten (dit wordt gedaan door de ISP's) en zullen normaal teruggerouteerd worden naar het interne netwerk.

Om te verzekeren dat pakketten met een bronadres horend bij $ext_if1 altijd gerouteerd worden naar $ext_gw1 (en gelijkaardig voor $ext_if2 en $ext_gw2), moeten de volgende twee lijnen in de regelset staan:

pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
   to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
   to any

Tenslotte kan NAT ook gebruikt worden op elke buitengaande interface:

nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)

Een volledig voorbeeld dat buitengaand verkeer balanceert, zou er ongeveer als volgt kunnen uitzien:

lan_net = "192.168.0.0/24" int_if = "dc0" ext_if1 = "fxp0" ext_if2 = "fxp1" ext_gw1 = "68.146.224.1" ext_gw2 = "142.59.76.1" # nat buitengaande verbindingen op elke internet interface nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2) # default deny block in from any to any block out from any to any # laat alle buitengaande pakketten door op interne interface pass out on $int_if from any to $lan_net # pass in quick pakketten bestemd voor de gateway zelf pass in quick on $int_if from $lan_net to $int_if # load balance buitengaand tcp verkeer vanaf intern netwerk pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto tcp from $lan_net to any flags S/SA modulate state # load balance buitengaand udp en icmp verkeer vanaf intern netwerk pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto { udp, icmp } from $lan_net to any keep state # algemene "pass out" regels voor externe interfaces pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state pass out on $ext_if1 proto { udp, icmp } from any to any keep state pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state pass out on $ext_if2 proto { udp, icmp } from any to any keep state # routeer pakketten van gelijk welke IPs op $ext_if1 naar $ext_gw1 en # hetzelfde voor $ext_if2 en $ext_gw2 pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any

[Vorige: Packet Queueing en Prioritisering] [Inhoud] [Volgende: Pakketmarkering]


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