Routage 0.0.0.0 + route de secours et test des routes

Bonjour à tous,

J’ai une question très bête:

Comment tester sa connectivité à internet quand on est derrière une box et faire en sorte que la route par défaut change en cas de problème sur un fournisseur d’accès? Je demande car les interfaces seront toujours up et bien configurées. Il faut donc tester la route (une route) et non pas l’état de l’interface.

Ex:
Debian01 eth0 => Box A (fibre) => acces internet par défaut
Debian01 eth1 => Box B (Adsl) => acces internet de secours

Si l’accès à internet via la Box A est perdu, la route via la Box B devient la bonne route pour internet. Dès que l’accès via la box A revient, tout redient comme avant.

J’espère avoir été assez claire.

Merci,
Vandman

La question n’est pas triviale du tout. Pour tester la connectivité d’un lien, il faut envoyer quelque chose et recevoir une réponse par ce lien, par exemple avec un ping. Mais ce n’est pas si simple, voici notamment quelques problèmes à résoudre :

  • le ping doit être routé par le lien à tester ; dans le cas du lien de secours, il faut donc une route spécifique pour forcer le routage de cette destination par le lien de secours ;
  • l’hôte distant sollicité peut être injoignable sans que le lien lui-même soit tombé ; il faudrait donc solliciter plusieurs hôtes (un jeu différent pour chaque lien), leur choix est déterminant pour éviter les faux positifs ;
  • l’hôte distant sollicité peut ne pas répondre à chaque sollicitation (répondre au ping n’est pas une priorité, les pertes de paquets peuvent se produire même avec une bonne connectivité) ; il faudrait donc introduire une certaine tolérance et ne pas déclarer le lien tombé à la première absence de réponse.

Et je ne parle même pas de la gestion des cas limite, par exemple la connectivité d’un lien peut être fortement dégradée (débit réduit, latence augmentée, pertes de paquets importantes) sans que celui-ci soit totalement hors service. Que faut-il faire dans un tel cas et comment le détecter ?

Bonjour PascalHambourg

Ca je savais plus ou moins car j’ai eu le cas sur un routeur Cisco. Ca fonctionne.

Je pingerai le next hop après ma box qui doit correspondre à un équipement au niveau du DSLAM. J’ai rearqué que le next hop après la box ne changait jamais.

Spécifier leur route via:

route add -net 8.8.8.8 netmask 255.255.255.255 gw 192.168.200.xxx => route 1 route add -net 8.8.4.4 netmask 255.255.255.255 gw 192.168.10.xxx => route 2
Comme ca pas de probleme pour lancer le ping via le bon lien.

Pour ce qui est de la tempo, je suis sure qu’il y a un moyen de faire ca sans trop de difficulté.

Le seul hic, je ne sais pas encore écrire des scriptes…

Cordialement,

[quote=“vandman”]Bonjour à tous,

J’ai une question très bête:

Comment tester sa connectivité à internet quand on est derrière une box et faire en sorte que la route par défaut change en cas de problème sur un fournisseur d’accès? Je demande car les interfaces seront toujours up et bien configurées. Il faut donc tester la route (une route) et non pas l’état de l’interface.

Ex:
Debian01 eth0 => Box A (fibre) => acces internet par défaut
Debian01 eth1 => Box B (Adsl) => acces internet de secours

Si l’accès à internet via la Box A est perdu, la route via la Box B devient la bonne route pour internet. Dès que l’accès via la box A revient, tout redient comme avant.

Vandman[/quote]

Bonjour,

Ta question est loin d’être bête ou triviale.
Ce que tu décris est le mode de fonctionnement dit “failover”, à savoir une route vers un FAI qui doit être la route par défaut et, en cas de panne par cette liaison, l’établissement automatique d’une route de secours, par un autre FAI (qui peu être plus lente, plus chère…). Il ne s’agit pas de l’agrégat de lien (ou bonding).
Une fois identifié le but, une recherche sur google avec wheezy + failover donne des liens intéressants (souvent en anglais):
mindref.blogspot.fr/2010/12/debi … lover.html
Une solution semble passer par l’installation de 2 serveurs DHCP, avec des DNS différents (donc ceux de tes 2 FAI) et l’écriture d’une section failover.
J’espère que cela te mettra sur la piste. Perso, au boulot, j’avais confié cette tâche à un routeur dédié (avec load balancing).

ça ne peut pas être fait de manière automatique.
Par contre tu peux écrire un script qui va tourner tout les X minutes/secondes.

exemple :
ping -c1 l_host_voulu > /dev/null || ( ip route del default ; ip route add default via ip_du_second routeur).
(avec les parenthèses je crois que c’est comme ça mais je suis plus sure …)

Évidement le plus propre serai que les deux box ne soit pas dans le même sous réseau, sinon tu risques de toujours utiliser la même interface.

Bonjour,
Je reviens vers vous pour faire vérifier le script que je pense mettre en place:

Modification du fichier /etc/crontab pour lancer le script toutes les 5 secondes
=> 3600/5 = 720.

[code]# /etc/crontab: system-wide crontab

