[Vorige: Packet Queueing en Prioritisering] [Inhoud] [Volgende: Pakketmarkering]
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.
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.
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.
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]