Routage avec deux cartes réseaux

Pour les serveurs qui possèdent 2 cartes ethernet avec des adresses IP dans des VLAN différents et sans configuration supplémentaire, les trames IP qui arrivent sur l’interface eth1 ont les réponses qui partent sur eth0, qui est l’interface qui dispose de la gateway par défaut.

Ceci peut poser des problèmes de routage et de contrôle des accès.

Pour remédier à cela, je vous propose une solution qui à l’air de fonctionner et fait passer les trames aller/retour sur la même interface:

1) ajouter dans le fichier /etc/iproute2/rt_tables les lignes “<numéro table> <nom table>”

2) Si un serveur du vlan eth1 se connecte à l’adresse eth0 du serveur, pour que les paquets retour de la connexion utilisent l’interface eth0 comme les paquets aller et non eth1:

ip route add default via <gateway vlan eth0> dev eth0 table <nom table 1>
ip rule add from <vlan eth0> to <vlan eth1> table <nom table 1> priority <niveau 1>

3) Pour une connexion entre 2 serveurs du vlan eth1, pour que les paquets passent par l’interface eth1 sans contacter la gateway d’eth1 qui sera définie dans la règle suivante et éviter ainsi le filtrage de la gateway:

ip route add dev eth1 table <nom table 2>
ip rule add from <vlan eth1> to <vlan eth1> table <nom table 2> priority <niveau 2>

4) Si un serveur hors du vlan eth1 se connecte à l’adresse eth1 du serveur, pour que les paquets retour passent par eth1 et non la default gateway de eth0.

ATTENTION: cette règle doit obligatoirement avoir un niveau de priorité supérieur à la règle précédente:

ip route add default via <gateway vlan eth1> dev eth1 table <nom table 3>
ip rule add from <vlan eth1> table <nom table 3> priority <niveau 2> + 1

5) faire un flush des routes:

ip route flush cache

6) pour que les définitions soient ajoutées/supprimées lors des activations/désactivations des interfaces, il faut créer les scripts shell /sbin/ifup-local et /sbin/ifdown-local.

Le premier script contiendra les règles vues précédemment et le second les même règles en modifiant “add” par “del”.

Ces scripts sont automatiquement appelés par les scripts de manipulation des interfaces réseaux et sont lancés avec comme paramètre le nom de l’interface.

Dans les scripts c’est le test de ce paramètre (exemple eth1) qui permettra de créer/supprimer les règles de routage.

Les commandes pour vérifier la configuration:

  1. pour voir les règles: ip rule show

  2. pour voir le routage: ip route show table vlan124

Exemple d’un serveur avec le vlan 51 sur eth0 et le vlan 124 sur eth1:

1) fichier rt_tables:

51 	vlan51
124	vlan124
125	vlan124out

2) Pour que les paquets qui sortent de 10.144.51 vers 10.144.124 utilisent eth0 et non eth1 (cas des paquets retour d’une connexion d’un serveur 10.144.124 vers l’interface 10.144.51)

ip route add default via 10.144.51.254 dev eth0 table vlan51
ip rule add from 10.144.51.0/24 to 10.144.124.0/22 table vlan51 priority 51

3) Pour que les paquets de 10.144.124 vers 10.144.124 passent par l’interface eth1 sans contacter la gateway

ip route add dev eth1 table vlan124
ip rule add from 10.144.124.0/22 to 10.144.124.0/22 table vlan124 priority 124

4) Pour que les paquets qui sortent de 10.144.124 passent par eth1 et la gateway (cas d’une connexion d’un poste hors vlan 124 vers le vlan 124) avec nécessairement une priorité supérieure à la règle précédente

ip route add default via 10.144.127.254 dev eth1 table vlan124out
ip rule add from 10.144.124.0/22 table vlan124out priority 125

											
Ce billet a été posté dans geekerie, réseau. Bookmark le permalink.

