Я работаю на 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
Я также создаю правило 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, где я вижу следующее:
Итак, виртуальная машина видит запрос, затем что-то сбрасывает его с помощью RST ...И там у меня заканчиваются идеи, что еще нужно сделать.
У меня было это предложил мне , что проблема в том , что localhost
специальный (это, конечно , есть), но я думаю , что я продемонстрировал выше , что запрос получает в VM, ее обходя брандмауэр, его просто не будет дальше Что еще я могу проверить / сделать?
Изменить 1: как это звучит безумно, но я попробую, я попытался сопоставить локальные хосты с моим гостевым IP-адресом в файле хостов Windows - без кубиков, тот же результат.
Редактировать 2: я попытался запустить netcat для настройки сервера сокетов и могу подключиться к серверу через telnet и отправить сообщения серверу сокетов. Это, несомненно, доказывает, что запросы попадают в VM. Интересная подсказка в том, что, хотя wireshark показывает запрос, fiddler - нет.