вы можете сделать это с помощью сетевых пространств имен в GNU/Linux.
вот как запустить OpenVPN и одно приложение в отдельном пространстве имен:
создать сетевое пространство имен:
ip netns add myvpn
запустить интерфейс замыкания на себя в пространстве имен (в противном случае многие вещи не работают, как ожидалось...)
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
создание виртуальных сетевых интерфейсов, которые позволят OpenVPN (в пространстве имен) получить доступ к реальной сети, и настроить интерфейс в пространстве имен (vpn1) использовать интерфейс из пространства имен (vpn0) в качестве шлюза по умолчанию
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
включить маршрутизацию IPv4 и NAT для интерфейса в пространстве имен. Поскольку мой интерфейс по умолчанию является беспроводным, я использую wl+ (который может совпасть с wlan0, wlp3s0, и т.д.) в iptables для исходящего интерфейса; если вы используете проводной интерфейс, вы, вероятно, должны использовать en+ (или br+ для мостового интерфейса)
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
настройте сервер имен для использования внутри пространство имен
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
почти готово, теперь у нас должен быть полный доступ к сети в пространстве имен
ip netns exec myvpn ping www.google.com
наконец, запустите OpenVPN в пространстве имен
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
как только tun0 появится в пространстве имен, вы сможете запустить нужную программу!
while ! ip netns exec myvpn ip a show dev tun0 up; do sleep .5; done
ip netns exec myvpn sudo -u $MYSELF popcorntime
исходная статья.
также в исходной статье есть скрипт-оболочка, который вы можете адаптировать для своих нужд.