= 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 : * soit avec ip rule / ip route + mangle du firewall * soit avec 1 redirect (technique plus facile) === 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 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 -p tcp --dport 80 -d \! -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 -p tcp -m tcp --dport 80 -j DNAT --to-destination :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@ upalert mail.alert -S "google.com de retour" root+mon@ alertevery 3h alertafter 30m period wd {Sat-Sun} alert mail.alert -S "google.com : perdu (ADSL HS ?)" root+mon@ upalert mail.alert -S "google.com de retour" root+mon@ 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 {{{ #!/bin/bash echo "`date` : Routage ADSL" >> /var/log/mon/adsl route add -net 0.0.0.0 netmask 128.0.0.0 gw route add -net 128.0.0.0 netmask 128.0.0.0 gw echo "Routage ADSL validé" >> /var/log/mon/adsl }}} # vi /usr/lib/mon/alert.d/deroutage-adsl.alert {{{ #! /bin/sh 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 # route add -net 128.0.0.0 netmask 128.0.0.0 gw Puis rajouter ces lignes dans la config de l'interface réseau connectée à l'ADSL. {{{ iface adsl inet static address netmask gateway up ip route add 74.125.67.100/32 via up ip route add 0.0.0.0/1 via up ip route add 128.0.0.0/1 via }}} 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.