Question Lier l'adresse IP à l'application


J'ai plusieurs interfaces réseau sur une seule machine. Je me demande comment je peux relier une interface réseau à une application.

Exemple: Interfaces réseau: eth0, eth1

Application Dummy0 Application B utiliser factice1

Est-il possible de lier une application à une interface comme celle-ci?

Cas d'utilisation: 1 machine avec 2 connexions internet; eth0 -> connexion internet 0 eth1 -> connexion internet 1

Application utilise une interface prédéfinie Firefox -> eth0 -> connexion internet 0 Chrome -> eth1 -> connexion Internet 1

OS: CentOS 5.9 32bit


7
2018-04-09 12:09


origine




Réponses:


La sélection d'un adaptateur spécifique pour une application est un paramètre spécifique à l'application. Vous devez déterminer comment cela se fait dans votre application spécifique. Cela ne peut pas être fait au niveau du système.

les fenêtres

Vous pouvez toutefois ajuster la priorité des adaptateurs au niveau du système global. Utilisez les flèches haut et bas sur la page des propriétés avancées des connexions réseau.

http://levynewsnetwork.wordpress.com/2011/12/01/windows-7-default-internet-connection-choice/

Linux

Sous Linux, le processus n'est pas aussi simple. Vous devez dire à Linux qu'un adaptateur est plus éloigné que l'autre en utilisant le metric.

Pour donner la priorité aux adaptateurs sous Linux, vous devez utiliser le route commande, pour ajouter l'itinéraire avec la métrique souhaitée et supprimer l'ancienne entrée. Par exemple:

sudo route add -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 1
sudo route del -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 0

Pour les deux systèmes d'exploitation, le même ordre sera utilisé pour chaque application.


4
2018-04-09 12:24



Bonne réponse, mais l'OP mentionne eth0 et eth1 donc je suppose qu'il n'utilise pas Windows. - Flup
Toutes mes excuses, je n'ai pas précisé le système d'exploitation. Je vais faire un montage. - dooffas
@dooffas J'ai mis à jour des informations sur la façon dont cela se fait sous Linux. Ce n'est toujours pas exactement ce que vous aviez demandé à l'origine. - krowe


Il existe une solution simple - Daniel Ryde a écrit une bibliothèque LD_PRELOAD "shim" (bind.c) qui modifie le comportement de liaison, à cette fin. Découvrez ce tutoriel:

https://www.x4b.net/kb/BindProcessToIPonLinux

Étant donné qu'il existe effectivement une adresse de liaison par défaut pour les applications (voir votre table de routage), il est à mon avis superbement étrange qu'il n'y ait généralement pas de moyen standard (comme dans "code de package de distribution") pour remplacer cette interface par défaut, Oui; au niveau du système, pour un ensemble particulier d'applications.

Certains programmes ont des options de ligne de commande pour écouter l'interface de votre choix, ce qui est très bien.

Ma route par défaut passe par un proxy VPN (sûrement un scénario assez courant). Par défaut pour les connexions sortantes, ce tunnel ne prend pas très bien en charge les connexions entrantes provenant d'Internet. Par conséquent, je dois forcer les programmes orientés serveur A, B et C à se lier à une autre adresse IP (adresse principale fournie par le fournisseur de services Internet). Et le programme orienté client D, je veux utiliser mon interface publique pour différentes raisons.

La bibliothèque ci-dessus fonctionne bien, à cet effet!

Une solution est:

  1. Créer un nouvel utilisateur
  2. Header-mangle TOUS les paquets de cet utilisateur particulier
  3. Exécuter les programmes en tant que cet utilisateur, SEULEMENT pour "lier efficacement" à l'interface souhaitée semble être ... un hack moche, en comparaison.

Alternativement:

  1. Créer un nouvel utilisateur SuperFluous
  2. Faire en sorte que SuperFluous utilise une table de routage différente
  3. Exécuter A, B, C en tant qu'utilisateur SuperFluous; Toujours pas assez bon! Je veux utiliser "mes" serveurs comme "moi" (je n’ai peut-être même pas les privilèges pour créer de nouveaux utilisateurs et des règles de routage).

LISTEN_TO = $ Commande THIS_INTERFACE; # <- Ça devrait être aussi simple.


2
2017-08-22 23:26



C'est la seule réponse qui soit logique pour le cas général - merci de le signaler! - Paul Gear


En fait, le sujet de la question est un peu inexact. La liaison d'une application à une interface s'applique à une application agissant en tant que serveur.

Dans ce cas, le terme correct est "Routage du trafic pour une application spécifique d'une manière spécifique". Sous Linux, cela peut être accompli avec le routage de politique.

L'astuce consiste à lancer l'autre navigateur en tant qu'utilisateur différent et à définir des règles de routage des règles pour que tous les paquets de cet utilisateur utilisent l'autre passerelle par défaut.

http://blog.sebastien.raveau.name/2009/04/per-process-routing.html a une description complète.


1
2018-04-10 09:45





Comme Krowe l’a déjà dit, c’est une application spécifique. Si votre application ne prend pas en charge la liaison à une interface / IP donnée, vous pouvez utiliser iptables (Linux) ou ipfilter (* BSD).

Ubuntu-Wiki a une introduction plutôt sympa à iptables: https://help.ubuntu.com/community/IptablesHowTo


0
2018-04-09 12:33



À moins que je ne comprenne pas, n'est-ce pas pour le routage du trafic par port? Par exemple tout le trafic sur le port 80 -> eth0 - dooffas
Il semble que vous vouliez avoir ceci sur le calque d'application (par exemple, Firefox). Je l'ai mal compris et j'ai pensé que vous vouliez cela sur le niveau de service (par exemple, Apache). - Denis Witt
@dooffas iptables fait beaucoup de choses, c'est un pare-feu, ou principalement un pare-feu, je l'ai utilisé pour ça .. il a aussi des paramètres pour NAPT par exemple. on peut dire qu'il a une fonction primaire, je ne pense pas que le réacheminement du trafic serait sa fonction principale. - barlop
@DenisWitt Vous mentionnez ipf avec BSD. BSD a aussi ipfw, et maintenant, avec BSD, les gens utilisent souvent le pf plutôt puissant (il peut s'agir d'un tiers). - barlop


Alors que les applications peuvent se lier à des adresses IP particulières, elles sont spécifiques à l'application. Pour votre exemple, Chrome et Firefox prennent en charge les proxies HTTP.

Vous pouvez utiliser Squid avec la configuration suivante pour leur faire utiliser une carte réseau spécifique.

acl browser1 localip 127.0.0.2
acl browser2 localip 127.0.0.3
tcp_outgoing_address 192.168.1.99 browser1
tcp_outgoing_address 197.6.0.1 browser2

Maintenant, Firefox serait configuré pour se connecter au proxy à 127.0.0.2 qui utiliserait 192.168.1.99 comme NIC pour exécuter les requêtes TCP sortantes.

Chrome serait configuré pour utiliser 127.0.0.3 en tant que proxy qui utiliserait 197.6.0.1 comme adresse sortante.


0
2018-04-09 12:59