¿Cómo puedo hacer que los invitados de VirtualBox compartan la conexión VPN del host?

51

Pregunta

Cuando inicio mi VPN en mi computadora de escritorio ubuntu que actúa como un enrutador, la subred adjunta pierde la conectividad a Internet, pero aún es accesible (LAN). Idealmente, me gustaría saber cómo habilitar la subred adjunta para recuperar el acceso a Internet enrutando a través del túnel VPN cuando la VPN está activa.

Contexto

Tengo el siguiente diseño de red:

subred 172.16.0.0/20 en eth0 para mis máquinas virtuales VirtualBox.

subred 192.168.0.0/24 en eth0: 0 que se conecta a la puerta de enlace 192.168.0.1 que tiene acceso a internet.

Esto se muestra en el archivo / etc / network / interfaces:

auto lo
iface lo inet loopback

# This is the subnet dedicated to VB
auto eth0
iface eth0 inet static
    address 172.16.0.1
    netmask 255.255.0.0
    gateway 192.168.0.164
    dns-nameservers 8.8.8.8

# normal DHCP internet
auto eth0:0
iface eth0:0 inet static
    address 192.168.0.164
    netmask 255.255.255.0
    dns-nameservers 8.8.8.8
    gateway 192.168.0.1

Los paquetes en eth0 se reenvían a través de eth0: 0 con enmascaramiento y la conectividad normal a Internet está bien. Sin embargo, cuando inicio mi túnel VPN en este enrutador, la conectividad a Internet se pierde para las máquinas virtuales en la subred eth0 (aún permanece para el enrutador).

A continuación se muestra la salida de ifconfig cuando el túnel está activo:

eth0      Link encap:Ethernet  HWaddr 00:1f:bc:01:c3:ab  
          inet addr:172.16.0.1  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::21f:bcff:fe01:c3ab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:165426 errors:0 dropped:0 overruns:0 frame:0
          TX packets:182601 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:208264321 (208.2 MB)  TX bytes:16660945 (16.6 MB)
          Interrupt:16 

