У меня была точно такая же проблема, и я дошел до ее разрешения, поэтому я с удовольствием объясню проблему и ее решение в деталях.
Без привлечения VPN
Важно понимать конфигурацию, которая требуется для удовлетворения ваших требований без использования VPN. Кроме того, эта информация предполагает, что ни программный брандмауэр не мешает ни на хосте, ни на госте.
Без VPN это обычно решается путем создания двух сетевых адаптеров в конфигурации виртуальной машины.
Первый адаптер должен быть установлен в режим NAT
, который позволяет гостю получать доступ к сетевым ресурсам (включая Интернет) через сетевой интерфейс хоста.
Второй адаптер должен быть установлен только для Host-only
, что обеспечивает двунаправленную связь между хостом и гостем.
Этот адаптер немного сложнее в настройке, чем первый, потому что он требует изменения глобальных сетевых настроек VirtualBox для настройки адаптера только для хоста (примечание: для этого требуются права администратора).
В VirtualBox перейдите в File -> Preferences -> Network
. Перейдите на вкладку « Host-only Networks
» и нажмите маленький значок « +
чтобы добавить новый адаптер. Вам будет предложено повысить разрешения VirtualBox.
Заполнение вкладки Adapter
обязательно; это должно выглядеть примерно так (игнорируйте адаптер с меткой #2
; он используется для чего-то не связанного):
Значения на вкладке DHCP
сервера являются необязательными. Если вы собираетесь жестко закодировать IP-адрес для этого адаптера в конфигурации сети гостя, тогда эти значения не нужны. Если, с другой стороны, вы собираетесь использовать DHCP, значения могут выглядеть примерно так:
Последний шаг в настройке VirtualBox - вернуться к сетевой конфигурации виртуальной машины и добавить второй адаптер, который ссылается на только что созданный адаптер хоста:
Теперь в гостевой операционной системе сеть должна быть настроена на использование этих двух сетевых интерфейсов.
В Debian или Ubuntu GNU/Linux конфигурация так же проста, как изменение /etc/network/interfaces
чтобы она выглядела следующим образом:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet dhcp
# The secondary network interface
auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
(пурист может предпочесть использовать каталог /etc/network/interfaces.d
, но это выходит за рамки этого объяснения)
Перезапустите гостевые сетевые службы или, проще говоря, перезапустите всю гостевую виртуальную машину, и все должно "просто работать".
На этом этапе необходимо иметь возможность пропинговать гостевую виртуальную машину по 192.168.56.101
и получить ответ (при условии, что программный брандмауэр не создает помех).
Аналогично, нужно иметь возможность пинговать хост на 10.0.2.2
. Этот IP-адрес, по-видимому, "жестко запрограммирован" в реализации NAT VirtualBox или, по крайней мере, указан с помощью некоторой неочевидной директивы конфигурации, и информация о его происхождении ограничена. Но, увы, "это просто работает".
Учитывая эту конфигурацию, все три условия, изложенные в вашем вопросе, выполнены.
Введите: VPN
Но вот в чем дело. Введение VPN вызывает проблему остановки показа (ну, в зависимости от конкретной VPN и ее конфигурации).
Современные VPN способны к разделенному туннелированию, которое требуется для работы вышеупомянутой конфигурации VirtualBox в соответствии с вашими тремя требованиями. По (хорошим) причинам безопасности разделенное туннелирование часто отключается, и это как раз проблема в вашем случае (и в моем).
Когда вы подключаетесь к VPN, VPN-клиент (в моем случае Cisco AnyConnect Secure Mobility Client, 3.1.02026) проверяет таблицы маршрутизации хост-компьютера, запоминает их, а затем передает их значениям, которые обычно поступают из некоторого централизованно- управляемое местоположение (т. е. даже с правами локального администратора невозможно изменить настройки).
Вы можете проверить таблицы маршрутизации самостоятельно, открыв command.exe
(в Windows):
C:\>route print
Перед подключением к VPN таблица маршрутизации содержит важные записи, которые позволяют этой конфигурации VirtualBox работать правильно. Подключение к VPN приводит к удалению этих записей, что предотвращает связь между хостом и гостем.
(Есть много других записей, которые я здесь пропустил, так как они не имеют отношения к основной причине такого поведения.)
Перед подключением к VPN:
192.168.56.0 255.255.255.0 On-link 192.168.56.1 266
192.168.56.1 255.255.255.255 On-link 192.168.56.1 266
192.168.56.255 255.255.255.255 On-link 192.168.56.1 266
224.0.0.0 240.0.0.0 On-link 192.168.56.1 266
255.255.255.255 255.255.255.255 On-link 192.168.56.1 266
После подключения к VPN:
192.168.56.1 255.255.255.255 On-link 192.168.56.1 266
224.0.0.0 240.0.0.0 On-link 192.168.56.1 266
255.255.255.255 255.255.255.255 On-link 192.168.56.1 266
VPN-клиент удаляет следующие строки:
192.168.56.0 255.255.255.0 On-link 192.168.56.1 266
192.168.56.255 255.255.255.255 On-link 192.168.56.1 266
Без этих двух последних записей хост и гость не могут обмениваться данными, и это именно то, что предполагается, когда раздельное туннелирование отключено в конфигурации VPN.
Обычно эти две команды восстанавливают эти маршруты:
C:\>route ADD 192.168.56.0 MASK 255.255.255.0 192.168.56.1 METRIC 266
C:\>route ADD 192.168.56.255 MASK 255.255.255.255 192.168.56.1 METRIC 266
Но VPN-клиент остается бдительным: он перехватывает попытки изменить таблицу маршрутизации. Мой клиент, кажется, разрешает вторую запись, но не первую. (И это может периодически отменять оба варианта; я не проверял это.)
Если ваша конкретная VPN и ее сопутствующая конфигурация позволяют включить раздельное туннелирование, оно обычно включается следующим образом:
После отключения от VPN клиенты VPN с хорошим поведением восстановят таблицы маршрутизации, которые были до подключения. Кажется, мой VPN-клиент делает это надежно, что выгодно, потому что это означает, что гостевую виртуальную машину не нужно перезапускать, когда я подключаюсь или отключаюсь от VPN. В таких случаях вторичный адаптер виртуальной машины сбрасывается, но он автоматически и прозрачно повторно получает свой IP-адрес, почти немедленно восстанавливая связь между хостом и гостем. Более того, NFS-монтирования между хостом и гостем (я использую CIFS-монтирования) остаются подключенными при операциях подключения / отключения VPN.
В том маловероятном случае, если ваш VPN разрешает раздельное туннелирование, может быть достаточно просто включить его, и в этом случае я хотел бы услышать от вас, действительно ли "все просто работает".