Vous pouvez le faire avec les espaces de noms du réseau sur GNU/Linux.
Voici comment faire fonctionner OpenVPN et une seule application dans un espace de nom séparé :
Créez l'espace de nom de réseau net :
ip netns add myvpn
Démarrer l'interface de bouclage 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éez des interfaces réseau virtuelles qui permettront à OpenVPN (dans l'espace de noms) d'accéder au réseau réel, et configurez l'interface dans l'espace de noms (vpn1) pour utiliser l'interface hors de l'espace de noms (vpn0) comme 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
Activez le routage IPv4 et le 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 sortante ; 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
C'est presque terminé, maintenant nous devrions avoir un accès complet au réseau dans l'espace de nom.
ip netns exec myvpn ping www.google.com
Enfin, démarrez OpenVPN dans l'espace de noms
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
Une fois que tun0 est en place 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 de la SOURCE.
Il y a également un wrapper script dans l'article source que vous pouvez adapter à vos besoins.