Unlike any other crontab you don’t have to run the `crontab’

command to install the new version when you edit this file

and files in /etc/cron.d. These files also have username fields,

that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

m h dom mon dow user command

17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/720 * * * * root /root/test_route.sh
[/code]

Tempo de 5 secondes, pendant laquelle on exécute un ping avec comme source eth0. Le ping partira de eth0 et passera par le next hop, mon routeur.
Si pour une raison x, la route passant par le routeur tombe, elle sera changée pour passer directement par la box. Ceci pour avoir acces au routeur via le serveur.
On continura de pinger la destination avec eth0 comme route et des que la route revient, on remet la route.
Il me manque un test à effectuer pour savoir si une route déterminée existe. Car ici, toutes les 5 secondes, je vais réécrire la table de routage, Pas bon???
Donc je voudrai la réécrire uniquement si cette route est présente: route add default gw 192.168.10.254.

Récapitulatif de ma topologie.

…— eth0 -->–routeur–>--
Serveur |…|-- box (192.168.10.254)
…— eth1 -->------------------

[code]#!/bin/bash
target=192.168.10.254
source=eth0

TIME=“5” ;
while true
do
count=$( ping -source $source -c 5 $target | grep icmp* | wc -l )

if [ $count -eq 0 ]
then
echo "Router down! Try again later…"
route del default gw 192.168.200.254
route add default gw 192.168.10.254
else
echo "Yes! Host is Alive!"
route del default gw 192.168.10.254
route add default gw 192.168.200.254
fi

sleep ${TIME}
done[/code]

merci de votre aide.

pas mal,

Déjà si tu lances le script toutes les 5 secondes je ferai pas une boucle toutes les 5 secondes en plus dedans … sinon tu risques de multiplier les lancements du script. Ensuite j’aurai mi un -c 1 pour le test, pas besoin de s’embêter dans un lan comme ça. Ensuite au lieu de faire une variable de count plutot utiliser $?

[code]#!/bin/bash
target=192.168.10.254
source=eth0

ping -I $source -c 1 $target > /dev/null
etat=$?

if [ $etat -eq 1 ] ; then
echo "Router down! Try again later…"
route del default gw 192.168.200.254
route add default gw 192.168.10.254
fi
if [ $etat -eq 0 ] ; then
echo "Yes! Host is Alive!"
route del default gw 192.168.10.254
route add default gw 192.168.200.254
fi[/code]

La j’aime mieux :slightly_smiling:)

Bonjour,

Que pensez vous de ceci?

Désolé j’avance ligne par ligne mais je découvre et pratique en même temps. Ce sera mon 2ème script shell.

[code]#!/bin/bash
target=192.168.10.254
source=eth0
RTR_GW=192.168.200.254
Box_GW=192.168.10.254

ping -I $source -c 1 $target > /dev/null
etat=$?

if [ $etat -eq 1 ] ; then
CURRENT_GW=ip route show | grep default | awk '{ print $3 }' if [ $CURRENT_GW == $RTR_GW]; then echo "Router down! Try again later.." route del default gw 192.168.200.254 route add default gw 192.168.10.254 fi if [ $CURRENT_GW == $Box_GW]; then echo "Router down! Try again later.." echo "route already applied, nothing to be done" fi fi if [ $etat -eq 0 ] ; then CURRENT_GW=ip route show | grep default | awk '{ print $3 }'
if [ $CURRENT_GW == $RTR_GW]; then
echo "Yes! router is Alive!"
echo "route already applied, nothing to be done"
fi
if [ $CURRENT_GW == $Box_GW]; then
echo "Yes! router is Alive!"
route del default gw 192.168.10.254
route add default gw 192.168.200.254
fi

fi[/code]

Ça semble pas mal…
Mais pour exécuter une commande au lieu de ça :

C’est mieux comme ça

Après, tu as deux ip dans 2 réseaux différents sur la même interface réseau ? Si c’est le cas c’est pas top, vaudrai mieux une seconde branchée dans le réseau. Après ça dépend de l’infra réseau …

Bonsoir,

J’ai deux interfaces, une derrière le routeur et l’autre directement branché à la box.

eth0=192.168.200.1
eth1=192.168.10.1

cf.[quote]Récapitulatif de ma topologie.

…— eth0 -->–routeur–>--
Serveur |…|-- box (192.168.10.254)
…— eth1 -->------------------[/quote]

J’ai encore modifié mon fichier pour protéger eth1 d’internet, mais autoriser l’access SSH.

[code]#!/bin/bash
target=192.168.10.254
source=eth0
RTR_GW=192.168.200.254
Box_GW=192.168.10.254

ping -I $source -c 1 $target > /dev/null
etat=$?

if [ $etat -eq 1 ] ; then
CURRENT_GW=$(ip route show | grep default | awk ‘{ print $3 }’)
if [ $CURRENT_GW == $RTR_GW]; then
echo "Router down! Try again later…"
route del default gw 192.168.200.254
route add default gw 192.168.10.254
iptable -F
iptables -A INPUT -p tcp --dport ssh -m state --state NEW,ESTABLISHED -j ACCEPT
fi
if [ $CURRENT_GW == $Box_GW]; then
echo "Router down! Try again later…"
echo "route already applied, nothing to be done"
iptable -F
iptables -A INPUT -p tcp --dport ssh -m state --state NEW,ESTABLISHED -j ACCEPT
fi
fi
if [ $etat -eq 0 ] ; then
CURRENT_GW=$(ip route show | grep default | awk ‘{ print $3 }’)
if [ $CURRENT_GW == $RTR_GW]; then
echo "Yes! router is Alive!"
echo "route already applied, Bloking all incoming transmission on eth1"
iptable -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
fi
if [ $CURRENT_GW == $Box_GW]; then
echo "Yes! router is Alive!"
route del default gw 192.168.10.254
route add default gw 192.168.200.254
iptable -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
fi

fi[/code]
Voila!