[Precedente: Packet Queueing e Prioritization] [Indice] [Successivo: Packet Tagging]
Ci sono quattro metodi per utilizzare un pool di indirizzi:
Ad accezione del metodo round-robin, il pool di indirizzi deve essere espresso come un blocco di indirizzi CIDR (Classless Inter-Domain Routing) network block. Il metodo round-robin accetterà molteplici singoli indirizzi usando una lista o una tabella.
L'opzione sticky-address può essere usata con i tipi di pool random e round-robin per assicurare che un particolare indirizzo sorgente sia sempre mappato con uno stesso indirizzo.
In questo esempio un pool di due indirizzi è usato per traslare i pacchetti in uscita. Per ogni connessione in uscita PF ruoterà gli indirizzi secondo il metodo round-robin.
nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }
Uno svantaggio di questo metodo è che le successive connessioni dallo stesso indirizzo interno non verranno sempre traslate con lo stesso indirizzo di traslazione. Questo può causare interferenze, per esempio, quando si naviga su siti web che tracciano il login dell'utente in base all'indirizzo IP. Un approcio alternativo è di usare il metodo source-hash così che ogni indirizzo interno verrà sempre traslato con lo stesso indirizzo di traslazione. Per ottenere ciò, il pool di indirizzi deve essere un blocco di rete CIDR.
nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash
Questa regola di nat utilizza gli indirizzi del pool 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) come indirizzi di traslazione per i pacchetti in uscita. Ogni indirizzo interno sarà sempre traslato con uno stesso indirizzo di traslazione grazie alla keyword source-hash.
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
Le connessioni successive verranno redirette ai server web secondo un metodo round-robin con connessioni dalla stessa sorgente inviate allo stesso web server. Questa "sticky connection" esisterà fin quando ci saranno stati che si riferiscono a questa connessione. Quando gli stati terminano, finirà la connessione sticky. Ulteriori connessioni dall'host saranno redirette al web server successivo secondo il round robin.
Un ulteriore informazione necessaria per effettuare ciò è conoscere l'indirizzo IP del router adiacente in ogni connessione Internet. Questa viene fornita all'opzione route-to per controllare la destinazione dei pacchetti in uscita.
Il seguente esempio bilancia il traffico in uscita attraverso due connessioni Internet:
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
L'opzione route-to è usata sul traffico in ingresso sull'interfaccia interna per specificare alle interfaccie di rete in uscita che il traffico verrà bilanciato tra i loro rispettivi gateway. Da notare che l'opzione route-to deve essere presente su ogni regola di filtraggio per il quale il traffico deve essere bilanciato. Pacchetti di risposta saranno indirizzati indietro alla stessa interfaccia esterna dalla quale sono usciti (questo è fatto dall'ISP) e verrano indirizzati indietro alla loro rete interna.
Per assicurare che i pacchetti con un indirizzo sorgente appartengano a $ext_if1 siano sempre indirizzati a $ext_gw1 (e allo stesso modo per $ext_if2 e $ext_gw2), le due righe seguenti dovrebbero essere incluse nelle regole di configurazione:
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
Alla fine, NAT può anche essere utilizzata per ogni interfaccia in uscita:
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
Un esempio completo che effettua il bilanciamento del carico sul traffico in uscita può essere il seguente:
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 delle connessioni in uscita su ogni interfaccia internet
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
# consente il passaggio di tutti i pacchetti in uscita sull'interfaccia
# interna
pass out on $int_if from any to $lan_net
# passaggio quick di ogni pacchetto destinato in ingresso al gateway
# stesso
pass in quick on $int_if from $lan_net to $int_if
# bilanciamento del carico per il traffico tcp in uscita dalla rete
# interna.
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
# bilanciamento del carico per il traffico udp e icmp in uscita dalla
# rete interna
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
# regole di "pass out" generali per le interfaccie esterne
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
# guida i pacchetti da ogni IPs sulla $ext_if1 a $ext_gw1 e lo stesso per
# $ext_if2 e $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
|
[Precedente: Packet Queueing e Prioritization] [Indice] [Successivo: Packet Tagging]