Configuration routage sur dedibox pro
Par hacky le dimanche, mars 29 2009, 20:51 - Howto - Lien permanent
Aie aie... Le dernier post sur ce blog date d'aout 2008... C'est honteux ! 
Voici un petit quelque chose qui devrait ravir les utilisateurs de dedibox pro...
Ce serveur possède deux interfaces réseau et donc deux IP publiques. Chaque interface utilise une passerelle par défaut différente pour des raisons de sécurité.
Or, par défaut, la configuration des interfaces est spéciale... Si vous établissez une connexion sur l'ip de la seconde interface réseau (eth1), le trafic sortant va intégralement passer par eth0 !
Pourquoi ? Et bien parce que dans la table de routage, la première passerelle par défaut est eth0 
Votre serviteur a une solution : jouer avec iproute pour faire comprendre au système comment router les paquets.
Commencez tout d'abord par installer le paquet iproute si ce n'est pas déjà fait :
# aptitude install iproute
Repérez vos deux IP ainsi que vos deux passerelles (les IP suivantes ont été choisies arbitrairement) :
# ifconfig | grep 'inet adr' inet adr:88.191.88.2 Bcast:88.191.88.255 Masque:255.255.255.0 inet adr:88.191.90.2 Bcast:88.191.90.255 Masque:255.255.255.0 # route -n 88.191.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 88.191.90.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 0.0.0.0 88.191.88.1 0.0.0.0 UG 0 0 0 eth0 0.0.0.0 88.191.90.1 0.0.0.0 UG 0 0 0 eth1
Première étape, on crée deux tables de routage spécifiques, une pour chaque interface. Pour cela éditez le fichier /etc/iproute2/rt_tables avec votre éditeur favori, et ajoutez en fin de fichier les lignes suivantes :
88 pri 90 sec
Les nombres peuvent être définis à votre convenance, mais je trouve pratique de mettre ici l'avant dernier "bloc" de l'ipv4 pour se repérer.
Ensuite, téléchargez ce script : script de routage dedibox pro et placez le là où il vous chante, personnellement il est dans /etc/network :
# mv routes.sh.txt /etc/network/routes.sh # chmod +x /etc/network/routes.sh
Editez ce script pour y faire figurer les IP de votre serveur. Pour cela changez les variables neteth0, ipeth0, gweth0, neteth1, ipeth1, gweth1. Si vous utilisez une ou plusieurs IP failover, décommentez la ligne 30 et adaptez le contenu.
Lancez ensuite ce script à chaque boot de serveur, via /etc/rc.local par exemple.
Lorsque vous effectuerez une connexion depuis le serveur vers l'extérieur, cette connexion sortira alternativement par eth0 ou eth1. Une demande de connexion depuis l'extérieur vers l'ip d'eth1 du serveur fera bien sortir le trafic par eth1, même topo pour eth0.
Elle est pas belle la vie ? 
Commentaires
Hey hey bonne nouvelle de revoir un billet sur ce blog
Il etait dans mon google reader et jai ete surpris de voir un billet sur ce flux
vivement que c'est le debut d'une nouvelle vague de billets interessants comme les precedents
++
bonsoir !
apres avoir rencontré les memes problemes de routages sur la meme machine et n'avoir rien trouvé sur la toile je me suis bien rejouis de tomber sur ce billet !
malheureusement a l'application les choses ne semblent pas si simples et voila le resultat obtenu !
:~$ sudo /etc/network/routes.sh
Cleaning...
RTNETLINK answers: No such process
RTNETLINK answers: Unknown error 4294967199
RTNETLINK answers: Unknown error 4294967199
Applying network config...
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: Unknown error 4294967199
RTNETLINK answers: Unknown error 4294967199
RTNETLINK answers: Invalid argument
j'ai evidement du, mal faire quelque chose , si tu pouvais me donner un petit coup de main j'en serai ravi !
merci d'avance
cordialement
corwin
@corwin: tu dois avoir un noyau 2.6.24 qui a un bug avec les commandes "ip rule".
Je te conseille de mettre un noyau plus récent, celui de lenny (2.6.26) va tout seul
Bonjour,
je suis sur dedibox pro avec un noyau en 2.6.26 (compilé à la main) :
octi:/mnt/stockage/routes# uname -a
Linux octi 2.6.26dedibox-r9-smp-x32 #1 SMP Fri May 15 19:17:00 CEST 2009 i686 GNU/Linux
Lorsque j'exécute le script, j'ai les mêmes erreurs que corwin :
octi:/mnt/stockage/routes# ./routes.sh
Cleaning...
RTNETLINK answers: No such process
RTNETLINK answers: Address family not supported by protocol
RTNETLINK answers: Address family not supported by protocol
Applying network config...
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: Address family not supported by protocol
RTNETLINK answers: Address family not supported by protocol
RTNETLINK answers: Invalid argument
Je ne vois pas d'où vient le prob. Je voudrai ce souci de réseau avant de commencer les installation des autres applications.
Auriez-vous une idée svp ? J'espère que vous pourrez m'aider.
@azer: non, ce ne sont pas les mêmes erreurs...
Les "file exists" sont normaux, il se peut que des règles existent déjà avant le passage du script. En fait il faudrait totalement vider les routes pour tout recréer, mais il y a un risque de perdre la connexion SSH
Par contre les "Address family not supported by protocol" ne sont pas normaux. Je te conseille de mettre des echo de debug dans le script shell pour repérer quelles commandes génèrent ces erreurs. On pourra avancer sur une correction de problème avec ça.
peut-on se parler via jabber, irc ou encore msn ? J'ai le serveur parfait pour sortir la nouvelle version de votre script, mais via ces messages, ce ne serait pas pratique :s
S'il y a perte de connexion, alors la console est là pour rebooter le serveur et le mode rescue au pire des cas.
Et d'un point de vue sécurité, je préfèrerai que les adresses IP ne trainent pas sur le net :p
@azer : Je ne vois pas pourquoi je sortirai une nouvelle version du script, il fonctionne très bien sur tous les serveurs dedibox pro de mes clients
Je pense que c'est plutot un souci de config du script ou que tu n'as pas mis ce qu'il fallait dans le rt_tables.
Je mets ça ici à titre informatif, pour le "SAV" plus poussé je t'invite à me contacter de façon professionnelle via http://www.si7v.fr (je suis infogérant agréé dedibox).
Bon week end.
J'ai fait du copier/coller, et j'ai juste changé les variables liées à mes deux cartes réseaux. Mon fichier rt_tables contiennent bien les deux lignes
88 pri
90 sec
enfin bon. merci quand même.
@azer : si tu es sous Debian, essaye de mettre le kernel officiel Debian lenny alors...
Je suis sur debian lenny :
root@dedi:/etc/network# cat /etc/debian_version
lenny/sid
Par contre j'ai recompilé le kernel pour passer en 2.6.26. Je vais essayer de repasser en 2.6.25.4dedibox par défaut pour voir. Mais lorsque j'exécute le script je perds mes connexions au serveur, et j'ai un souci ipmi que j'essai de résoudre avec le support. Alors pour l'accès à la console, c'est pas top :s
@azer: alors ne t'embête pas, installe le kernel debian officiel (2.6.26-2) qui fonctionne parfaitement sur dedibox pro
Je suis en train de réinstaller la box, car je voulais refaire mes partitions. Mais apparemment sur la dernière debian (5) de dedibox, les partions étendues ne semblent pas fonctionner.
Le support me conseille de ne pas en faire, ou d'installer from scratch. Enfin bon. Je vais finir cette installation, et je réessai le script.
merci pour votre aide.
Bonjour,
Après un peu de temps, j'ai enfin pu configurer le serveur avec le script. Je n'ai pas eu beaucoup de temps pour faire mes tests, mais bon ... ça fonctionne
Par contre, je me demandais comment obliger tout ce qui sort par l'interface eth0 au lieu de faire sortir de manière alternée sur eth0 puis sur eth1. Je me suis mis un serveur bind que j'attaque par ma carte eth0, mais bind fait une requête vers les forwarders de dedibox. Donc ma requête entrée/sortie reste bien sur eth0, mais celle du serveur vers les dns de free passe par eth1.
J'ai pensé à faire une règle de routage en dur, mais bon, ce n'est peut-être pas la solution.
bonjour !
apres un peu de temps le routage des deux eth fonctionne !
merci
mon seul probleme reste la sortie du traffic alternée !!
n'y aurai t'il pas moyen de "fixér" par exemple pour un user0 le traffic sur eth0 et de meme avec eth1 et un user1 ?
merci d'avance pour vos reponses
corwin