Это можно сделать с помощью сетевых пространств имён в GNU/Linux.
Вот как запустить OpenVPN и одно приложение в отдельном пространстве имён:
Создайте сетевое пространство имён:
ip netns add myvpn
Запустите интерфейс обратной связи в пространстве имён (иначе многие вещи работают не так, как ожидалось…)
Создайте виртуальные сетевые интерфейсы, которые позволят OpenVPN (в пространстве имён) получить доступ к реальной сети, и настроить интерфейс в пространстве имен (vpn1) на использование интерфейса вне пространства имен (vpn0) в качестве шлюза по умолчанию
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
Включить маршрутизацию IPv4 и NAT для интерфейса в пространстве имен. Поскольку мой стандартный интерфейс беспроводной, я использую wl+ (который может совпадать с wlan0, wlp3s0 и т.д.). ) в iptables для исходящего интерфейса; если вы используете проводной интерфейс, вы, вероятно, должны использовать en+ (или br+ для bridged interface)
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
Настройте сервер имён для использования внутри пространства имён
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
Наконец-то запустите OpenVPN в пространстве имён
ip netns exec myvpn ping www.google.com
Как только tun0 окажется в пространстве имён, вы готовы запустить нужную программу!
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
статья SOURCE.
Также есть скрипт обертки в статье исходного текста, который вы можете адаптировать под свои нужды.