web-dev-qa-db-fra.com

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 (softphone Twinkle) n'a pas une option similaire, donc je crois qu'il doit être configuré en externe.

Comment puis-je le faire?

Edit: Je n'essaie pas de lier un processus serveur à une interface spécifique, mais plutôt de faire contacter un programme client par un serveur à l'aide d'une interface spécifique .

59
Andrea Spadaccini

vous pouvez remplacer le code à l'exécution par l'utilisation de LD_PRELOAD (@windows, vous pouvez utiliser une technique similaire appelée détours , assez chic). cela a pour effet d'informer l'éditeur de liens dynamique de charger d'abord toutes les bibliothèques dans le processus que vous voulez exécuter, puis d'ajouter un peu plus encore. vous l'utilisez normalement comme ceci:

% LD_PRELOAD=./mylib.so ls

et par là vous changez ce que ls fait.

pour votre problème, je voudrais essayer http://www.ryde.net/code/bind.c.txt , que vous pouvez utiliser comme:

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

voici comment vous le construisez:

% 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 howto plus long est http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

hacks et outils similaires:

47
akira

ip netns peut le faire.

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

Il suffit de vérifier si votre distribution prend en charge les réseaux IP ... (Backtrack 5r3, contrairement à Kali;))

EN PLUS DE DÉTAILS:

#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 utilisée par les processus. Il utilisera le premier itinéraire.

Et comme il utilise toujours le même itinéraire, il utilisera par défaut l'interface enregistrée pour cet itinéraire (ce qui n'est pas ce que nous souhaitons).

31
olivervbk

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

Cependant, je pense que vous pourriez être en mesure de jouer avec ipchain/iptables et de forcer un certain port sur lequel votre processus est en écoute d'écouter uniquement les paquets provenant d'une interface particulière.

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

2
thetarro

Basé sur @olivervbk, la réponse ci-dessous est mon!

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 en tant que 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] - Remplacez-le par le nom de l'interface réseau choisie.
  • [YOUR_USER] - Remplacez-le par votre nom d'utilisateur.
  • [NOM_APP] - Nom de l'application qui sera exécutée dans l'espace de noms "[NOM INTERFACE] _ns". Exemple: "firefox".

REMARQUE I: Les indicateurs "-b -u" de la commande "Sudo" permettent à l'application de s'exécuter sous votre utilisateur (et non "root") et en arrière-plan libérant le terminal. L'extrait 2> /dev/null 1> /dev/null & empêche les sorties de "[APP_NAME]" d'être imprimées sur le terminal.
NOTE II: Les valeurs de ip "10.1.1.10" et "10.1.1.1" sont arbitraires.
NOTE III: Pour travailler pour moi, je devais exécuter la commande dhcpcd [INTERFACE_NAME].

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

ip netns del [INTERFACE_NAME]_ns

... ou...

ip -all netns delete

... pour supprimer tout ce qui existe.

1
Eduardo Lucio

Généralement, si un programme n'a pas d'option pour configurer une interface d'écoute, il écoute sur TOUTES les interfaces. (Vous pouvez le vérifier avec lsof -i).

La meilleure chose à faire est de créer des règles de pare-feu iptables qui suppriment le trafic entrant pointé vers ses ports sur des interfaces sur lesquelles vous ne voulez pas qu'il soit visible.

1
LawrenceC

Alternative I:

Utilisation de ld_preload pour forcer la passerelle d'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 est utilisée par l'interface réseau, puis forcer cette passerelle vers notre application emprisonnée et ainsi forcer l'application à se lier à une interface réseau spécifique.

  • Comment trouver la passerelle d'interface (il existe de nombreuses solutions pour trouver la passerelle, voici quelques commandes permettant 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
chown 755 make.sh
./make.sh
  • Ajouter un itinéraire pour les futurs paquets marqués (pour l'application jailed) dans cet exemple 192.168.1.1 est utilisé comme passerelle forcée, cette règle d'itinéraires n'affectera pas les autres applications, cette manipulation ne doit être effectuée qu'une seule fois au démarrage du système, si vous le souhaitez. utiliser cette solution quotidiennement
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • Démarrer l'application que vous voulez emprisonner
MARK=10 LD_PRELOAD=./mark.so firefox
  • Test de l'adresse IP wan
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

Alternative II:

Firejail https://firejail.wordpress.com/ peut obliger 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
0
intika