Comment faire en sorte que les invités de VirtualBox partagent la connexion VPN de l'hôte?

51

Question

Lorsque je démarre mon VPN sur mon ordinateur de bureau Ubuntu qui fait office de routeur, le sous-réseau connecté perd la connexion à Internet, mais reste accessible (LAN). Idéalement, j'aimerais savoir comment permettre au sous-réseau connecté de reprendre l'accès à Internet en acheminant via le tunnel VPN lorsque le VPN est actif.

Le contexte

J'ai la disposition du réseau suivante:

sous-réseau 172.16.0.0/20 sur eth0 pour mes machines virtuelles VirtualBox.

sous-réseau 192.168.0.0/24 sur eth0: 0 qui se connecte à la passerelle 192.168.0.1 qui dispose d’un accès Internet.

Ceci est indiqué dans le fichier / 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

Les paquets sur l'eth0 sont transférés via eth0: 0 avec masquerading et la connectivité Internet normale convient. Toutefois, lorsque je démarre mon tunnel VPN sur ce routeur, la connectivité Internet est perdue pour les ordinateurs virtuels du sous-réseau eth0 (mais il en reste pour le routeur).

Vous trouverez ci-dessous la sortie de ifconfig lorsque le tunnel est actif:

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)

Je soupçonne que la solution aura quelque chose à voir avec la table de routage . Il montre ce qui suit lorsque le tunnel est actif :

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

et les suivants lorsque le tunnel est inactif :

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

Configuration de Virtualbox pour Vms:

entrez la description de l'image ici

Un des /etc/network/interfacesfichiers VMs :

# 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
Programmeur
la source
Comment les réseaux de vos VM sont-ils configurés dans VirtualBox?
Zwets
ponts vers eth0 - ajout d'informations à la question.
Programster
Je sais que ce n'est pas exactement la réponse à votre question, mais pour moi, il s'est avéré plus facile de configurer deux connexions VPN à la place: une à partir de la machine hôte, une autre à partir de la machine invitée
Zhenya, le

Réponses:

28

Cela ne fonctionnera pas dans une configuration de réseau ponté . À partir de la documentation VirtualBox :

Réseau ponté

Ceci est destiné aux besoins de mise en réseau plus avancés tels que les simulations de réseau et l'exécution de serveurs dans un invité. Lorsqu'il est activé, VirtualBox se connecte à l'une de vos cartes réseau installées et échange directement des paquets réseau, contournant ainsi la pile réseau de votre système d'exploitation hôte.

Étant donné que vos machines virtuelles utilisent eth0directement, elles ne sont pas conscientes de l' tun0interface du tunnel qui les traverse. Vous devrez utiliser une autre configuration de réseau virtuel.

Vous avez (entre autres) ces options:

  • La traduction d'adresses réseau (NAT) est de loin la solution la plus simple. VirtualBox mettra les machines virtuelles en réseau, quelle que soit la connexion Internet disponible pour l'hôte. Ceci est totalement transparent pour les VM. Toutefois, cela empêche les connexions de l'hôte aux machines virtuelles ou les connexions entre les machines virtuelles.

  • Utilisez la mise en réseau hôte uniquement pour créer un sous-réseau approprié contenant les ordinateurs virtuels et l'hôte. Cela ne nécessitera aucun changement dans la configuration d'interface que vous avez maintenant dans les ordinateurs virtuels, mais vous devrez configurer l'hôte pour qu'il soit la passerelle et le routeur, et lui faire passer les ordinateurs virtuels en NAT à l'extérieur (que ce soit par son eth0ou ou tun0).

  • Combinez ce qui précède: attribuez à chaque machine virtuelle deux interfaces, l’une faisant la passerelle vers le monde extérieur (via le NAT de VirtualBox ) et l’autre connectée au réseau local hôte uniquement .

  • Essayez la configuration réseau expérimentale de VirtualBox . Mise à jour 2019: cette fonctionnalité a depuis évolué: attachez-vous au NAT de l'hôte et choisissez le type d'adaptateur de réseau paravirtualisé (virtio-net) .

zwets
la source
35

Pour VirtualBox avec un hôte Windows et un invité linux (mint), accédez à l'onglet Interface utilisateur réseau et définissez-le sur "Adaptateur" => "Attaché à: NAT" et "Type d'adaptateur: réseau paravirtualisé". Après cela, démarrez votre machine virtuelle et vous devriez pouvoir utiliser le réseau VPN.

Aks
la source
1
Cela a bien fonctionné pour moi, merci! Utiliser Ubuntu 16.04LTS en tant qu’invité et hôte Windows 10, avec Virtual Box 5.0.24.
Womp
1
Brillant! Cela fonctionne pour mon hôte Windows 10 et mon invité CentOS 7 pour VirtualBox (5.0.26).
Zaki
1
Incroyable! Devrait être la réponse acceptée. Je cherchais cette solution depuis des lustres. Merci beaucoup!
MrSpock
1
meilleure réponse ici!
Mike
Pourquoi diable n'est-ce pas la réponse acceptée? Si facile et correct!
Michael Goldshteyn
6

Après avoir recherché cette solution partout, j’ai finalement trouvé une solution efficace, qui n’exige pas beaucoup de modifications de la configuration et qui est très simple. Utilisez le réseau NAT par défaut et tapez ceci dans le terminal:

VBoxManage modifyvm "VM name" --natdnsproxy1 on

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

Arier
la source
4

Avait le même problème. Voici comment je l'ai résolu:

  1. Modifier le type de réseau du système invité en "hôte uniquement"
  2. Faites en sorte que la passerelle par défaut de l'invité pointe sur l'ip de l'hôte ifconfig vboxnet0pour la trouver.

La dernière étape consiste à router les paquets provenant de vboxnet0 dans votre VPN.

Si vous acheminez tout le trafic via 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

Où se 10.8.0.5trouve votre passerelle tun0 et 192.168.5.0/24votre plage réseau vboxnet0.

Si vous n'acheminez que certains trafics via 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

Où se 10.8.0.5trouve votre passerelle tun0, 192.168.43.95votre wlan0passerelle et 192.168.5.0/24votre plage réseau vboxnet0.

Remarque: Cette solution permet de traiter l'OS invité de la même manière que l'OS hôte. Seules les adresses IP configurées pour passer par un réseau privé virtuel dans le système d'exploitation hôte le traversent en tant qu'invité.

Ramast
la source
3

Voici quelques informations utiles pour les boîtes vagabondes utilisant l'hôte VPN. En gros, vous devez définir l'option natdnshostresolver1. Notez que cela NE fonctionnera PAS si vous utilisez le paramètre 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
la source
1
Le premier lien avait la solution pour moi. Il montre comment activer l'option natdnshostresolver1 pour la machine virtuelle.
Kol