Номер телефона

Последнее обновление:

Как направить HTTP-запрос из хоста в виртуальную машину Virtual Box

В настоящее время пользователи на компьютерах нередко используют виртуальные машины, например, Virtual Box, VMWare и другие. Применение виртуальных машин оправдано, по крайней мере, тем, что в них можно устанавливать другие операционные системы (ОС), а также запускать небезопасные приложения. Иногда возникает необходимость – взаимодействовать с приложениями, работающими в виртуальной машине (точнее, работающими в операционной системе, установленной в виртуальной машине) при помощи вебтехнологий, т.е. на основе HTTP(S)-запросов. Как это сделать?

Исходные данные:

  • Хостовая (основная) ОС: Windows 7
  • Виртуальная машина: Virtual Box
  • Гостевая (т.е. установленная в виртуальной машине) ОС: Linux Ubuntu 16.04.4

В гостевой ОС запущен некий сервер, т.е. программа, которая открыла на прослушивание порт (скажем, под номером 3000), принимает запросы от любого клиента и дает ответ. Неважно, какой конкретно это сервер – то ли Apache, то ли NodeJS, то ли вовсе нечто самодельное. Главное, чтобы программа открыла на прослушивание тот или иной порт и была способна что-то делать в ответ.

При настройках по умолчанию сделать это, конечно, не удастся. Как минимум, потому, что сетевой интерфейс Virtual Box функционирует в режиме NAT.

Мы хотим направлять вебзапрос из хостовой ОС (например, при помощи браузера) программе, которая запущена в гостевой ОС (функционирующей в виртуальной машине).

Виртуальная машина с сетевым интерфейсом в режиме NAT подключается к сети, также как реальный компьютер подключается к Internet через маршрутизатор. "Маршрутизатором" в данном случае выступает сетевой модуль VirtualBox, который обрабатывает сетевой трафик виртуальной машины. Недостаток режима NAT, как и в случае локальной сети за маршрутизатором, в том что:

  • виртуальная машина недоступна для внешней сети (internet);
  • невозможно обрабатывать сетевые запросы, пока не будет настроен проброс портов (см. ниже).

Режим NAT характерен, в частности, тем, что защищает операционную систему от несанкционированного доступа извне. Т.е. при этом невозможно сделать к ней запрос, как к вебсерверу. Однако, если САМА операционная система сделала запрос, то тогда (и только тогда) политика NAT позволяет ей получить ответ. Т.е. в рамках политики NAT операционная система извне может получать только ответы на свои запросы.

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

1. Запускаем Virtual Box

Окно запуска виртуальной машины Virtual Box

Внимание: гостевую ОС, функционирующую в виртуальной машине, пока НЕ ЗАПУСКАЕМ! Иначе невозможно будет сделать нижеидущие настройки.

2. Далее:

Файл -> Настройки -> Сеть -> Виртуальные сети хоста

Там должна быть, по крайней мере, одна сеть вида VirtualBox Host-Only Ethernet Adapter:

сеть вида VirtualBox Host-Only Ethernet Adapter

3. В хостовой ОС выбираем:

Центр управления сетями -> Сетевые подключения

и видим:

Центр управления сетями, cетевые подключения

Т.е. в сетевых подключениях также присутствует VirtualBox Host-Only Network. Скорее всего, он будет отключенным. Тогда следует подключить его. Это делается либо путем двойного клика левой кнопкой мыши, либо путем клика правой кнопкой мыши, затем Подключить.

Тем самым, мы подключим виртуальную сеть, как раз и необходимую для взаимодействия хостовой (Windows 7) и гостевой (Linux Ubuntu) операционных систем.

Отметим, что справа там видны еще VMware Network Adapter VMnet1 и VMware Network Adapter VMnet8. Эти соединения необходимы для сети интернет при работе в другой виртуальной машине - VMware, их мы сегодня касаться не будем, они не нужны для Virtual Box.

4. Нажав на кнопку настроек (для изменения выбранной сети), затем Адаптер, получим:
Настройки, адаптер в сетевых подключениях Windows 7

Видим, что IPv4-адрес назначен как 192.168.56.1. Запомним его, он нам пригодится, так как потом именно на него будем делать запросы. Но, если есть желание, можно выбрать и какой-то другой адрес (НО: исключительно в рамках маски 255.255.255.0).

Перейдя на вкладку DHCP-сервер, убеждаемся, что стоит галочка у «Включить сервер». Если она вдруг отсутствует, ставим ее. DHCP-сервер нужен для автоматического назначения IP-адресов сетевым интерфейсам в виртуальной машине. Если его отключить, скорее всего, придется назначать адреса вручную.

