Connexion réseau double

9

J'ai un modem cellulaire USB et une connexion LAN domestique sur ma boîte Ubuntu 10.10.

Les deux fonctionnent indépendamment.

Je veux savoir comment connecter les deux en même temps et pouvoir spécifier quelle application utilise quel appareil pour se connecter à Internet.

Est-ce que quelqu'un sait comment faire ça?

Justin Alexander
la source

Réponses:

11

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 Installer iptables ) et iproute2 ( ipcommande) (Ubuntu: iproute Installer iproute , iproute-doc Installez 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 iptableset 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 eth0et tous les paquets marqués 2 sortent via ppp0(sauf les paquets destinés à localhostcoller à 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 iptablespour "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 proxyvia 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-routesqui 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, 0il 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 ….

Gilles 'SO- arrête d'être méchant'
la source
@Justin: Ce n'est pas des choses que j'ai beaucoup d' expérience avec, donc s'il vous plaît donner une rétroaction de ce qui a fonctionné, ce qui n'a pas fonctionné, ce que vous ne comprenez pas, etc.
Gilles de l' arrêt SO- étant le mal "
1
J'ai deux ajouts à faire: Tout d'abord, cela envoie du trafic sur ppp0 avec l'adresse source de eth0. Vous pouvez changer cela en utilisant :, iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ipppp_ipest l'adresse IP de cet adaptateur. Deuxièmement, vous devrez désactiver strictement rp_filterà /proc/sys/net/ipv4/config/ppp0/rp_filter. Cela fonctionne quand il est réglé sur le mode détente, qui est 2.
Karalga