[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 vertalingsadres in nat-to, rdr-to,route-to, reply-to en dup-to filter opties.

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-to regels. Het bron 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.

match out on $ext_if inet nat-to { 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.

match out on $ext_if inet nat-to 192.0.2.4/31 source-hash

Deze 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 }"

match in on $ext_if proto tcp to port 80 rdr-to $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 from $lan_net \
   route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) }\
   round-robin

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 (deze kan niet gebruikt worden met match regels).

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 from $ext_if2 \
   route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 \
   route-to ($ext_if1 $ext_gw1)

Tenslotte kan NAT ook gebruikt worden op elke buitengaande interface:

match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($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
match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)

#  default deny
block in
block out

#  laat alle buitengaande pakketten door op interne interface
pass out on $int_if 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 verkeer vanaf intern netwerk.
pass in on $int_if from $lan_net \
    route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } \
    round-robin
#  hou https verkeer op één enkele connectie; sommige webapplicaties,
#  vooral de "veilige", staan niet toe om het in een sessie te wijzigen
pass in on $int_if proto tcp from $lan_net to port https \
    route-to ($ext_if1 $ext_gw1)

#  algemene "pass out" regels voor externe interfaces
pass out on $ext_if1
pass out on $ext_if2

#  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 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1)

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


[terug] www@openbsd.org
$OpenBSD: pools.html,v 1.23 2013/03/27 18:37:03 ajacoutot Exp $