Multi route

De BlaxWiki
Aller à la navigationAller à la recherche


Problématique[modifier]

Ce que j'appéle le multihoming / multi route est le fait qu'une machine appartienne à plusieurs réseaux et qu'elle ait des gateway par default sur plusieurs d'entre eux. Les serveurs ont 2 reseaux de services. L'un pour effectuer les requetes, l'autre pour y repondre. Le probleme pour les equipements devant pouvoir repondre a l'exterieur mais aussi s'y connecter est que de base, il ne peut pas y avoir plusieurs gateway. Il faut donc mettre en place le multihoming sur les serveurs.

Explication et mise en pratique[modifier]

  • Config générique

10.252.40.0/22	gw 10.252.40.190  NOLB ETH0
10.252.43.0/24	gw 10.252.40.254  LB ETH1

Interface connectee a sw-nolb
creer un fichier /etc/sysconfig/network-scripts/rule-eth0 contenant
from <ip de l'interface>/32 table 200
to <ip de l'interface>/32 table 200

Creer/modifier le fichier route-eth0 pour ajouter les lignes suivantes
10.252.40.0/22 via <gateway de l'interface>
10.252.40.0/22 via <gateway de l'interface> table 200
<reseau de l'interface>/26 dev eth0 table 200
default via <gateway de l'interface> table 200


Interface connectee a sw-lb
creer un fichier /etc/sysconfig/network-scripts/rule-eth1 contenant
from <ip de l'interface>/32 table 300
to <ip de l'interface>/32 table 300

Creer/modifier le fichier route-eth1 pour ajouter les lignes suivantes
10.252.43.0/24 via <gateway de l'interface> 
10.252.43.0/24 via <gateway de l'interface> table 300
<reseau de l'interface>/26 dev eth1 table 300
default via <gateway de l'interface> table 300
  • Ici nous avons un serveur qui a 3 ip : eth0 10.252.41.1/26 (connecté au switch nolb, interface qui répond aux requetes de l'extérieur), eth1 10.252.41.65/26 (connecté au switch lb, interface qui recoit les requetes de l'extérieur) et eth2 10.252.5.193/24 (pour l'admin, et c'est aussi sa gw par defaut : 10.252.5.254)

[root@]# cat /etc/sysconfig/network
GATEWAY="10.252.5.254"

[root@]# cat route-eth0
10.252.40.0/22 via 10.252.41.62
10.252.40.0/22 via 10.252.41.62 table 200
10.252.41.0/26 dev eth0 table 200
default via 10.252.41.62 table 200

[root@]# cat rule-eth0
from 10.252.41.1/32 table 200
to 10.252.41.1/32 table 200

[root@]# cat route-eth1
10.252.43.0/24 via 10.252.41.126
10.252.43.0/24 via 10.252.41.126 table 300
10.252.41.64/26 dev eth1 table 300
default via 10.252.41.126 table 300

[root@]# cat rule-eth1
from 10.252.41.65/32 table 300
to 10.252.41.65/32 table 300

[root@]# ip route show table 200
10.252.41.0/26 dev eth0  scope link
10.252.40.0/22 via 10.252.41.62 dev eth0
default via 10.252.41.62 dev eth0

[root@]# ip route show table 300
10.252.41.64/26 dev eth1  scope link
10.252.43.0/24 via 10.252.41.126 dev eth1
default via 10.252.41.126 dev eth1

[root@]# route -n (il affiche les routes 'classiques')
10.252.41.0     0.0.0.0         255.255.255.192 U     0      0        0 eth0
10.252.41.64    0.0.0.0         255.255.255.192 U     0      0        0 eth1
10.252.43.0     10.252.41.126   255.255.255.0   UG    0      0        0 eth1
10.252.5.0      0.0.0.0         255.255.255.0   U     0      0        0 eth2
10.252.40.0     10.252.41.62    255.255.252.0   UG    0      0        0 eth0
0.0.0.0         10.252.5.254    0.0.0.0         UG    0      0        0 eth2

Explication OLD[modifier]

Pour ce faire, Linux nous fourni l'outil iproute2. Pour l'utiliser, cela consiste à créer des tables de routage différentes pour chaque interface et d'utiliser la bonne table au bon moment. Donc, tout d'abord on définit nos diffèrentes tables dans un fichier de lookup (à la /etc/hosts), il permet d'associer un nom à un numéro de table. On ne peut avoir que de 0 à 255 tables dont un certain nombre sont prédéfinies :

cat /etc/iproute2/rt_tables

# reserved values
#
255     local
254     main
253     default
#0      unspec

#
# local
#
201 monreseau1
202 monreseau2

Il faut ensuite ajouter les entrées associées a chacune des tables de routage. Celles-ci consistent généralement à la definition du bloc de l'interface associée et de la route par défaut via cette interface

  1. ip route add 217.174.193.128/28 dev eth0.401 src 217.174.193.131 table monreseau1
  2. ip route add default via 217.174.193.142 table monreseau1

