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 via une interface spécifique.
linux
networking
Andrea Spadaccini
la source
la source
Réponses:
vous pouvez remplacer le code à l'exécution à l'aide de LD_PRELOAD (@windows, vous pouvez utiliser une technique similaire appelée détours , assez sophistiquée). 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'en ajouter un peu plus. vous l'utilisez normalement comme ceci:
et par là vous changez ce qui
ls
fait.pour votre problème, je voudrais essayer http://www.ryde.net/code/bind.c.txt , que vous pouvez utiliser comme:
voici comment vous le construisez:
un howto plus long est http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
hacks et outils similaires:
la source
force_bind
projet de Catalin M. Boie soutient ipv6IP Netns peut le faire.
TL; DR: Créez des espaces de noms 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:
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).
la source
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
Je ne pense pas qu'il soit possible de forcer un processus à utiliser une certaine interface.
Cependant, je pense que vous pourrez peut-être jouer avec ipchain / iptables et forcer un port particulier sur lequel votre processus est en écoute n'obtiendra que les paquets provenant d'une interface particulière.
HOWTO utile: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
la source
Basé sur @olivervbk, la réponse ci-dessous est mon!
Exécutez toutes les commandes en tant que "root".
Utilisez la commande ...
... 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 ...
REMARQUE I: Les indicateurs "-b -u" de la commande "sudo" permettent à l'application de s'exécuter avec votre utilisateur (et non "root") et en arrière-plan en libérant le terminal. L'
2> /dev/null 1> /dev/null &
extrait de code 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
dhcpcd [INTERFACE_NAME]
commande.Pour supprimer l'espace de noms, utilisez ...
... ou...
... pour supprimer tout ce qui existe.
la source
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 consiste à 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.
la source
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.
Par passerelle d'application
192.168.1.1
est utilisé comme passerelle forcée, cette règle de route n'affectera pas les autres applications, cette manipulation doit être effectuée une seule fois au démarrage du système par exemple si vous souhaitez utiliser cette solution quotidiennementAlternative II:
Firejail https://firejail.wordpress.com/ peut forcer une application à utiliser un réseau spécifique, mais la compatibilité est limitée.
la source
Pourquoi voudriez-vous qu'un programme utilise une interface autre que celle connectée au serveur pour communiquer avec ce serveur? Et si le système n’utilise pas l’interface connectée à un serveur pour communiquer avec ce serveur, il s’agit d’un problème lié au système (table de routage) et n’a aucun rapport avec le processus qui souhaite communiquer avec ce serveur.
Différents serveurs sur les réseaux IP ont des adresses IP différentes. Le noyau doit savoir quelle interface utiliser pour atteindre une adresse IP particulière en fonction de la table de routage. Si vous essayez de parler à deux serveurs différents ayant la même adresse IP, le système sera confus (entre autres choses, il indexe uniquement les connexions en interne par adresse de destination). Cela peut fonctionner, mais c'est un correctif au niveau du système impliquant de placer un serveur dans un réseau logique séparé qui est uniquement connecté à la machine via le logiciel NAT.
Par conséquent, s’ils ont des adresses IP différentes, utilisez les itinéraires pour sélectionner la bonne interface. S'ils ont la même adresse IP, vous devez utiliser NAT afin qu'ils semblent avoir des adresses IP différentes pour le système.
la source