Juste une idée alors. 
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.