10 commentaires sur “Routage avec deux cartes réseaux

  1. Bonjour,

    J’ai un serveur possédant 2 cartes réseaux avec des adresses publiques. Sur eth0, j’ai tout le traffic web et sur eth1, tout le traffic d’une application métier. Le hic, c’est que lorsque je lance un ping, de l’extérieur, les deux interfaces me répondent. Comment puis-je « binder » l’accès venant de tout le monde (internet), à destination de l’ip eth1 à rester sur cette interface ?

    Je suis beaucoup plus système que réseau, et j’essai de comprendre comment fonctionne tout ça.

    Merci d’avance pour votre aide.

  2. Bonjour,

    J’ai du mal a comprendre ton architecture. Un ping se faisant sur une adresse IP, seule la carte ayant cette adresse ip affectée répond.
    Peux tu détailler cela un peu plus ?

  3. J’ai en fait 2 interfaces reseau sur mon serveur (serveur dedibox). Sur chaque interface, une adresse IP publique, un netmask et une gateway sont configurées.

    sur 2 terminaux (en ssh), je lance un tcpdump sur chaque interface : tcpdump -i ethx not port ssh and icmp

    depuis mon poste de travail, je lance un ping sur l’adresse assignée à eth0. C’est niquel, la requête arrive sur eth0 et la réponse se fait par eth0.

    lorsque je ping l’adresse assignée à eth1, je vois les deux tcpdump s’activer en même temps. Les deux interfaces sont sollicités. En lisant le tuto plus haut, je comprend que la requête entre bien par eth1, mais la réponse se fait par eth0.

    En gros, je voudrai arriver à rester sur l’interface sollicité par la personne distante (internaute ou autres).

    J’espère m’être mieux exprimé, et que vous pourrez m’aider.

  4. De ce que je sais, il n’existe 2 interfaces réseaux physiques sur les Dedibox que sur la gamme Dedibox Pro.

    Ne confonds tu pas avec une interface aliasée ? (i.e. 1 carte réseau physique, 1 interface eth0 et une interface aliasée de type eth0:1).

    S’il y a deux interfaces physiques et que c’est l’eth0 qui renvoie les requetes c’est un probleme de routage normal (gateway par defaut sur une interface) tel qu’expliqué dans le billet.

  5. C’est bien cela. Je travaille sur une dedibox pro.

    J’ai tenté d’ajouter une table dans le fichier rt_tables :

    1 int1 # interface eth1

    et j’ajoute la route comme dans le billet :
    root@zola:~# ip route add default via 88.x.x.1 dev eth1 table int1
    RTNETLINK answers: File exists

    Le fichier interface doit-il contenir une ligne gateway sur l’interface eth1 ?

  6. vu que tu passes tout a la main, la ligne gateway n’a pas d’interet ici.
    que donne un ip rule show ?
    C’est pas évident de te guider sans la table de routage, les regles ip et les priorités.

  7. serait-il possible de vous donner accès au serveur ? De ce fait, vous pourriez m’expliquer comment configurer les routes.

    ip rule show ne renvoi rien.

  8. ip rule show doit retourner quelque chose.
    Votre confiance en moi est sympathique mais je me dois de décliner :-) Pour manipuler les routes il faut être… root.
    Reprenez le billet calmement et préparer un fichier contenant toutes les informations (ifconfig, route -n, etc…). Je vous contacterais par email quand ce sera fait et y jetterez un oeil si j’ai un peu de temps libre.

  9. Merci pour votre aide.

    Je vais reprendre le billet à zéro, et préparer un fichier txt avec toutes les infos nécessaire.

    la commande ip rule show ainsi que ip rule liste ne renvoi rien. Par contre toutes les routes semblent être configurées dans le main.

    Merci encore pour votre aide.

  10. Bonjour,

    Je reviens sur votre blog, pcq je n’ai toujours pas trouvé de solution viable pour mon problème de réseau. J’ai réussi cependant avec séparé les requêtes des deux cartes réseaux en utilisant le script de cette personne : http://blog.hacky.info/index.php/post/2009/03/29/Configuration-routage-sur-dedibox-pro

    Le hic, c’est que quelques minutes après, les requêtes (entrantes et sortantes) sont de nouveau mélangées et il faut réexécuter le script (un peu bizarre puisque la table de route est bonne).

    De plus, chaque interface a un rôle bien définie. Je ne voudrai pas que lorsqu’une requête arrive sur eth0, il y ait une requête sortante du serveur sur eth1. C’est le cas avec bind. Je fais une requête sur eth0, la réponse à cette requête ressort bien par eth0, mais mon serveur bind faire une requête à son tour vers ses forwarders. Et celle là sort par eth1. Si je pars du principe que sur eth1 il y a de la VoIP par exemple, alors je dois empecher les requetes autres que du flux voip sur eth1.

    Je ne vois pas comment résoudre mon problème, alors si vous avez une piste, ça m’interesse fortement.

    Bonne soirée.