4.2. Routage avec plusieurs accès Internet/fournisseurs d'accès

Une configuration classique est la suivante, où deux fournisseurs d'accès permettent la connexion d'un réseau local (ou même d'une simple machine) à Internet.

                                                                   ________
                                          +--------------+        /
                                          |              |       |
                            +-------------+ Fournisseur 1+-------
        __                  |             |              |     /
    ___/  \_         +------+-------+     +--------------+    |
  _/        \__      |     if1      |                        /
 /             \     |              |                        |
| Réseau Local  -----+ Routeur Linux|                        |     Internet
 \_           __/    |              |                        |
   \__     __/       |     if2      |                        \
      \___/          +------+-------+     +--------------+    |
                            |             |              |     \
                            +-------------+ Fournisseur 2+-------
                                          |              |       |
                                          +--------------+        \________

Il y a généralement deux questions à se poser pour cette configuration.

4.2.1. Accès séparé

La première est de savoir comment router les réponses aux paquets entrants par un fournisseur particulier, disons le Fournisseur 1, vers ce même fournisseur.

Commençons par définir quelques symboles. $IF1 sera le nom de la première interface (if1 sur la figure au-dessus) et $IF2 le nom de la deuxième interface. $IP1 sera alors l'adresse IP associée à $IF1 et $IP2 sera l'adresse IP associée à $IF2. $P1 sera l'adresse IP de la passerelle du fournisseur d'accès 1 et $P2 sera l'adresse IP de la passerelle du fournisseur d'accès 2. Enfin, $P1_NET sera l'adresse réseau à l'intérieur duquel se situe $P1 et $P2_NET sera l'adresse réseau à l'intérieur duquel se situe $P2.

Deux tables de routage supplémentaires sont créées, par exemple T1 et T2. Celles-ci sont ajoutées dans /etc/iproute2/rt_tables. La configuration du routage dans ces tables s'effectue de la façon suivante :

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

Rien de vraiment spectaculaire. Une route est simplement positionnée vers la passerelle et une route par défaut via cette passerelle est mise en place, comme nous le ferions dans le cas d'un seul fournisseur d'accès. Ici, les routes sont placées dans des tables séparées, une par fournisseur d'accès. Il est à noter que la route vers le réseau suffit, dans la mesure où elle indique comment trouver n'importe quel hôte dans ce réseau, ce qui inclut la passerelle.

La table de routage principale est maintenant configurée. C'est une bonne idée de router les éléments à destination d'un voisin direct à travers l'interface connectée à ce voisin. Notez les arguments "src" qui assurent que la bonne adresse IP source sera choisie.

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

Indiquez maintenant votre préférence pour votre route par défaut :

ip route add default via $P1

Vous configurez ensuite les règles de routage. Celles-ci définissent la table qui sera vraiment choisie pour le routage. Il faut s'assurer que le routage s'effectue à travers une interface donnée si vous avez l'adresse source correspondante :

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

Cet ensemble de commandes vous assure que toutes les réponses au trafic entrant sur une interface particulière seront envoyées par cette interface.

[Avertissement] Avertissement

Notes d'un lecteur : si $P0_NET est le réseau local et $IF0 est son interface, alors les entrées suivantes sont désirables :

ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2                                      

Nous avons maintenant une configuration très basique. Elle marchera pour tous les processus exécutés sur le routeur lui-même, ainsi que pour le réseau local si celui-ci est masqué. Si ce n'est pas le cas, soit vous avez une plage d'adresses IP pour chaque fournisseur d'accès, soit vous masquez vers l'un des deux fournisseurs d'accès. Dans les deux cas, vous ajouterez des règles indiquant, en fonction de l'adresse IP de la machine du réseau local, vers quel fournisseur vous allez router.

4.2.2. Balance de charge

La seconde question concerne la balance de charge du trafic sortant vers les deux fournisseurs d'accès. Ceci n'est pas vraiment très dur si vous avez déjà configuré l'accès séparé comme décrit ci-dessus.

Au lieu de choisir l'un des deux fournisseurs d'accès comme route par défaut, celle-ci peut être une route multi-chemin. Par défaut, le noyau répartira les routes vers les deux fournisseurs d'accès. Ceci est réalisé de la façon suivante (construit également sur l'exemple de la section de l'accès séparé) :

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1

Ceci réalisera la balance des routes vers les deux fournisseurs. Les paramètres weight peuvent permettre de favoriser un fournisseur par rapport à un autre.

Il est à noter que la balance de charge ne sera pas parfaite dans la mesure où elle est basée sur les routes et que celles-ci sont mises dans des caches. Ceci signifie que les routes vers les sites les plus souvent utilisés passeront toujours par le même fournisseur d'accès.

De plus, si vous voulez vraiment mettre en oeuvre ceci, vous devriez également aller consulter les mises à jour de Julien Anastasov à http://www.ssi.bg/~ja/#routes Elles rendront le travail plus facile.