Puoi farlo con gli spazi dei nomi di rete su GNU/Linux.
Ecco come eseguire OpenVPN e una singola applicazione in un namespace separato:
Creare il namespace di rete net:
ip netns add myvpn
Avviare l'interfaccia di loopback nel namespace (altrimenti molte cose non funzionano come previsto…)
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
Creare interfacce di rete virtuali che permetteranno a OpenVPN (nel namespace) di accedere alla rete reale, e configurare l'interfaccia nel namespace (vpn1) per usare l'interfaccia fuori dal namespace (vpn0) come gateway di default
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
Abilita il routing IPv4 e il NAT per l'interfaccia nel namespace. Poiché la mia interfaccia predefinita è un'interfaccia wireless, utilizzo wl+ (che può corrispondere a wlan0, wlp3s0, ecc. ) in iptables per l'interfaccia in uscita; se si usa un'interfaccia cablata probabilmente si dovrebbe usare en+ (o br+ per un'interfaccia bridged)
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
Configurare il nameserver da usare all'interno del namespace
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
Quasi fatto, ora dovremmo avere pieno accesso alla rete nel namespace
ip netns exec myvpn ping www.google.com
Infine avviare OpenVPN nel namespace
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
Una volta che tun0 è attivo nel namespace, sei pronto per avviare il programma che volevi!
while ! ip netns exec myvpn ip a show dev tun0 up; do sleep .5; done
ip netns exec myvpn sudo -u $MYSELF popcorntime
Articolo sorgente.
C'è anche uno script wrapper nell'articolo sorgente che puoi adattare alle tue esigenze.