Multi route
Problématique
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
- 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
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
- ip route add 217.174.193.128/28 dev eth0.401 src 217.174.193.131 table monreseau1
- 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
- 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
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