73 votes

Comment utiliser différentes interfaces réseau pour différents processus ?

J'ai deux interfaces réseau sur un PC Linux, et je dois définir manuellement l'interface qu'un processus donné utilisera.

Le programme (Twinkle softphone) ne dispose pas d'une option similaire, je pense donc qu'elle doit être définie en externe.

Comment puis-je le faire ?

Editar: Je n'essaie pas de faire en sorte qu'un processus serveur se lie à une interface spécifique, mais plutôt de faire en sorte qu'un programme client contacte un serveur en utilisant une interface spécifique.

54voto

akira Points 58339

Vous pouvez remplacer le code au moment de l'exécution par l'utilisation de LD_PRELOAD (@Windows vous pouvez utiliser une technique similaire appelée détours Ce que cela fait, c'est d'informer l'éditeur de liens dynamiques de charger d'abord toutes les librairies dans le processus que vous voulez exécuter, puis d'en ajouter d'autres :

% LD_PRELOAD=./mylib.so ls

et par cela vous changez ce ls fait.

Pour votre problème, j'essaierais http://www.ryde.net/code/bind.c.txt que vous pouvez utiliser comme suit :

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

voici comment le construire :

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

un plus long howto est http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

des hacks et outils similaires :

41voto

olivervbk Points 507

Les ip netns peuvent le faire.

TL;DR : Créez des espaces de noms de réseau, associez-leur des interfaces, puis exécutez "ip netns exec NOM cmd...".

Vérifiez simplement si votre distro supporte les ip netns... (Backtrack 5r3 ne le fait pas, alors que Kali le fait ;) )

PLUS EN DÉTAIL :

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

Pourquoi est-ce mieux que de lier l'IP via LD_PRELOAD ? Parce que LD_PRELOAD ne contrôle pas la route que les processus utilisent. Il utilisera la première route.

Et comme il utilise toujours la même route, il utilisera par défaut l'interface enregistrée pour la route (ce qui n'est pas ce que nous voulons).

4voto

reox Points 1444

Alternative I :

Utilisation de ld_preload pour forcer la passerelle de l'interface https://github.com/Intika-Linux-Network/App-Route-Jail

Forcer une application à utiliser une interface réseau spécifique

Nous devons trouver quelle passerelle l'interface réseau utilise, puis forcer cette passerelle à notre application en jail et ainsi forcer l'application à se lier à une interface réseau spécifique.

  • Comment trouver la passerelle de l'interface (il existe plusieurs solutions pour trouver la passerelle, voici quelques commandes qui permettent de trouver la passerelle utilisée) ?

    $ route $ route -n $ ip rule list $ ip route show $ netstat -rn $ cat /etc/network/interfaces $ cat /etc/sysconfig/network-scripts/ifcfg-eth0 $ traceroute www.google.com $ ip route show 0.0.0.0/0 dev eth0

Par passerelle d'application

  • Construire App-Route-Jail

    git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git cd Approute-Utils chmod 755 make.sh ./make.sh

  • Ajouter une route pour les futurs paquets marqués (pour l'application bloquée) dans cet exemple 192.168.1.1 est utilisé comme passerelle forcée, cette règle de route n'affectera pas les autres applications, cette manipulation ne doit être faite qu'une seule fois au démarrage du système par exemple si vous voulez utiliser cette solution quotidiennement.

    ip rule add fwmark 10 table 100 ip route add default via 192.168.1.1 table 100

  • Démarrez l'application que vous voulez mettre en prison

    MARK=10 LD_PRELOAD=./mark.so firefox

  • Test de l'adresse IP du WAN

    MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

Alternative II :

Firejail https://firejail.wordpress.com/ peut forcer une application à utiliser un réseau spécifique, mais la compatibilité est limitée.

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

Sources : Linuxhacks.org
Divulgation : Je suis le propriétaire de Linuxhacks.org.

3voto

TangMonk Points 131

Je ne pense pas qu'il soit possible de forcer un processus à utiliser une certaine interface.

Cependant, je pense que vous pouvez jouer avec ipchain/iptables et forcer un certain port sur lequel votre processus écoute à ne recevoir que des paquets provenant d'une interface particulière.

HOWTO utile : http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

3voto

Eduardo Lucio Points 984

Basé sur la réponse de @olivervbk, voici la mienne !

Exécutez toutes les commandes en tant que "root".

Utilisez la commande...

ip a

... pour connaître le nom de l'interface réseau que vous souhaitez utiliser.

Exécutez les commandes ci-dessous comme modèle...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - Remplacer par le nom de l'interface réseau choisie.
  • [YOUR_USER] - Remplacer par votre nom d'utilisateur.
  • [APP_NAME] - Nom de l'application qui sera exécutée dans l'espace de nom "[INTERFACE_NAME]_ns". Par exemple : "firefox".

NOTE I : Le " -b -u "dans la section " sudo La commande " " permet à l'application de s'exécuter en utilisant votre utilisateur (et non " root ") et en arrière-plan en libérant le terminal. Le site 2> /dev/null 1> /dev/null & est d'empêcher que les sorties de "[APP_NAME]" soient imprimées dans le terminal.
NOTE II : Les valeurs de ip "10.1.1.10" et "10.1.1.1" sont arbitraires.
NOTE III : Pour que ça marche pour moi, j'ai dû exécuter le dhcpcd [INTERFACE_NAME] comando.

Pour supprimer l'espace de nom, utilisez...

ip netns del [INTERFACE_NAME]_ns

... ou...

ip -all netns delete

... pour supprimer tout ce qui existe.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X