eth0:0    Link encap:Ethernet  HWaddr 00:1f:bc:01:c3:ab  
          inet addr:192.168.0.164  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:16 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:381963 errors:0 dropped:0 overruns:0 frame:0
          TX packets:381963 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:22755054 (22.7 MB)  TX bytes:22755054 (22.7 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Sospecho que la solución tendrá algo que ver con la tabla de enrutamiento . Muestra lo siguiente cuando el túnel está activo :

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.8.0.9        128.0.0.0       UG    0      0        0 tun0
default         192.168.0.1     0.0.0.0         UG    100    0        0 eth0
10.8.0.0        10.8.0.9        255.255.255.0   UG    0      0        0 tun0
10.8.0.9        *               255.255.255.255 UH    0      0        0 tun0
37.139.23.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
128.0.0.0       10.8.0.9        128.0.0.0       UG    0      0        0 tun0
link-local      *               255.255.0.0     U     1000   0        0 eth0
172.16.0.0      *               255.255.0.0     U     0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0

y lo siguiente cuando el túnel está inactivo :

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    100    0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
172.16.0.0      *               255.255.0.0     U     0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0

Configuración de Virtualbox para Vms:

ingrese la descripción de la imagen aquí

Uno de los /etc/network/interfacesarchivos de VM :

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 172.16.0.3
        netmask 255.255.0.0
        network 172.16.0.0
        broadcast 172.16.255.255
        gateway 172.16.0.1
        dns-nameservers 8.8.8.8
Programador
fuente
¿Cómo se configuran las redes de sus máquinas virtuales en VirtualBox?
zwets
puentes hacia eth0: se agregó información a la pregunta.
Programador del
Sé que no es exactamente la respuesta a su pregunta, pero para mí resultó más fácil configurar 2 conexiones VPN: 1 desde la máquina host, otra desde la máquina invitada
Zhenya

Respuestas:

28

Esto no funcionará en una configuración de red en puente . De la documentación de VirtualBox :

Redes puenteadas

Esto es para necesidades de red más avanzadas, como simulaciones de red y servidores en ejecución en un invitado. Cuando está habilitado, VirtualBox se conecta a una de sus tarjetas de red instaladas e intercambia paquetes de red directamente, evitando la pila de red de su sistema operativo host.

Dado que sus máquinas virtuales están utilizando eth0directamente, no son conscientes de la tun0interfaz para el túnel que se ejecuta sobre él. Deberá usar una configuración de red virtual diferente.

Tiene (entre otras) estas opciones:

  • La traducción de direcciones de red (NAT) es, con mucho, la solución más simple. VirtualBox aplicará NAT a las máquinas virtuales en cualquier conexión de Internet disponible para el host. Esto es totalmente transparente para las máquinas virtuales. Sin embargo, esto impide las conexiones del host a las máquinas virtuales o las conexiones entre las máquinas virtuales.

  • Use Redes solo de host para crear una subred adecuada que contenga las máquinas virtuales y el host. Esto no requerirá cambios en la configuración de la interfaz que ahora tiene en las máquinas virtuales, pero deberá configurar el host para que sea la puerta de enlace y el enrutador, y hacer que las máquinas virtuales sean NAT en el exterior (ya sea a través de él eth0o tun0).

  • Combine lo anterior: proporcione a cada VM dos interfaces, una de entrada al mundo exterior (a través de NAT de VirtualBox ) y la otra conectada a la LAN de solo host .

  • Pruebe la configuración experimental de redes NAT de VirtualBox . Actualización 2019: esta característica ha madurado desde entonces: conéctese al NAT del host y elija el tipo de adaptador de red paravirtualizada (virtio-net) .

zwets
fuente
35

Para VirtualBox con Windows host e invitado Linux (mint), vaya a la pestaña Red UI y configure "Adaptador" => "Adjunto a: NAT" y "Tipo de adaptador: Red paravirtualizada". Después de eso, inicie su VM y debería poder usar la red VPN.

Aks
fuente
1
Esto funcionó muy bien para mí, ¡gracias! Usando Ubuntu 16.04LTS como mi invitado y host de Windows 10, con Virtual Box 5.0.24.
womp
1
¡Brillante! Esto funciona para mi host de Windows 10 y VirtualBox (5.0.26) invitado de CentOS 7.
Zaki
1
¡Asombroso! Debería ser la respuesta aceptada. Estaba buscando esta solución por años. ¡Muchas gracias!
MrSpock
1
mejor respuesta aquí!
Mike
¿Por qué diablos no es esta la respuesta aceptada? ¡Tan fácil y correcto!
Michael Goldshteyn
6

Después de buscar esta solución en todas partes, finalmente encontré una solución que no requiere muchos cambios de configuración y que es realmente simple. Use la red NAT predeterminada y escriba esto en la terminal:

VBoxManage modifyvm "VM name" --natdnsproxy1 on

fuente: https://www.virtualbox.org/ticket/13993

Arier
fuente
4

Tuve el mismo problema Así es como lo resolví:

  1. Cambie el tipo de red del Sistema de invitado para que sea "Solo host"
  2. Haga que la puerta de enlace predeterminada de Guest apunte a la ip del Host ifconfig vboxnet0para encontrarla.

El último paso es enrutar los paquetes que provienen de vboxnet0 a su VPN.

Si enruta todo el tráfico a través de VPN:

iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5

¿Dónde 10.8.0.5está tu puerta de enlace tun0 y 192.168.5.0/24tu rango de red vboxnet0?

Si solo enruta cierto tráfico a través de VPN:

iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o wlan0 -j SNAT --to-source 192.168.43.95

¿Dónde 10.8.0.5está su puerta de enlace tun0 y 192.168.43.95es su wlan0puerta de enlace y 192.168.5.0/24es su rango de red vboxnet0?

Nota: Esta solución permite que el SO huésped sea tratado de la misma manera que el SO host. Solo las IP configuradas para pasar por VPN en el sistema operativo host lo harán en Guest.

Ramast
fuente
3

Aquí hay información útil para los cuadros vagabundos que usan host vpn. Básicamente, debe establecer la opción natdnshostresolver1 Tenga en cuenta que esto NO funcionará cuando use la configuración public_network de Vagrant.

  config.vm.provider :virtualbox do |vb|
      # ---- other options....
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  end

http://renier.morales-rodriguez.net/post/90674523562/sharing-host-vpn-with-virtualbox-guest http://blog.geekslikeshinythings.com/2016/05/sharing-host-vpn-with-vagrant -rob-allen.html

Artistan
fuente
1
El primer enlace tenía la solución para mí. Muestra cómo activar la opción natdnshostresolver1 para la VM.
kol