1

Я работаю на Mac с виртуальной машиной Windows в Parallels, и я хотел бы - с моего Mac - иметь возможность нажать http://localhost:44300 и обработать этот запрос приложением, работающим внутри виртуальной машины.

Я знаю, что это возможно, поскольку, когда я запускаю docker, фактически это то, что он делает, я могу создать приложение, запустить его в контейнере docker на порту 44300 , а затем нажать localhost:44300 с хост-машины. Я просто не знаю, как настроить виртуальную машину Windows + для этого.

Поэтому я создал простой веб-сервер в nodejs, который просто отвечает отметкой времени. Это работает при попадании изнутри виртуальной машины:

Работает изнутри ВМ

Мой netstat в этот момент читает

 TCP    127.0.0.1:44300        :0                     LISTENING

На этом этапе попытка curl с хоста, конечно, не работает

 $ curl http://localhost:44300
 curl: (7) Failed to connect to localhost port 44300: Connection refused

Таким образом, чтобы открыть это на хост-машине, я пересылаю порт в Parallels в моей конфигурации NAT

Переадресованный порт в Parallels

Я также создаю правило urlacl:

PS C:\Users\gmauer> netsh http show urlacl | select-string 44300 -Context 1,5


>     Reserved URL            : http://*:44300/
          User: \Everyone
              Listen: Yes
              Delegate: No
              SDDL: D:(A;;GX;;;WD)

Теперь, когда я curl я получаю что-то другое

 $ curl http://localhost:44300 --max-time 3
 curl: (28) Operation timed out after 3004 milliseconds with 0 bytes received

Похоже, это связано с моим брандмауэром Windows. Я (временно) отключаю это:

Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

и теперь я снова получаю что-то другое

 $ curl http://localhost:44300 --max-time 3
 curl: (56) Recv failure: Connection reset by peer

Что мне кажется , что запрос проходит в VM , но закрываются на что - то внутри виртуальной машины (я понимаю, что это равноправное).

Чтобы подтвердить, что я открываю wireshark, где я вижу следующее:

Wireshark показывает запрос убитым

Итак, виртуальная машина видит запрос, затем что-то сбрасывает его с помощью RST ...И там у меня заканчиваются идеи, что еще нужно сделать.

У меня было это предложил мне , что проблема в том , что localhost специальный (это, конечно , есть), но я думаю , что я продемонстрировал выше , что запрос получает в VM, ее обходя брандмауэр, его просто не будет дальше Что еще я могу проверить / сделать?

Изменить 1: как это звучит безумно, но я попробую, я попытался сопоставить локальные хосты с моим гостевым IP-адресом в файле хостов Windows - без кубиков, тот же результат.

Редактировать 2: я попытался запустить netcat для настройки сервера сокетов и могу подключиться к серверу через telnet и отправить сообщения серверу сокетов. Это, несомненно, доказывает, что запросы попадают в VM. Интересная подсказка в том, что, хотя wireshark показывает запрос, fiddler - нет.

1 ответ1

-1

127.0.0.1 или localhost - это специальный IP/ имя хоста. Это работает только тогда, когда вы обращаетесь к порту, который открыт на текущем компьютере. Возможно, вы обошли это, перенаправив порт с хоста виртуальной машины на гостевую виртуальную машину, но, возможно, более надежным решением является использование IP-адреса виртуальной машины. Подключайтесь напрямую к гостю; пропустите все правила брандмауэра, правила пересылки и преобразования адресов. Вы делаете это слишком сложно.

Просто запустите ipconfig из своего гостя, получите IP и используйте его вместо этого.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .