Question: Comment lancer un programme tout en s'assurant que son accès réseau est lié via une interface réseau spécifique?
Cas: je souhaite accéder à deux machines distinctes avec la même adresse IP (192.168.1.1), mais accessible via deux interfaces réseau différentes (eth1 et eth2).
Exemple:
net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}
Ce qui précède est une approximation de ce que je voudrais, inspiré par la liaison matérielle effectuée via primusrun et optirun .
Défi: comme suggéré dans un thread associé , les interfaces utilisées ne sont pas choisies par le programme, mais par le noyau (d'où la syntaxe de pré-liaison dans l'exemple ci-dessus).
J'ai trouvé des solutions connexes, qui ne sont pas satisfaisantes. Ils reposent sur des interfaces réseau de liaison via une liste noire réseau spécifique à l'utilisateur; En d'autres termes, exécuter le processus en tant qu'utilisateur ne pouvant accéder qu'à une seule interface réseau spécifique.
Réponses:
Pour Linux, cela a déjà été résolu sur le superutilisateur - Comment utiliser différentes interfaces réseau pour différents processus? .
La réponse la plus populaire utilise une
LD_PRELOAD
astuce pour modifier la liaison réseau d'un programme, mais les noyaux modernes prennent en charge une fonctionnalité beaucoup plus flexible appelée "espaces de noms réseau" qui est exposée via leip
programme. Cette réponse montre comment l'utiliser. De mes propres expériences, j'ai fait ce qui suit (en tant que root):Il est également possible de gérer les espaces de noms réseau dans une certaine mesure avec les commandes
unshare
etnsenter
. Cela vous permet également de créer des espaces distincts pour les PID, les utilisateurs et les points de montage. Pour plus d'informations, voir:la source
wvdial
par exemple ne semble pas le configurer du tout ... il doit donc être défini dans l'espace de noms luiip netns remove test_ns
retourner à la normale? Ou devez-vous faire quelque chose de spécial?J'accepte la réponse de Graeme ceci est simplement un suivi pour expliquer les changements que j'ai apportés à sa suggestion pour résoudre mon problème.
Au lieu de lier l'interface physique à l'intérieur de l'espace de noms, j'ai créé une paire d'interface réseau virtuelle, avec une extrémité dans l'espace de nom réseau et une autre à la racine. Les packages sont ensuite routés via ce réseau virtuel de l'espace de noms vers l'espace de noms racine, puis vers l'interface physique. - En tant que tel, je peux exécuter tous mes transferts de données ordinaires et, en outre, démarrer des processus qui ne peuvent accéder qu'à une interface spécifique.
Une fois que les interfaces ont été configurées pour eth0 et eth1, avec leurs espaces de noms respectifs eth0_ns et eth1_ns, les programmes peuvent être exécutés sur l’interface spécifiée via;
la source
dhclient <bridge>
par ici .Solution I: préchargement d'une bibliothèque spécifique
App-Route-Jail : utilisez ld_preload pour forcer la passerelle d'interface (bonne idée mais nécessite des fonctionnalités de racine ou de marque). L'utilisation est détaillée dans les notes ci-dessous.
Proxybound : utilisez ld_preload pour forcer un proxy à une application spécifique (il s'agit d'un proxy plutôt que d'une interface)
Force-Bind : avoir beaucoup de fonctionnalités mais les liaisons sont fausses (non fiable)
Bind-Interface-IP : connexions trop simples et fuites (non fiables)
Bind-IP : trop simple et connexions fuites (non fiables)
Solution II: espace utilisateur Linux
Espace utilisateur linux classique ip-netns : une excellente solution, mais nécessite une racine et une interface ne peut exister que sur un seul espace utilisateur
Firejail : Firejail peut forcer une application à utiliser un réseau spécifique, mais la compatibilité est limitée (par exemple, il n'est pas compatible avec les interfaces tun). FireJail ne nécessite pas de racine
firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail avec netns : Firejail peut forcer une application à utiliser un espace utilisateur spécifique créé séparément, ce qui nous permet de nommer des espaces sans root.
firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail avec masquerade et bridge : Firejail peut forcer une application à utiliser une interface spécifique avec iptables masquerade , ce qui est génial et ne nécessite pas de racine mais cela nécessite ip_forward et pourrait entraîner des problèmes de sécurité.
firejail --net=br0 firefox
Solution III: Linux iptables
Iptables pourrait être utilisé à cette fin, mais cela nécessite ip_forward et pourrait avoir un impact sur la sécurité s'il n'est pas correctement configuré, exemple 1 , exemple 2 , exemple 3 , exemple 4.
Remarques sur les solutions (I, II et III):
Wireguard
Si vous utilisez un VPN (particulièrement wireguard) et que vous souhaitez appliquer cette solution à une interface wireguard ( wireguard avec espace utilisateur ), vous pouvez suivre le lien qui lui est demandé pour créer un espace utilisateur contenant une interface wg (et donc limité à une interface vpn). ) et ceci peut également être combiné
firejail --netns=container
pour pouvoir utiliser l’espace utilisateur sans root.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.
Comment utiliser App-Route-Jail
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 effectuée qu'une seule fois au démarrage du système si vous souhaitez utiliser cette solution quotidiennementla source