Jak zmusić gości VirtualBox do udostępniania połączenia VPN hosta?

50

Pytanie

Kiedy uruchamiam VPN na moim komputerze stacjonarnym ubuntu, który działa jak router, podłączona podsieć traci połączenie z Internetem, ale nadal jest dostępna (LAN). Idealnie chciałbym wiedzieć, jak włączyć podłączoną podsieć, aby ponownie uzyskać dostęp do Internetu, kierując się przez tunel VPN, gdy sieć VPN jest aktywna.

Kontekst

Mam następujący układ sieci:

podsieć 172.16.0.0/20 na eth0 dla moich maszyn wirtualnych VirtualBox.

podsieć 192.168.0.0/24 na eth0: 0, która łączy się z bramą 192.168.0.1, która ma dostęp do Internetu.

Jest to pokazane w pliku / 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

Pakiety na eth0 są przekazywane przez eth0: 0 z maskaradowaniem i normalna łączność z Internetem jest w porządku. Jednak po uruchomieniu tunelu VPN na tym routerze łączność z Internetem zostaje utracona dla maszyn wirtualnych w podsieci eth0 (jednak pozostaje dla routera).

Poniżej znajduje się wynik działania ifconfig, gdy tunel jest aktywny:

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)

Podejrzewam, że rozwiązanie będzie miało coś wspólnego z tablicą routingu . Pokazuje, kiedy tunel jest aktywny :

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

oraz następujące, gdy tunel jest nieaktywny :

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

Konfiguracja Virtualbox dla Vms:

wprowadź opis zdjęcia tutaj

Jeden z /etc/network/interfacesplików 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
Programista
źródło
Jak są skonfigurowane sieci maszyn wirtualnych w VirtualBox?
zwets
pomosty do eth0 - dodano informacje do pytania.
Programster
Wiem, że to nie jest dokładnie odpowiedź na twoje pytanie, ale dla mnie łatwiej było skonfigurować zamiast tego 2 połączenia VPN: 1 z komputera hosta, inne z komputera gościa
Zhenya

Odpowiedzi:

28

To nie zadziała w konfiguracji Bridged Networking . Z dokumentacji VirtualBox :

Bridged networking

Jest to przeznaczone do bardziej zaawansowanych potrzeb sieciowych, takich jak symulacje sieciowe i uruchamianie serwerów u gościa. Po włączeniu VirtualBox łączy się z jedną z zainstalowanych kart sieciowych i bezpośrednio wymienia pakiety sieciowe, omijając stos sieciowy systemu operacyjnego hosta.

Ponieważ maszyny wirtualne używają eth0bezpośrednio, nie są świadome tun0interfejsu prowadzącego do tunelu. Musisz użyć innej konfiguracji sieci wirtualnej.

Masz (między innymi) następujące opcje:

  • Network Address Translation (NAT) jest zdecydowanie najprostszym rozwiązaniem. VirtualBox będzie NAT maszyn wirtualnych poprzez dowolne połączenie internetowe dostępne dla hosta. Jest to w pełni przejrzyste dla maszyn wirtualnych. Wyklucza to jednak połączenia między hostem a maszynami wirtualnymi lub połączenia między maszynami wirtualnymi.

  • Użyj sieci tylko do hosta, aby utworzyć odpowiednią podsieć zawierającą maszyny wirtualne i host. Nie będzie to wymagało żadnych zmian w konfiguracji interfejsu, którą teraz masz na maszynach wirtualnych, ale musisz skonfigurować hosta, aby był bramą i routerem, i ustawić NAT na maszynach wirtualnych na zewnątrz (czy to na jego, eth0czy na tun0).

  • Połącz powyższe: daj każdej maszynie wirtualnej dwa interfejsy, jeden bramkujący do świata zewnętrznego (poprzez NAT VirtualBox ), a drugi podłączony do sieci LAN typu Host-Only .

  • Wypróbuj eksperymentalną konfigurację NAT NAT VirtualBox . Aktualizacja 2019: ta funkcja jest od tego czasu dojrzała: dołącz do NAT hosta i wybierz typ adaptera sieci parawirtualizowanej (virtio-net) .

zwets
źródło
34

W przypadku VirtualBox z hostem Windows i gościem linux (mint) przejdź do zakładki Network UI i ustaw „Adapter” => „Attached to: NAT” i „Type adapter: Paravirtualized network”. Następnie uruchom maszynę wirtualną i powinieneś być w stanie korzystać z sieci VPN.

Aks
źródło
1
Działa mi to świetnie, dzięki! Używanie Ubuntu 16.04LTS jako mojego gościa i hosta systemu Windows 10 z Virtual Box 5.0.24.
womp
1
Znakomity! Działa to dla mojego hosta Windows 10 i gościa VirtualBox (5.0.26) CentOS 7.
Zaki
1
Niesamowity! Powinna być zaakceptowana odpowiedź. Od wieków szukałem tego rozwiązania. Wielkie dzięki!
MrSpock
1
najlepsza odpowiedź tutaj!
Mike
Dlaczego do cholery nie jest to zaakceptowana odpowiedź? Tak łatwo i poprawnie!
Michael Goldshteyn
6

Poszukując wszędzie tego rozwiązania, w końcu znalazłem działające rozwiązanie, które nie wymaga wielu zmian konfiguracji i jest naprawdę proste. Użyj domyślnej sieci NAT i wpisz ją w terminalu:

VBoxManage modifyvm "VM name" --natdnsproxy1 on

źródło: https://www.virtualbox.org/ticket/13993

Arier
źródło
4

Miałem ten sam problem. Oto jak to rozwiązałem:

  1. Zmień typ sieci systemu gościa na „Tylko host”
  2. Ustaw domyślną bramę punktu Gość na adres IP hosta, ifconfig vboxnet0aby ją znaleźć.

Ostatnim krokiem jest routing pakietów pochodzących z vboxnet0 do sieci VPN.

Jeśli przekierujesz cały ruch przez 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

Gdzie 10.8.0.5jest twoja brama tun0 i 192.168.5.0/24zasięg sieci vboxnet0.

Jeśli kierujesz tylko określony ruch przez 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

Gdzie 10.8.0.5jest twoja brama tun0 i 192.168.43.95twoja wlan0brama oraz 192.168.5.0/24zasięg sieci vboxnet0.

Uwaga: To rozwiązanie pozwala traktować system operacyjny gościa w taki sam sposób, jak system operacyjny hosta. Tylko adresy IP skonfigurowane do przejścia przez VPN w hoście OS będą przechodzić przez to w Gość.

Ramast
źródło
3

Oto kilka przydatnych informacji na temat włóczęgów korzystających z hosta VPN. Zasadniczo musisz ustawić opcję natdnshostresolver1 Zauważ, że NIE zadziała to podczas korzystania z ustawienia sieci publicznej 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
źródło
1
Pierwszy link miał dla mnie rozwiązanie. Pokazuje, jak włączyć opcję natdnshostresolver1 dla maszyny wirtualnej.
kol