Vous pouvez le faire avec des espaces de noms de réseau sur GNU/Linux.
Voici comment faire fonctionner OpenVPN et une seule application dans un espace de noms distinct :
Créer l'espace de noms du réseau :
ip netns add myvpn
Démarrer l'interface de loopback dans l'espace de noms (sinon beaucoup de choses ne fonctionnent pas comme prévu…)
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
Créer des interfaces réseau virtuelles qui permettront à OpenVPN (dans l'espace de noms) d'accéder au réseau réel, et configurer l'interface dans l'espace de noms (vpn1) pour utiliser l'interface hors de l'espace de noms (vpn0) comme sa passerelle par défaut
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
Activer le routage IPv4 et la NAT pour l'interface dans l'espace de noms. Comme mon interface par défaut est une interface sans fil, j'utilise wl+ (qui peut correspondre à wlan0, wlp3s0, etc. ) dans iptables pour l'interface de sortie ; si vous utilisez une interface filaire, vous devriez probablement utiliser en+ (ou br+ pour une interface pontée)
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o wl+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
Configurer le serveur de noms à utiliser dans l'espace de noms
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
Presque terminé, Nous devrions maintenant avoir un accès complet au réseau dans l'espace de noms
ip netns exec myvpn ping www.google.com
Enfin, lancez OpenVPN dans l'espace de noms
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
Une fois que tun0 est dans l'espace de noms, vous êtes prêt à lancer le programme que vous vouliez !
while ! ip netns exec myvpn ip a show dev tun0 up; do sleep .5; done
ip netns exec myvpn sudo -u $MYSELF popcorntime
article source.
Il y a aussi un script de wrapper dans l'article source que vous pouvez adapter à vos besoins.