TL; DR:
- перезагрузите виртуальную машину, убедившись, что статус VPN (подключен или отключен) хоста тем временем не изменяется;
- позволить движку VirtualBox NAT перехватывать запросы DNS и пересылать их распознавателю хоста, то есть использовать API DNS хоста для запроса информации и возврата ее гостю. Вы устанавливаете это:
VBoxManage modifyvm "VM name" --natdnshostresolver1 on
Запуск виртуальной машины на хосте, подключенном к VPN, может привести к проблемам с DNS при каждом изменении статуса VPN. Есть два сценария:
- виртуальная машина порождается в хосте, подключенном к VPN, и в определенный момент VPN отключается;
- виртуальная машина порождается на хосте, не подключенном к VPN, и в определенный момент VPN подключается
1) VPN-подключен -> VPN-отключен
В этом случае виртуальная машина, вероятно, получит адрес DNS, который является частью сети VPN-провайдера. Обычно это будет внутренний частный IP-адрес. Проверьте содержание cat /etc/resolv.conf
. В моем случае я получаю следующее:
nameserver 10.8.8.1
<--- Это внутренняя сеть VPN-провайдера
nameserver 192.168.178.1
<--- Это мой домашний шлюз (роутер)
Теперь отключите хост от VPN-подключения:
- конфигурация DNS в виртуальных машинах не изменяется -> виртуальная машина все еще будет отправлять запросы DNS на IP-адрес назначения 10.8.8.1, который не может быть достигнут, так как хост больше не подключен к VPN
Более подробно:
- пакет будет отправлен в def GW, определенный сетью VirtualBox NAT, источником NATTed (с IP-адресом хоста) и, наконец, обработан таблицей маршрутизации хоста, которая перенаправит его на ваш домашний шлюз.
- Здесь пакет будет отброшен, поскольку ваш домашний шлюз не имеет записи для 10.8.8.1 на стороне LAN (частные адреса) и не может пересылать его на стороне WAN (публичные адреса), поскольку он является частным адресом.
2) VPN-отключен -> VPN-подключен
В этом случае виртуальная машина не получит DNS-адрес, который является частью поставщика сети VPN, поскольку хост не был подключен к VPN при запуске виртуальной машины. Проверьте содержание cat /etc/resolv.conf
. В моем случае я получаю следующее:
nameserver 192.168.178.1
<--- Это мой домашний шлюз (роутер)
Теперь подключите хост к VPN-соединению:
- конфигурация DNS в виртуальных машинах не изменяется -> виртуальная машина будет по-прежнему отправлять DNS-запросы на IP-адрес назначения 192.168.178.1, который не может быть достигнут (пинг до него все еще работает), поскольку теперь DNS-запрос от виртуальной машины обрабатывается интерфейс VPN Tap, который будет перенаправлять пакеты в сеть VPN, где невозможно достичь 192.168.178.1 (ваш внутренний IP-адрес домашнего шлюза).
Более подробно:
- пакет будет отправлен в def GW, определенный сетью VirtualBox NAT, отправленный на интерфейс VPN Tap, который изменит заголовок IP, заменив IP-адрес источника виртуальной машины на IP-адрес, назначенный хосту сетью VPN, в то время как пункт назначения адрес остается DNS-адресом 192.168.178.1.
- этот пакет затем будет инкапсулирован во внешний IP-заголовок, который будет иметь IP-адрес хоста в качестве источника (который впоследствии будет заменен на NAT источника на домашнем шлюзе) и VPN-сервер в качестве адреса назначения.
- когда пакет достигает сети VPN, он декапсулируется. IP-адрес назначения теперь снова является DNS-адресом 192.168.178.1, к которому у сети провайдера VPN нет возможности связаться (за исключением исключительного совпадения, когда это точно такой же IP-адрес, который используется вашим провайдером сети VPN для своего DNS-сервера).