Итак, мы убедились, что IP-адрес задан (или сами задали более подходящий, на наш взгляд, адрес), DHCP-сервер включен. Убедились также, что в сетевых подключениях хостовой ОС имеется соединение VirtualBox Host-Only Network для VirtualBox Host-Only Ethernet Adapter.

5. Далее:

Настроить -> Сеть -> Дополнительно

Видим, что часть настроек невозможна (опции имеют серый цвет):

Окно Virtual Box, демонстрирующее невозможность выполнения части настроек

Что же, это означает, что в предыдущий раз виртуальная машина была не выключена, а сохранена. Выхода два:

  • либо запустить ее и выключить,
  • либо – Сбросить.

Нажимаем кнопку «Сбросить». Затем вновь:

Настроить -> Сеть -> Дополнительно

Как видно, теперь появилась возможность настроек:

Окно Virtual Box, демонстрирующее возможность полной настройки (после сброса состояния этой виртуальной машины)

Отметим, что это – несколько другие сетевые настройки Virtual Box, не те, что присутствуют во вкладке Файл -> Настройки -> Сеть -> Виртуальные сети хоста). Зачем в Virtual Box сделаны РАЗНЫЕ сетевые настройки в РАЗНЫХ вкладках – непонятно…

Сетевой адаптер должен быть включен (должна стоять галочка; если ее почему-то нет - поставьте).

В качестве типа подключения по умолчанию должен быть установлен как раз NAT. Можете кликнуть по выбору типа подключения, там возникнет меню с дополнительными пунктами «Сетевой мост», «Внутренняя сеть», и т.д. В нашем случае они нас не интересуют, нужна именно NAT.

Для того, чтобы трафик из хостовой ОС направлялся в гостевую ОС в условиях NAT, необходимо сделать так называемый проброс портов.

6. Нажимаем кнопку «Проброс портов», затем «Добавить новое правило» (зеленоватая кнопка со знаком +).

Там указываем интересующий нас порт, в данном случае – 3000. Если мы хотим направлять запросы из хостовой системы с порта 3000, тогда как получать их в виртуальной машине в гостевой системе мы планируем на порт, к примеру, 3001, стало быть, указываем это число как для порта хоста, так и для порта гостя:

Окно Virtual Box, демонстрирующее проброс портов в данной виртуальной машине)

Если хотим также, чтобы запросы отправлялись с хоста в виртуальную машину только при обращении по какому-то конкретному IP-адресу, то необходимо его указать в адресе хоста. Точно также, если в виртуальной машине будет несколько IP-интерфейсов и мы хотим направлять запросы только одному из них, следует указать этот адрес в поле «Адрес гостя». Отметим, что можно создать не одно правило, а несколько. Т.е. можно направлять запросы с хоста на разные адреса, по разным портам и, если заданы соответствующие правила, они попадут в виртуальную машину и будут переадресованы соответствующей программе-серверу.

В нашем случае мы не будем утруждаться с IP-адресами, поступим проще: оставим адресные поля пустыми. Это означает, что запросы, направленные с хоста на порт 3000, НЕЗАВИСИМО от IP-адреса, будут попадать в виртуальную машину на порт 3001 по ВСЕМ IP-адресам (если их там будет несколько).

Далее, нажимаем «ОК», затем еще раз «ОК». Может появиться окно, запрашивающее Вашего согласия во внесение изменений в настройки брандмауэра Windows. Это и естественно: ведь мы, строго говоря, ослабляем политику NAT для гостевой ОС (функционирующей в виртуальной машине), разрешая входящие запросы для всех IP-адресов 3001-му порту.

Кстати, номера портов хоста и гостя вполне могут быть и одинаковыми. Дело в том, что это – РАЗНЫЕ порты, используемые в разных операционных системах (хоста и гостя). Поэтому, даже тот факт, что они будут представлены одним и тем же числом, не означает, что они совпадают.

7. Теперь пора запускать операционную систему в виртуальной машине

Что же, запускаем.

8. Проверяем, каков IP-адрес у Ethernet adapter VirtualBox Host-Only Network

Для этого в хостовой ОС (т.е. в Windows 7) запускаем консоль: Пуск -> Выполнить -> cmd

Там пишем: ipconfig. И вот что получаем:

IP-адреса в операционной системе Windows 7 после выполнения проброса портов
Интересно, что в Windows команда формулируется как ipconfig, тогда как несколько аналогичная команда в Linux звучит как ifconfig. Любопытно, для чего такая несогласованность? Чтобы пользователи linux тренировали свою память, что ли? Ведь вариант из Windows – более логичен, речь-то идет об ip-адресах…

В месте, касающемся Virtual Box, можно видеть, что IP-адрес – тот же самый, что мы видели в настройках: 192.168.56.1. Стало быть, все хорошо, на это адрес потом можно будет отправлять запросы (например, из браузера) и они должны попасть в гостевую ОС.


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-2024 Научный консалтинг