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 .
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:
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).
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
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 &
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.
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.
Utilisation de ld_preload pour forcer la passerelle d'interface https://github.com/Intika-Linux-Network/App-Route-Jail
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.
$ 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
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
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 quotidiennementip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
MARK=10 LD_PRELOAD=./mark.so firefox
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
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