Como encaminhar localhost + uma porta para uma VM do Windows

1

Estou em um Mac executando uma VM do Windows no Parallels, gostaria de - no meu mac - poder acessar http://localhost:44300e 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 44300e pressionar a localhost:44300partir 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:

Funciona de dentro da VM

Meu netstatneste momento lê

 TCP    127.0.0.1:44300        :0                     LISTENING

Neste ponto, tentar curldo 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

Porta encaminhada no Parallels

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 curleu 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:

O Wireshark mostra um pedido sendo morto

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 é localhostespecial (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.

George Mauer
fonte

Respostas:

-1

127.0.0.1 ou localhost é um IP / nome de host especial. Funciona apenas quando você está se referindo a uma porta que está aberta na máquina atual. Você pode ter contornado isso encaminhando uma porta do host da VM para o convidado da VM, mas provavelmente a solução mais robusta é usar o endereço IP da máquina virtual. Conecte-se diretamente ao convidado; pule todas as regras de firewall, regras de encaminhamento e traduções de endereços. Você está tornando isso muito difícil.

Basta executar o ipconfig de dentro do seu convidado, obter o IP e usá-lo.

Andy
fonte
Oi Andy, isso realmente não responde à pergunta. Estou ciente de como atingir VMs convidadas por meio do endereço IP, no entanto, isso exige uma reformulação do meu aplicativo e, pior ainda, a configuração de uma rede em ponte e a rejeição de todas as solicitações de um roteador compartilhado. Na minha situação, trabalho muito em uma variedade de cafeterias e a constante reconfiguração é ininterrupta. Como eu disse, este é certamente algo que é possível, como quando você executar um aplicativo em janela de encaixe que faz precisamente isso, permitindo que você use localhostque é encaminhado para o recipiente (que fora do linux está em uma VM.
George Mauer
Você deve marcar sua pergunta com 'docker' para que as pessoas que estão mais familiarizadas com o seu ambiente possam ajudar.
Andy
Mas não estou usando o docker, estou apenas apontando para o fato de que o docker faz isso como prova de que é possível. Se eu o etiquetasse com docker, eu seria criticado por atrair pessoas que estivessem em uma pergunta que não tem nada a ver com docker
George Mauer