Se você quiser que seu software específico use a conexão VPN, use os namespaces de rede.
basicamente, o comando ip netns add vpn
criará outro namespace para dispositivos de rede, tabelas de roteamento, regras de firewall e assim por diante, então é como executar duas pilhas de rede.
Um dispositivo de rede só pode estar em um namespace, portanto, você precisará de um dispositivo virtual, agindo como uma ponte entre os dois namespaces.
É exatamente para isso que as interfaces de rede virtual são:
ip link add veth0 type veth peer name veth1
tudo o que entra em veth0 sairá de veth1 e assim por diante. Agora você só precisa mover uma das interfaces virtuais para o outro namespace da rede:
ip link set veth0 netns vpn
Agora você tem uma situação semelhante a esta topologia de rede:
.----------. .------.
[intertubes] ------| Host |--------------| vpn |
eth0'----------'veth1 veth0'------'
Você pode aplicar o método que quiser para compartilhar a conexão com a Internet. Faça o masquerading (se a vpn suportar o NAT), roteamento / bridging (você precisará de outro endereço IP ou configurações sérias) ou qualquer outro método que você goste.
Quando você quiser 'acessar' vpn
, execute ip netns exec vpn bash
e acabará no namespace vpn
. Você verá que esse namespace tem apenas a interface de rede veth0
, bem como uma interface lo
não configurada que você pode querer configurar usando ip addr add 127.0.0.1/8 dev lo && ip link set lo up
. Agora basta configurar sua interface veth0
para que você possa se conectar à Internet e depois iniciar sua VPN para que ela possa reconfigurar a rede para passar pela VPN. Você verá que o namespace principal não usará a VPN, enquanto o namespace vpn
será.