Routage ADSL + LS avec mon

Le but de la manœuvre est de gérer intelligemment un site avec 2 liaisons : une ADSL et une LS. On divise donc notre trafic en deux, une partie est routée via la LS et l'autre via l'ADSL. Et en cas de panne de l'ADSL, le trafic destiné initialement à l'ADSL devra passer par la LS.

On suppose dans notre cas qu'on a un firewall qui a toutes les routes de notre réseau, et un serveur cache web sur lequel tourne squid.

Côté Firewall

Le tout est de rediriger les paquets http (port 80) vers le serveur cache qui exécute squid.

2 techniques :

Cas 1

Création de la table de routage :

# vi /etc/iproute2/rt_tables

Puis ajouter le nom de la table avec le numéro lui correspondant.

Par exemple : sur une ligne, on peut écrire :  201 cache 

Mais cela ne crée pas encore la table. Pour créer la table, il faut utiliser la commande ip rule :

# ip rule add fwmark 7 table cache

La table est maintenant créée, mais elle est vide, et elle sera utilisée pour router les paquets marqués 7

Ensuite, on ajoute une route dans cette table de routage pour que les paquets routés avec cette table partent vers le serveur cache :

# ip route add default via <IPServeurCache> La table est donc créée et peuplée.

Ajout d'une règle mangle dans le firewall pour marquer les paquets web de la marque 7.

# iptables -t MANGLE -A PREROUTING -i <interface_IN> -p tcp --dport 80 -d \!<IPLAN> -j MARK --set-mark 7

Allez sur le serveur cache et faire une redirection de ce qui arrive sur le port 80 vers le port d'écoute du squid :

# iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

Note : Avec cette technique, on peut faire passer d'autres types de paquets par le serveur cache sans que ceux-ci ne tapent dans squid, en les marquant ces paquets sur le firewall, puis en faisant un masquerade sur le cache. Exemples de paquets 443 et 1935.

Cas 2 : le redirect depuis le firewall

# iptables -t nat -A PREROUTING -i <interface_IN> -p tcp -m tcp --dport 80 -j DNAT --to-destination <IPServeurCache>:3128

Côté serveur cache

Donc là, on est sûr que le firewall fait bien son boulot et nous envoie sur ce serveur les paquets web. Il suffit donc tout simplement de router ces paquets avec une ou plusieurs routes sur la (ou les) ADSL.

Je traite donc du cas d'une ADSL qui est le cas le plus courant.

On pourrait mettre une seule route par défaut directe sur l'interface ADSL, mais ça serait vraiment couillon de continuer à essayer d'envoyer des paquets vers cette interface si l'ADSL tombe en panne alors qu'on a une autre liaison LS de surcroît.

L'astuce, c'est d'avoir des routes plus spécifiques sur les ADSL, et une route par défaut sur la LS. Quand l'ADSL est bonne, on monte les routes spécifiques et tout le trafic passe par elle, parcontre lorsque l'ADSL tombe, on retire les routes spécifiques et il ne reste que la route par défaut vers la LS (qui est le routeur central ou firewall).

Ce travail peut être fait à la main (enlever et remettre les routes), mais il peut aussi être fait automatiquement en utilisant un logiciel (par exemple le programme mon).

Mon peut périodiquement tester l'ADSL en pinguant un point précis d'internet qui est toujous up (par exemple google.com ou mit.edu). En cas, de panne, elle exécute une commande qui retire les routes, et en cas de retour, elle exécute une commande qui ajoute les routes.

# aptitude install mon # vi /etc/mon/mon.cf

serverbind = localhost 

dep_behavior    m 

# c'est une IP de google.com
hostgroup adsl 74.125.67.100

watch adsl 
    service ping 
        description ping verification adsl 
        interval 30s 
        monitor fping.monitor 
        period wd {Mon-Sun} 
            alert deroutage-adsl.alert 
            upalert routage-adsl.alert 
            alertafter 2 
            numalerts 1 
        period wd {Mon-Fri} 
            alert mail.alert -S "google.com : perdu (ADSL HS ?)" root+mon@<domain >
            upalert mail.alert -S "google.com de retour" root+mon@<domain> 
            alertevery 3h 
            alertafter 30m 
        period wd {Sat-Sun} 
            alert mail.alert -S "google.com : perdu (ADSL HS ?)" root+mon@<domain> 
            upalert mail.alert -S "google.com de retour" root+mon@<domain> 
            alertevery 3h 
            alertafter 6h 
            numalerts 1 

Le ping est envoyé toutes les 30 secondes, et en cas de problèmes, le programme deroutage-adsl.alert est lancé, en cas de retour sur problème, c'est le programme routage-adsl.alert qui est lancé. Ces programmes sont dans : /usr/lib/mon/alert.d/

# vi /usr/lib/mon/alert.d/routage-adsl.alert

echo "`date` : Routage ADSL" >> /var/log/mon/adsl 

route add -net 0.0.0.0 netmask 128.0.0.0 gw <IP_via_ADSL> 
route add -net 128.0.0.0 netmask 128.0.0.0 gw <IP_via_ADSL>

echo "Routage ADSL validé" >> /var/log/mon/adsl 

# vi /usr/lib/mon/alert.d/deroutage-adsl.alert

echo "`date` : Deroutage" >> /var/log/mon/adsl 

/sbin/route del -net 0.0.0.0 netmask 128.0.0.0 
/sbin/route del -net 128.0.0.0 netmask 128.0.0.0 

echo "Deroutage validé" >> /var/log/mon/adsl 

Ne pas oublier de rendre ces deux scripts exécutables.

Note :

Pour terminer, il faut initialiser la table de routage du serveur cache, en ajoutant ces deux routes :

# route add -net 0.0.0.0 netmask 128.0.0.0 gw <IP_via_ADSL>

# route add -net 128.0.0.0 netmask 128.0.0.0 gw <IP_via_ADSL>

Puis rajouter ces lignes dans la config de l'interface réseau connectée à l'ADSL.

iface adsl inet static
    address <IP>
    netmask <mask>
    gateway <IPVersLSCertainement>
    up ip route add 74.125.67.100/32 via <IPviaADSL>
    up ip route add 0.0.0.0/1 via <IPviaADSL>
    up ip route add 128.0.0.0/1 via <IPviaADSL>

Comme la route vers google.com (74.125.67.100) n'est jamais retirée de la table de routage, même en cas de coupure d'ADSL et de reprise via LS, le ping vers 74.125.67.100 passera toujours par l'ADSL et ne fonctionnera que lorsque l'ADSL redeviendra up.

ZAO/RoutageADSLviaLS (dernière édition le 2009-08-25 09:32:28 par RogerYerbanga)