Estou em um Mac executando uma VM do Windows no Parallels, gostaria de - no meu mac - poder acessar http://localhost:44300
e ter essa solicitação atendida por um aplicativo em execução na VM.
Eu sei que isso é possível, pois, quando executo o docker, é isso que ele faz, posso criar um aplicativo, executá-lo no contêiner do docker na porta 44300
e pressionar a localhost:44300
partir da máquina host. Simplesmente não sei como configurar meu Windows + VM para fazer isso.
Então, eu criei um servidor web simples no nodejs que apenas responde com um carimbo de data / hora. Isso funciona quando atingido de dentro da máquina virtual:
Meu netstat
neste momento lê
TCP 127.0.0.1:44300 :0 LISTENING
Neste ponto, tentar curl
do host, obviamente, não funciona
$ curl http://localhost:44300
curl: (7) Failed to connect to localhost port 44300: Connection refused
Então, para abrir isso na máquina host, encaminho a porta no Parallels na minha configuração NAT
Eu também crio uma regra 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)
Agora, quando curl
eu recebo algo diferente
$ curl http://localhost:44300 --max-time 3
curl: (28) Operation timed out after 3004 milliseconds with 0 bytes received
Isso parece ser devido ao meu firewall do Windows. Eu (temporariamente) desativo:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
e agora entendi algo diferente mais uma vez
$ curl http://localhost:44300 --max-time 3
curl: (56) Recv failure: Connection reset by peer
O que me parece que a solicitação está passando para a VM, mas sendo encerrada por algo dentro da VM (meu entendimento é que é o mesmo ponto).
Para confirmar que abro o wireshark, vejo o seguinte:
Então, a VM vê a solicitação e, em seguida, algo redefine-a com um RST ... E aí eu fico sem idéias o que mais precisa ser feito.
Sugeri-me que o problema é localhost
especial (claro que é), mas acho que demonstrei acima que a solicitação está entrando na VM, está ultrapassando o firewall, simplesmente não está acontecendo. mais distante. O que mais posso verificar / fazer?
Edit 1: Como isso soa maluco, mas vou tentar, tentei mapear localhosts para meu IP de convidado no arquivo de hosts do Windows - sem dados, o mesmo resultado.
Edição 2: Tentei executar o netcat para configurar um servidor de soquete e posso fazer a telnet do host e enviar mensagens para o servidor de soquete. Isso sem dúvida prova que os pedidos estão chegando à vm. Uma pista interessante é que, enquanto o wireshark mostra a solicitação, o violinista não.
fonte
localhost
que é encaminhado para o recipiente (que fora do linux está em uma VM.