Il existe plusieurs possibilités, selon la façon dont vous souhaitez décider quels paquets vont où. La plupart d'entre eux nécessiteront une certaine compréhension du fonctionnement des réseaux TCP / IP sous Linux. Les principaux outils que vous devrez connaître pour effectuer des tâches complexes sont iptables
(Ubuntu: iptables ) et iproute2 ( ip
commande) (Ubuntu: iproute , iproute-doc ).
Si vous pouvez discriminer complètement par adresse IP cible, c'est simple: acheminez les adresses IP selon vos souhaits. Par exemple, les commandes suivantes entraîneront tous les paquets pour 1.2.3. x et 1.2.4.2 pour passer par ppp0
, et d'autres paquets pour passer par eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Pour des exigences plus complexes, vous devez commencer à utiliser iptables
et ip route
. Par exemple, les commandes suivantes configurent des tables de routage spéciales de sorte que tous les paquets marqués 1 sortent via eth0
et tous les paquets marqués 2 sortent via ppp0
(sauf les paquets destinés à localhost
coller à l'interface de bouclage).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Maintenant, vous pouvez utiliser iptables
pour "manipuler" les paquets sortants, en ajoutant une marque qui décidera de l'itinéraire qu'ils empruntent. Par exemple, voici comment envoyer tout le trafic SMTP sortant (port 25) via eth0
, et tout le trafic provenant d'une application s'exécutant en tant qu'utilisateur proxy
via ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Voir aussi 2 interfaces réseau connectées à Internet. Choisissez celui à utiliser en fonction du nom de domaine et liez le logiciel à différentes interfaces réseau .
Vous devrez organiser l'exécution de ces commandes lorsque les deux interfaces sont connectées. Je vous recommande d'écrire un script appelé /etc/network/if-up.d/0justin-routes
qui exécute les commandes que vous souhaitez. Ce script sera exécuté chaque fois qu'une interface réseau est lancée; comme son nom commence par un, 0
il s'exécutera au début de ce processus, avant une configuration spécifique à l'application qui pourrait s'attendre à ce que les routes soient en place. Il y a une symétrie /etc/network/if-down.d/
au cas où vous voudriez aussi faire des choses quand l'une des interfaces tombe en panne. (Toutes les routes associées seront automatiquement supprimées, ce qui peut laisser certains paquets bloqués lorsque vous souhaitez qu'ils reviennent à l'autre interface.)
Les scripts ifup sont documentés dans le interfaces(5) man page
. La principale chose à savoir est que le nom de l'interface en cours de montée ou de descente se trouve dans la variable d'environnement IFACE
. Vous pouvez savoir si l'autre interface est déjà opérationnelle if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
oùppp_ip
est l'adresse IP de cet adaptateur. Deuxièmement, vous devrez désactiver strictementrp_filter
à/proc/sys/net/ipv4/config/ppp0/rp_filter
. Cela fonctionne quand il est réglé sur le mode détente, qui est 2.