Как я могу сделать так, чтобы гости VirtualBox совместно использовали VPN-подключение хоста?

51

Вопрос

Когда я запускаю VPN на настольном компьютере с Ubuntu, который работает как маршрутизатор, подключенная подсеть теряет подключение к Интернету, но остается доступной (LAN). В идеале я хотел бы знать, как разрешить подключенной подсети повторно получать доступ в Интернет путем маршрутизации через VPN-туннель, когда VPN активна.

контекст

У меня есть следующая схема сети:

подсеть 172.16.0.0/20 на eth0 для моих виртуальных машин VirtualBox.

подсеть 192.168.0.0/24 на eth0: 0, которая подключается к шлюзу 192.168.0.1, который имеет доступ к Интернету.

Это показано в файле / 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

Пакеты на eth0 пересылаются через eth0: 0 с маскировкой, и нормальное подключение к Интернету в порядке. Однако, когда я запускаю свой VPN-туннель на этом маршрутизаторе, подключение к Интернету теряется для виртуальных машин в подсети eth0 (но остается для маршрутизатора).

Ниже приведен вывод ifconfig, когда туннель активен:

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)

Я подозреваю, что решение будет иметь какое-то отношение к таблице маршрутизации . Когда туннель активен, он показывает следующее :

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

и следующее, когда туннель неактивен :

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

Конфигурация Virtualbox для Vms:

введите описание изображения здесь

Один из /etc/network/interfacesфайлов виртуальных машин :

# 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
Programster
источник
Как сети вашей виртуальной машины настроены в VirtualBox?
zwets
bridges to eth0 - добавил информацию к вопросу.
Programster
Я знаю, что это не совсем ответ на ваш вопрос, но для меня оказалось, что проще установить вместо этого 2 VPN-соединения: 1 с хост-машины, другое с гостевой машины
Женя

Ответы:

28

Это не будет работать в настройке мостовой сети . Из документации VirtualBox :

Мостовая сеть

Это для более сложных сетевых нужд, таких как сетевое моделирование и запуск серверов в гостевой системе. При включении VirtualBox подключается к одной из установленных сетевых карт и обменивается сетевыми пакетами напрямую, обходя сетевой стек операционной системы хоста.

Поскольку ваши виртуальные машины используют eth0напрямую, они не знают об tun0интерфейсе туннеля, проходящего через него. Вам нужно будет использовать другую конфигурацию виртуальной сети.

У вас есть (среди прочих) эти варианты:

  • Трансляция сетевых адресов (NAT) - безусловно, самое простое решение. VirtualBox будет NAT виртуальных машин через любое подключение к Интернету, доступное для хоста. Это полностью прозрачно для виртуальных машин. Однако это исключает подключения от хоста к виртуальным машинам или соединения между виртуальными машинами.

  • Используйте сеть только для хоста, чтобы создать правильную подсеть, содержащую виртуальные машины и хост. Это не потребует никаких изменений в конфигурации интерфейса, которую вы сейчас имеете в виртуальных машинах, но вам нужно будет настроить хост в качестве шлюза и маршрутизатора и сделать его NAT виртуальными машинами для внешней среды (будь то ее eth0или tun0).

  • Объедините все вышеперечисленное: предоставьте каждой виртуальной машине два интерфейса, один шлюз к внешнему миру (через NAT VirtualBox ), а другой подключен к локальной сети только для хоста .

  • Попробуйте экспериментальную конфигурацию NAT для VirtualBox . Обновление 2019: эта функция с тех пор переросла: подключитесь к NAT хоста и выберите тип адаптера паравиртуализированной сети (virtio-net) .

zwets
источник
35

Для VirtualBox с хостом Windows и гостевым linux (mint) перейдите на вкладку «Сетевой интерфейс» и установите для «Adapter» => «Attached to: NAT» и «Тип адаптера: паравиртуализированная сеть». После этого запустите виртуальную машину, и вы сможете использовать сеть VPN.

Акс
источник
1
Это отлично сработало для меня, спасибо! Использование Ubuntu 16.04LTS в качестве моего гостя и хоста Windows 10 с Virtual Box 5.0.24.
womp
1
Brilliant! Это работает для моего хоста Windows 10 и гостя CentOS 7 VirtualBox (5.0.26).
Заки
1
Удивительно! Должен быть принятый ответ. Искал это решение целую вечность. Большое спасибо!
MrSpock
1
лучший ответ здесь!
Майк
Какого черта это не принятый ответ? Так просто и правильно!
Михаил Гольдштейн
6

После повсеместного поиска этого решения я, наконец, нашел работающее решение, которое не требует больших изменений конфигурации и является действительно простым. Используйте сеть NAT по умолчанию и введите это в терминале:

VBoxManage modifyvm "VM name" --natdnsproxy1 on

источник: https://www.virtualbox.org/ticket/13993

Arier
источник
4

Была такая же проблема. Вот как я это решил:

  1. Измените тип сети Гостевой системы на «Только хост»
  2. Сделайте шлюз по умолчанию Гостя, указывающий на ip Хоста, ifconfig vboxnet0чтобы найти его.

Последний шаг - маршрутизация пакетов, поступающих из vboxnet0 в вашу VPN.

Если вы маршрутизируете весь трафик через 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

Где 10.8.0.5находится ваш шлюз tun0 и 192.168.5.0/24диапазон сети vboxnet0.

Если вы только маршрутизируете определенный трафик через 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

Где 10.8.0.5ваш tun0 шлюз и 192.168.43.95ваш wlan0шлюз «s и 192.168.5.0/24ваш диапазон vboxnet0 сети.

Примечание. Это решение позволяет обращаться с гостевой ОС так же, как и с хост-ОС. Только IP-адреса, настроенные для прохождения VPN в Host OS, будут проходить через него в гостевой системе.

Ramast
источник
3

Вот некоторая полезная информация для бродячих ящиков, использующих хост vpn. По сути, вам нужно установить параметр natdnshostresolver1. Обратите внимание, что это НЕ будет работать при использовании параметра public_network в 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 Роб-allen.html

Artistan
источник
1
Первая ссылка имела решение для меня. В нем показано, как включить параметр natdnshostresolver1 для виртуальной машины.
Кол