[OpenBSD]

[Precedente: Packet Queueing e Prioritization] [Indice] [Successivo: Packet Tagging]

PF: Pool di indirizzi e bilanciamento del carico


Indice


Introduzione

Un pool di indirizzi è un insieme di due o più indirizzi condivisi da un gruppo di utenti. Un pool di indirizzi può essere specificato nel reindirizzamento delle regole rdr, per la traslazione di indirizzi nelle regole di nat, e come il target di indirizzi in route-to, reply-to, e dup-to nelle opzioni di filtraggio.

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.

NAT Address Pool

Un pool di indirizzi può essere usato per la traslazione di indirizzi nelle regole di nat. Le connessioni avranno il loro indirizzo sorgente traslato con un indirizzo dal pool in base al metodo utilizzato. Questo è utile in situazioni dove PF effettua la NAT per un gran numero di network. Dato che il numero di connessioni NATtate per ogni indiizzo di traslazione è limitato, l'aggiunta di ulteriori indirizzi di traslazione consentirà al gateway NAT di servire un maggior numero di utenti.

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.

Bilanciamento del carico su connessioni entranti

I pool di indirizzi possono anche essere utilizzati per bilanciare connessioni entranti. Per esempio, connessioni su un server web possono essere distribuite tra una farm di server web:
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.

Bilanciamento del carico su connessioni uscenti

Pool di indirizzi possono essere usati in combinazione con l'opzione di filtraggio route-to per bilanciare carichi di due o più connessioni Internet quando non è disponibile un protocollo di routing multi-path (come BGP4). Utilizzando route-to con un pool di indirizzi round-robin, connessioni in uscita possono essere distribuite ugualmente tra diversi percorsi in uscita.

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]


[back] www@openbsd.org
$OpenBSD: pools.html,v 1.2 2008/03/20 15:57:35 saad Exp $