Haverá outras soluções, mas é isso que estou pensando:
- Configure a VM no modo de ponte. Isso dará à sua máquina virtual um endereço IP na mesma rede do seu host.
- Configure a VPN no host, digamos que seja tun0.
- Ativar o roteamento no host
echo 1 > /proc/sys/net/ipv4/ip_forward
- Configure a VM com o endereço IP do host como o padrão gw.
Neste ponto, o host tem a conexão VPN e a VM roteará todo o tráfego para o host. Tudo o que resta a fazer é restringir o host para que ele não permita que o convidado roteará qualquer tráfego que não vá através do dispositivo tun0. Você poderia fazer isso com um conjunto de regras do iptables algo assim:
iptables -P FORWARD DROP
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
Isso deve funcionar. A primeira regra define uma política padrão para pacotes DROP na cadeia FORWARD. Isso afeta somente os pacotes que o seu host iria rotear, não os pacotes para o host (INPUT) ou do host (OUTPUT). A segunda regra permite que qualquer tráfego que esteja roteando tun0 - você poderia aumentar esse valor com um --source, se quisesse. E a última regra deve permitir que as respostas voltem do tun0 para o caminho de volta para a VM.
A sua VPN espera que todos os pacotes na interface tun sejam de um único IP? Nesse caso, você também desejará adicionar uma regra NAT. Provavelmente algo como:
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source {your host tun0 ip}