Windows 10 WSL cURL 无法访问本地主机并出现错误(无法连接到本地主机端口 80:连接被拒绝)

Windows 10 WSL cURL 无法访问本地主机并出现错误(无法连接到本地主机端口 80:连接被拒绝)

我的 WSL 存在以下问题:我的 WSL 无法在 localhost 下的任何地方发出 cURL 请求。对于此示例,我创建了一个返回 hello world 的页面。

我的 cURL 看起来像这样(请注意,即使使用,响应也是相同的http://

curl -vvv localhost:80/hello_world.html

响应如下

*   Trying 127.0.0.1...
* TCP_NODELAY set
* connect to 127.0.0.1 port 80 failed: Connection refused
* Failed to connect to localhost port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 80: Connection refused

现在,如果我在 Powershell 上运行以下 cURL:

curl  http://localhost:80/hello_world.html

我得到的答复是

StatusCode        : 200
StatusDescription : OK
Content           : <h1> Hello World </h1>
RawContent        : HTTP/1.1 200 OK
                    Keep-Alive: timeout=5, max=100
                    Connection: Keep-Alive
                    Accept-Ranges: bytes
                    Content-Length: 22
                    Content-Type: text/html
                    Date: Mon, 24 Feb 2020 09:52:20 GMT
                    ETag: "16-59f4f46118cab...
Forms             : {}
Headers           : {[Keep-Alive, timeout=5, max=100], [Connection, Keep-Alive], [Accept-Ranges, bytes], [Content-Length, 22]...}    Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 22

它返回的是实际的 hello world,而不是我在 WSL 上收到的错误消息

例如curl: (7) Failed to connect to localhost port 80: Connection refused


编辑:服务器在 Windows 10 机器上运行,curl 也在同一台 Windows 10 机器上运行。此外,Windows 使用的是 Insider 版本 19569.100

更新:我退房了这篇微软文章@Anaksunaman 在评论中分享并按照说明的步骤操作,cat /etc/resolv.conf然后从那里我得到了我的 IP,并尝试使用 resolv.conf 中的 IP 进行 curl 并且成功了,但 localhost 似乎仍然不起作用,文章中也提到

根据您使用的 Windows 版本,您可能需要检索虚拟机的 IP 地址。如果您的版本是 18945 或更高版本,您可以像平常一样使用 localhost。

由于我是 Windows Insider 用户,因此我的版本高于 18945。有什么方法可以将我的 IP(例如111.222.333.444)映射到本地主机吗?那么当我对本地主机执行 CURL 时,curl 实际上使用的是 IP111.222.333.444吗?

答案1

已更新 2023-12-27

现在应该使用镜像网络模式和最新补丁来解决这个问题。一定要遵循 2023-10-31 的说明,并尽可能避免回滚到 WSL1,因为它现在基本上没有修补,并且可能会继续降级。

如果你已经降级到 WSL1 并想要升级到 WSL2,你需要遵循标准升级指南(最好是升级到 Microsoft Store 版本),并执行以下特殊步骤首先删除 WSL1 映像相应目录中现有的 WSL2 VHDX 文件

自降级以来,该 VHDX 文件尚未更新,并且会主动阻止升级,尽管升级过程没有显示任何问题(它只会无休止地挂起)。还要确保您有足够的磁盘空间 - 升级会将 WSL1 结构中的所有内容复制到 VHDX 中,从而在迁移过程中有效地将其占用空间翻倍,并且空间不足也会导致升级过程完全挂起而不会发出通知。

已更新 2023-10-31

微软正在修复此问题!以下问题正在通过预览版中的新功能解决,但似乎可能在不久的将来推出常规更新路径:

https://github.com/microsoft/WSL/issues/4619 https://github.com/microsoft/WSL/issues/5211

特别感谢第二条帖子中@dons20 的评论:

  1. 将 Windows 至少更新至 10 月 10 日版本。在此处查看更多信息:[WSL 2] WSL 2 无法通过 localhost:port #4619 访问 Windows 服务 (评论)
  2. 通过在 CMD 或 Powershell 中运行此命令将 WSL 更新到最新的预发布版本wsl --update; wsl --update --pre-release。你可以在此处查看预发布版本的更改:https://github.com/microsoft/WSL/releases
  3. 更新(或创建)位于资源管理器中的 %USERPROFILE% 的 .wslconfig 文件。添加以下内容:
[wsl2]
networkingMode=mirrored # add this line if file already exists
  1. (可选)关闭并重新启动 WSL(几秒钟后),以便应用配置更改。

原来的

我怀疑你实际上正在运行 WSL2,它处理网络的方式与 WSL 几乎完全不同。请参阅git 上的这个问题对发生的事情及其原因进行详细的分析。

简短的回答是:在 WSL2 上按照你想要的方式运行并不容易localhost,我个人暂时降级到 WSL(第一个版本),直到他们最终提供一种方法来做到这一点,而不必将所有请求映射到任意的启动时分配的 IP 并打开 Windows 防火墙规则以允许服务端口上的公共入站连接。

如果您确实想降级并神奇地恢复localhost交互,只需以管理员身份打开 Powershell 控制台并输入以下内容(假设运行 Ubuntu 版本):

wsl --set-version Ubuntu 1

您将失去所有 WSL2 功能,但会恢复理智。请注意,Ubuntu 实例本身可能需要执行一两个迁移任务。

答案2

一个快速的解决方法是将别名设置为 curl 的 cmd 版本并从 wsl2 中使用它。

在您的 ~/.bashrc 中,设置以下内容:

alias curl="cmd.exe /C curl"

重新启动或 source .bashrc 后,您可以照常使用 curl。

在此处输入图片描述

如果您需要在未设置别名的 bash 脚本中使用它,则可以cmd.exe /C curl在脚本中使用它。虽然很丑陋,但可以工作。

相关内容