A cela, il faut rajouter une régle qui va définir que les packets qui proviennent de notre interface vont utiliser cette table de routage plutôt que la table de routage globale

  1. ip rule add from 217.174.193.131 table monreseau1

Là encore, c'est bien sympa ces commandes, mais avoir à les taper à chaque démarrage, c'est un peu lassant.

Pour faire problème cette configuration, on va utiliser le script optionnel de démarrage réseau de Redhat : /sbin/ifup-local, dont le contenu est le suivant :


#!/bin/bash
# Network Interface Configuration System
# Copyright (c) 2005 toutour <toutour@agarik.com>
#
# This software may be freely redistributed under the terms of the GNU
# public license.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

DEVICE=${1}

[ ! -f /etc/sysconfig/network-scripts/ifcfg-$DEVICE ] && exit 0;
. /etc/sysconfig/network-scripts/ifcfg-$DEVICE

[ "foo$TABLENAME" = "foo" ] && exit 0;
ip route add ${NETWORK}/28 dev ${DEVICE} src ${IPADDR} table ${TABLENAME}
ip route add default via ${GATEWAY} table ${TABLENAME}
ip rule add from ${IPADDR} table ${TABLENAME}

En plus de ce script, il faut rajouter la ligne suivante dans le fichier de configuration de l'interface pour préciser la table de routage qui doit être utilisée pour l'ajout de la configuration multihoming

TABLENAME=monreseau1

Il faut bien laisser la ligne GATEWAY dans chacun des fichiers de configuration des interfaces.

La valeur qui sera utilisée par le système pour la table de routage globale sera celle de la dernière interface montée. mais cette valeur spécifique nous est peu importante dans notre problèmatique.

Mise en pratique OLD[modifier]

Dans cet exemple et dans ces cas de multihome, on ne mettra pas de regle sur l interface qui a la gw par default (ici celle du vlan 404)

  • Fichier /etc/network/interface :
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
      up ethtool -s eth0 duplex full speed 100 autoneg off

auto eth0.401
iface eth0.401 inet static
      address 217.174.193.129
      netmask 255.255.255.240
      up ip route add default via 217.174.193.142 table vl401
      up ip rule add from 217.174.193.129 table vl401

auto eth0.402
iface eth0.402 inet static
      address 217.174.194.129
      netmask 255.255.255.240
      up ip route add default via 217.174.194.142 table vl402
      up ip rule add from 217.174.194.129 table vl402

auto eth0.403
iface eth0.403 inet static
      address 217.174.195.129
      netmask 255.255.255.240
      up ip route add default via 217.174.195.142 table vl403
      up ip rule add from 217.174.195.129 table vl403

auto eth0.404
iface eth0.404 inet static
      address 217.174.202.145
      netmask 255.255.255.240
      gateway 217.174.202.158

auto eth0.7
iface eth0.7 inet static
      address 217.174.210.80
      netmask 255.255.255.192
      up ip route add default via 217.174.210.126 table vl7
      up ip rule add from 217.174.210.80 table vl7
  • #cat /etc/iproute2/rt_tables
201     vl7
202     vl401
203     vl402
204     vl403
205     vl404
  • # ip route
217.174.195.128/28 dev eth0.403  proto kernel  scope link  src 217.174.195.129
217.174.194.128/28 dev eth0.402  proto kernel  scope link  src 217.174.194.129
217.174.193.128/28 dev eth0.401  proto kernel  scope link  src 217.174.193.129
217.174.202.144/28 dev eth0.404  proto kernel  scope link  src 217.174.202.145
217.174.210.64/26 dev eth0.7  proto kernel  scope link  src 217.174.210.80
default via 217.174.202.158 dev eth0.404
  • # ip rule
0:      from all lookup local
32760:  from 217.174.195.129 lookup vl403
32761:  from 217.174.194.129 lookup vl402
32762:  from 217.174.193.129 lookup vl401
32763:  from 217.174.193.129 lookup vl401
32764:  from 217.174.210.81 lookup vl7
32765:  from 217.174.210.80 lookup vl7
32766:  from all lookup main
32767:  from all lookup default
  • # netstat -rn
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic   MSS Fenêtre irtt Iface
217.174.195.128 0.0.0.0         255.255.255.240 U         0 0        0   eth0.403
217.174.194.128 0.0.0.0         255.255.255.240 U         0 0        0   eth0.402
217.174.193.128 0.0.0.0         255.255.255.240 U         0 0        0   eth0.401
217.174.202.144 0.0.0.0         255.255.255.240 U         0 0        0   eth0.404
217.174.210.64  0.0.0.0         255.255.255.192 U         0 0        0   eth0.7
0.0.0.0         217.174.202.158 0.0.0.0         UG        0 0        0   eth0.404