[OpenBSD]

[Précédent : Gestion de La Bande Passante] [Index] [Suivant : Balisage de Paquets]

Pools d'Adresses et Partage de Charge


Table des Matières


Introduction

Un pool d'adresses, constitué de deux adresses ou plus, permet à un groupe d'utilisateurs une utilisation partagée de ces adresses. Un tel ensemble peut être utilisé comme adresse de redirection dans les règles rdr, comme adresse de traduction dans les règles nat, et comme adresse destination dans les options route-to, reply-to, dup-to et filter.

Il existe quatre méthodes pour utiliser un pool d'adresses :

Dans tous les cas, à l'exception notable de la méthode round-robin, le pool d'adresses doit être spécifié sous forme d'un bloc réseau en notation CIDR (Classless Inter-Domain Routing). La méthode round-robin accepte des adresses individuelles à partir d'une liste ou d'une table.

L'option sticky-address peut être utilisée conjointement avec les types de pool random et round- robin afin de s'assurer qu'à une adresse source donnée corresponde toujours la même adresse de redirection.

Pools d'Adresses NAT

Un pool d'adresses peut être utilisé comme adresse de traduction dans les règles nat. Les adresses source dans chaque paquet de connexion sont traduites avec une adresse du pool selon la méthode choisie. Ceci peut être utile dans des situations où PF doit faire des opérations de NAT pour un réseau très grand. Etant donné que le nombre de connexions traduites par adresse de traduction est limité, l'ajout d'adresses de traduction permettra à la passerelle NAT d'être ajustée afin d'assurer le service pour un grand nombre d'utilisateurs.

Dans l'exemple suivant, un pool de deux adresses est utilisé pour traduire les paquets sortants. Pour chaque connexion sortante, PF fera une attribution séquentielle avec rotation selon la méthode round-robin.

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

Cependant, cette méthode a un inconvénient. En effet, des connexions successives à partir de la même adresse interne ne seront pas toujours traduites avec la même adresse de traduction. Ceci peut causer des interférences lors, par exemple, de la navigation sur des sites web qui utilisent les adresses IP comme éléments d'identification des utilisateurs. Une approche alternative consiste à utiliser la méthode source- hash. Ainsi, chaque adresse interne est toujours traduite avec la même adresse de traduction. Dans ce cas, le pool d'adresses doit être obligatoirement un bloc réseau en notation CIDR.

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

Cette règle de nat utilise le pool d'adresses 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) comme adresse de traduction de paquets sortants. Chaque adresse interne sera toujours traduite avec la même adresse de traduction grâce au mot-clé source-hash.

Partage de Charge Des Connexions Entrantes

Des pools d'adresses peuvent aussi être utilisés pour partager la charge sur les connexions entrantes. Par exemple, des connexions web entrantes peuvent être partagées entre serveurs web d'une même ferme :
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

Les connexions successives seront redirigées vers les serveurs web selon la méthode round-robin : les connexions à partir de la même adresse source seront toujours envoyés au même serveur web. Cette connexion "collante" ("sticky") existera aussi longtemps qu'il y aura des états faisant référence à cette connexion. Une fois les états expirés, la connexion collante expirera aussi. Les futures connexions à partir de ce hôte seront redirigés vers le prochain serveur dans le round robin.

Partage de Charge Des Connexions Sortantes

Les pools d'adresses peuvent être utilisés en combinaison de l'option de filtrage route-to pour faire du partage de charge entre deux ou plusieurs connexions Internet lorsqu'un protocole de routage multi-lien (tel que BGP4) n'est pas disponible. En utilisant route-to avec un pool d'adresses et la méthode round-robin, les connexions sortantes peuvent être distribuées entre plusieurs liens.

Pour que le partage de charge fonctionne, il faut aussi connaître l'adresse IP du routeur adjacent sur chaque connexion Internet. Ces informations sont données à l'option route-to afin de contrôler la destination des paquets sortants.

L'exemple suivant partage le trafic sortant entre deux connexions 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'option route-to est utilisée pour le trafic entrant sur l'interface interne afin de spécifier les interfaces réseau sur lesquelles le trafic sortant doit être partagé ainsi que les passerelles respectives de chaque interface réseau. Il est à noter que l'option route-to doit être présente dans chaque règle de filtrage pour laquelle le trafic doit être équilibré. Les paquets de retour seront acheminés vers la même interface externe à partir de laquelle les paquets d'origine sont ressortis (c'est ce qui est effectué par les FAIs). Ces paquets de retour seront ensuite acheminés vers l'interface du réseau interne normalement.

Pour s'assurer que les paquets avec une adresse source appartenant à $ext_if1 sont toujours acheminés vers $ext_gw1 (et, de même, pour $ext_if2 et $ext_gw2), les deux lignes suivantes doivent être incluses dans le jeu de règles :

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

Enfin, la NAT peut aussi être utilisée sur chaque interface de sortie :

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

Voici un exemple complet d'équilibrage de charge du trafic sortant :

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 outgoing connections on each 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 # pass all outgoing packets on internal interface pass out on $int_if from any to $lan_net # pass in quick any packets destined for the gateway itself pass in quick on $int_if from $lan_net to $int_if # load balance outgoing tcp traffic from internal network. 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 outgoing udp and icmp traffic from internal network 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 # general "pass out" rules for external 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 # route packets from any IPs on $ext_if1 to $ext_gw1 and the same for # $ext_if2 and $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

[Précédent : Mise en Queue des Paquets et Gestion des Priorités] [Index] [Suivant : Balisage de Paquets]


[back] www@openbsd.org
$OpenBSD: pools.html,v 1.17 2008/01/13 13:43:35 tobias Exp $