如何将本地主机 + 端口转发到 Windows VM

如何将本地主机 + 端口转发到 Windows VM

我在 Mac 上通过 Parallels 运行 Windows VM,我希望 - 从我的 Mac 上 - 能够访问该http://localhost:44300请求并由 VM 内运行的应用程序来处理该请求。

我知道这是可能的,因为当我运行docker时,它实际上就是这样做的,我可以创建一个应用程序,在端口上的docker容器中运行它,然后从主机上44300访问。我根本不知道如何配置我的Windows + VM来执行此操作。localhost:44300

因此,我在 nodejs 中创建了一个简单的 web 服务器,它只回复一个时间戳。当从虚拟机内部访问时,它可以正常工作:

在虚拟机内部工作

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

因此,为了向主机开放这个功能,我在 NAT 配置中转发了 Parallels 中的端口

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 显示请求被终止

因此,VM 会看到该请求,然后某些东西会使用 RST 将其重置...然后我就不知道还需要做什么了。

有人向我建议,这个问题很localhost特殊(当然是这样的),但我认为我已经在上面证明了这个请求进入虚拟机后,它越过了防火墙,但无法再继续前进。我还能检查/做什么?

编辑1: 虽然这听起来很疯狂但我会尝试一下,我尝试将本地主机映射到我的 Windows 主机文件中的客户 IP - 没有成功,结果相同。

编辑2: 我尝试运行 netcat 来设置套接字服务器,并且可以从主机远程登录并向套接字服务器发送消息。这毫无疑问证明请求正在进入虚拟机。一个有趣的线索是,虽然 wireshark 显示请求,但 fiddler 没有。

答案1

127.0.0.1 或 localhost 是特殊的 IP/主机名。它仅在您引用当前计算机上打开的端口时才有效。您可能通过将端口从 VM 主机转发到 VM 客户机来规避此问题,但更可靠的解决方案可能是使用虚拟机的 IP 地址。直接连接到客户机;跳过所有防火墙规则、转发规则和地址转换。您让这变得太困难了。

只需在您的客户端中运行 ipconfig,获取 IP,然后使用它。

相关内容