Balancement de charge sur 2 cartes réseau
Un article de Wiki SOS-ADMIN.
Voici un script qui permet de réaliser du load balancing sur 2 ISP (connectés forcément sur 2 cartes réseaux différentes)
Il est de même possible d'utiliser ce script pour utiliser "le bon chemin" sur un serveur contenant 2 cartes réseaux sur 2 IP différentes (la réponse à une requête d'un client doit se faire par la même interface). Ceci est entre autre très utile par exemple pour un serveur HTTP qui reçoit des requêtes sur les 2 interfaces (par exemple avec un DNS RoundRobin).
Il est nécessaire d'utiliser pour cela le programme "ip" (disponible dans le package "iproute" sous debian par exemple, aussi connu en tant que iproute2... je vous laisse trouver pour vos distributions respectives). Pour un bon fonctionnement, les options kernel CONFIG_NETLINK et CONFIG_NETLINK_DEV (ou CONFIG_RTNETLINK) doivent être activées. La plupart des kernel "hébergeurs" pour SD doivent l'intégrer, je pense.
#!/bin/bash
# CONFIGURATION
IP=/sbin/ip
#--------------- LINK PART -----------------
# EXTIFn - nom interface
# EXTIPn - IP externe
# EXTMn - netmask length (bits)
# EXTGWn - gateway de l'interface n
# EXTRTn - routeur après la gateway de n (permet de faire du keealive de l'interface)
#-------------------------------------------
# LINK 1
EXTIF1=eth2
EXTIP1=192.168.3.1
EXTM1=24
EXTGW1=192.168.3.254
EXTRT1=81.57.222.254
# ici EXTRT1 donne un routeur chez Free
# LINK 2
EXTIF2=eth1
EXTIP2=192.168.2.1
EXTM2=24
EXTGW2=192.168.2.254
EXTRT2=193.253.160.3
# ici EXTRT2 donne un routeur chez Wanadoo
# Routage
# on supprime les anciennes règles et routes
echo "suppression ancienne règles"
${IP} rule del prio 50 table main
${IP} rule del prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule del prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} rule del prio 221 table 221
echo "flushing tables"
${IP} route flush table 201
${IP} route flush table 202
${IP} route flush table 203
${IP} route flush table 204
${IP} route flush table 221
echo "suppression tables"
${IP} route del table 201
${IP} route del table 202
${IP} route del table 203
${IP} route del table 204
${IP} route del table 221
# On établit les nouvelles règles
echo "Nouvelles règles de routage"
# table principale (main) sans aucune route par défaut
${IP} rule add prio 50 table main
${IP} route del default table main
# routes "identifiées"
${IP} rule add prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule add prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} route add default via ${EXTGW1} dev ${EXTIF1} src ${EXTIP1} proto static table 201
${IP} route append prohibit default table 201 metric 1 proto static
${IP} route add default via ${EXTGW2} dev ${EXTIF2} src ${EXTIP2} proto static table 202
${IP} route append prohibit default table 202 metric 1 proto static
# Partie de configuration mutli lien et load balancing
echo "Balancement de charge des liens en sortie"
${IP} rule add prio 221 table 221
# Ici le poid est de 4 pour le 1er lien et de 1 pour le 2ème
# cela siginifie (en gros) que pour 4 routes envoyées sur le lien 1, 1 seule va sur le 2eme
# toujours mettre les valeurs les plus petites possible (pas de 400 et 100 par exemple)
${IP} route add default table 221 proto static \
nexthop via ${EXTGW1} dev ${EXTIF1} weight 4\
nexthop via ${EXTGW2} dev ${EXTIF2} weight 1
echo "Flush du cache"
${IP} route flush cache
# routes pour routeur ISP (pour le ping de maintien de lien)
ip route add ${EXTRT1} via ${EXTGW1} dev ${EXTIF1}
ip route add ${EXTRT2} via ${EXTGW2} dev ${EXTIF2}
Dans le cas du script précédent, les 2 interfaces sont "montées" sur le load balancing. Par contre, suite à une détection de l'indisponibilité de l'une d'entre elle, elle risque de ne pas redevenir "active" quand le lien sera de nouveau disponnible. Les 2 dernières lignes permettent de forcer le passage par l'un ou l'autre des 2 ISP. Le script suivant va donc faire un ping toutes les minutes en passant par chacune des interfaces. Il suffit de le lancer en tache de fond. Ceci permet de réactiver une interface lorsque celle-ci a été écartée du load balancing et qu'elle redevient utilisable (Ok, c'est pas super propre le ping toutes les minutes comme ça, mais ça marche !)
#!/bin/bash
PING=/bin/ping
#--------------- LINK PART -----------------
# EXTRTn - routeur ISP
#-------------------------------------------
# LINK 1
EXTRT1=81.57.222.254
# LINK 2
EXTRT2=193.253.160.3
while : ; do
${PING} -c 1 ${EXTRT1}
${PING} -c 1 ${EXTRT2}
sleep 60
done

