[Résolu] Iptables avec 2 modems

Bonjour,

Je teste une double connexion ADSL sur un seul pc:

Eth1 (premier modem) a son ip et son gateway
eth2 (deuxième modem) a son ip et son gateway

Problème : si j’active le gateway de la première carte mais pas le second, le site sur la première fonctionne mais pas celui sur l’autre carte.

Si j’active le gateway sur la deuxième carte et aussi celui de la première, le site qui se trouve sur la seconde carte fonctionne mais plus celui de la première.

Je précise que les 2 cartes sont en ip fix d’un rang différent et avec leur propre gateway.

Une idée de comment faire pour que les 2 connexions fonctionnent sans se mélanger ?

Librement.

Atchoummmmmm

Juste une idée alors. :laughing:

D’abord, un petit mot sur ce qui se passe quand on a deux liens vers l’extérieur avec juste du routage de base et une route par défaut sur un des liens.

En réception, les paquets arrivent par le lien correspondant à l’adresse destination. Normal. Par contre en émission, par défaut les paquets sortent par le lien ayant la route par défaut, quelle que soit l’adresse source. En effet le routage normal ne tient compte que de l’adresse destination, pas de l’adresse source.

Mais à la limite, ça ne devrait pas bloquer les communications avec l’adresse du lien qui n’a pas la route par défaut : les paquets peuvent entrer par ce lien et sortir par l’autre. C’est du routage asymétrique, c’est très commun sur internet.

Alors, qu’est-ce qui peut bloquer ? Il y a plusieurs suspects possibles.

  • Le FAI du lien par défaut a mis en place un filtre anti-spoofing qui empêche d’émettre des paquets avec une adresse source différente de celle affectée au lien.

  • Ta machine a elle-même un filtre de validation d’adresse source qui bloque les paquets reçus sur une interface si la réponse serait envoyée par une autre interface, ce qui est le cas avec le routage asymétrique. Ce filtre est contrôlé par les paramètres du noyau (sysctl) /proc/sys/net/ipv4/conf/*/rp_filter.

  • Ta machine a des règles de filtrage iptables en sortie qui bloquent les paquets émis dont l’adresse source ne correspond pas à l’adresse de l’interface de sortie.

  • Au moins une des passerelles fait du NAT (masquerading et/ou redirection de port). Cela ne fait pas bon ménage avec le routage asymétrique car pour que le NAT fonctionne les paquets retour doivent impérativement repasser par le même routeur que les paquets aller.

Dans tous les cas la solution la plus simple consiste à router les paquets sortants en fonction de l’adresse source. Cela peut se faire avec du routage avancé, décrit dans le LARTC-howto (Linux Advanced Routing and Traffic Control), grâce au programme ‘ip’ de la suite iproute2 (paquet iproute). On l’utilise éventuellement en association avec iptables pour faire des choses plus fines comme du routage en fonction du protocole, des ports, mais ce n’est pas nécessaire ici.

Le principe consiste à créer des tables de routage différentes pour chaque lien, et des règles de routage pour sélectionner une table ou l’autre en fonction de l’adresse source. Il faut aussi désactiver le filtre de validation d’adresse source en entrée (rp_filter=0) car hélas il fonctionne mal avec le routage avancé.

En gros (à adapter et affiner) :

sysctl -w net.ipv4.conf.$interface1.rp_filter=0
sysctl -w net.ipv4.conf.$interface2.rp_filter=0
ip route add default via $passerelle1 dev $interface1 table 101
ip route add default via $passerelle2 dev $interface2 table 102
ip rule add from $adresse1 lookup 101
ip rule add from $adresse2 lookup 102

Ce routage ne concerne que les paquets dont l’adresse source est déterminée par l’application, ce qui inclut les réponses. Les paquets émis sans adresse déterminée par l’application, correspondant à des connexions sortantes, continueront à être émis par l’interface vers le lien par défaut, avec l’adresse source correspondante.

Merci pour cette explication, mais dans les commandes, la commande “ip” ne passe pas, elle dépend de quelle paquetage ?

C’était écrit :

On va dire que c’était noyé dans le texte et que tu ne l’as pas vu. :confused:

iproute n’est toujours pas installé en standard dans etch ? C’est HONTEUX ! :astonished:

oui désolé, j’avais pas bien lu et a la 2 ème lecture TILT

maintenant sa marche très bien, je te remercie…

Alors si ça marche, il est où le [Résolu] ? :stuck_out_tongue:

Quelques bricoles à ajouter :

  1. Les commandes ip et sysctl peuvent être exécutées automatiquement lors de l’activation des interfaces par des options ‘up’ dans la configuration des interfaces concernées dans /etc/network/interfaces.

  2. Tu avais écrit dans ton premier message :

Lorsqu’il y a plusieurs routes/passerelles par défaut de même préférence, une seule est active de toute façon. Plusieurs choix par défaut, ça n’est pas vraiment logique. Il paraît que c’est la dernière définie qui est active, mais pour ma part je préfère ne pas compter là-dessus : plusieurs routes par défaut => résultat imprévisible, à éviter.

Voila, le [Résolu] est en place :slightly_smiling:

Pour les commandes je les ai placé dans mon script :slightly_smiling:

J’ai aussi completé avec quelque commande iptables et sa roule impec…

Encore merci pour l’aide…