【问题标题】:Access a localhost running in Windows from inside WSL2? [closed]从 WSL2 内部访问在 Windows 中运行的本地主机?
【发布时间】:2021-02-22 01:14:18
【问题描述】:

我在我的 Windows 机器 中运行本地 AEM 服务器。服务器在 localhost:4502 上运行。我正在使用在 WSL2 中运行的 Ubuntu 发行版进行开发。我想在我的 WSL2 Ubuntu 中访问 Windows 机器上运行的 localhost:4502。

有没有办法做到这一点,还是不可能?

【问题讨论】:

  • 你的 Windows 机器 IP 加上 4502 应该足够了,不过你要检查防火墙是否允许连接,
  • 不,这是完全错误的!,我也有这个问题,很遗憾你的答案是错误的。我尝试 ssh -p 并且连接立即并且总是被拒绝!还有其他想法吗?
  • @NotTheDr01ds 的 answer 应该是公认的答案。

标签: windows aem windows-subsystem-for-linux portforwarding wsl-2


【解决方案1】:

这确实属于另一个论坛,但我怀疑你可以这样做。

  1. 第 1 步。在您的实际 IP 地址(或所有地址)上运行 AEM 服务器,而不是仅绑定到 localhost。

  2. 第 2 步。您的 Ubuntu WSL 客户端实例不会与主机共享 localhost,但它会共享您的机器实际拥有的本地 IP 地址(例如 10.0.0.2)。只需让您的客户端连接到该 IP 地址而不是 localhost。

  3. 我对 AEM 一无所知,但如果您将其暴露在更大的网络中,您可能需要保护它。在上游防火墙上阻止端口 4502 或使用 Windows 防火墙规则仅允许来自您自己的 IP 地址的端口 4502 传入。这显然是可能的。

【讨论】:

    【解决方案2】:

    Windows 10 将 localhost 视为 ::1 Ubuntu 将 localhost 视为 127.0.0.1

    所以解决方案是创建一个映射

    在 C:\Users.wslconfig 中创建一个名为 .wslconfig 的文件

    添加以下内容。

    [wsl2]
    localhostForwarding=true
    

    PS:我不知道它是否搞砸了其他任何事情,但它帮助我运行了升级到 wsl2 后损坏的 django 服务器

    【讨论】:

    • localhostForwarding 应该已经在 WSL2 上 default to true,但有时它似乎出现故障,我无法确定原因。通常只需执行wsl --shutdown 并重新启动会话即可为大多数人恢复它。
    • 这个答案确实需要至少一次更正。 ::1 vs 127.0.0.1 与 Windows 10 vs. Ubuntu 完全无关。 Windows 10 可以很好地理解 127.0.0.1,Ubuntu 也可以很好地理解 ::1。真正的区别在于 ::1 是 IPv6 地址,而 127.0.0.1(或任何以 127 开头的 IP 地址,实际上)是 IPv4。
    • 所以请解释一下为什么这解决了我的问题?因为就我而言,它解决了这个问题。显然对用户也是如此。
    • 来自 microsoft doc,localhostForwarding 表示“绑定到 WSL 2 VM 中 localhost 的端口应该可以从主机连接”但 not“端口绑定到主机中的 localhost应该可以从 WSL 2 VM 连接”,所以这个答案不起作用。
    【解决方案3】:

    这很简单,你只需要做两件事。在 hosts 文件中将 ip 地址设置为 localhost,并允许 windows 防火墙允许传入连接。 以下是分步说明:

    1. 获取IP地址,打开cmd输入ipconfig /all,记下ip地址172.22.16.1
    2. 以管理员身份打开记事本,文件->打开,浏览到C:\Windows\System32\drivers\etc\hosts,添加行172.22.16.1 localhost,保存并关闭。
    3. 最后一个选项是允许防火墙规则接受公共连接,为此打开control panel > System and Security > Windows Defender Firewall > Advanced Settings > Inbound Rules > 'New Rule`
    4. 规则类型:选择Port,点击下一步
    5. 协议和端口:输入*特定本地端口:4502,点击下一步
    6. 操作:允许连接,点击下一步
    7. 个人资料:查看Public,点击下一步
    8. 名称:输入AEM server,点击完成
    9. 关闭其他窗口,再次打开 cmd ,输入 wsl --shutdown 关闭 ubuntu 子系统。
    10. 再次打开 ubuntu。
    11. 在命令提示符下测试连接类型curl localhost:4502。如果它返回某些东西,则表示您可以开始了。

    【讨论】:

      【解决方案4】:

      我也在寻找一些解决方案来做到这一点,但目前没有这样的选项可用。查看这个 GitHub 问题:

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

      一种解决方案可以是:

      如果你有 windows(host) 的 IP,那么它就可以完成这项工作,但唯一的问题是 IP 每次都会改变。但是,WSL2 将您的 Windows(主机)IP 存储在 /etc/resolv.conf 文件中。所以我们可以修改我们的etc/hosts,将winhost动态映射到IP。

      ~/.bashrc 文件的末尾添加以下行。这将在您启动 WSL 时 grep IP 并修改 etc/hosts

      export winhost=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
      if [ ! -n "$(grep -P "[[:space:]]winhost" /etc/hosts)" ]; then
              printf "%s\t%s\n" "$winhost" "winhost" | sudo tee -a "/etc/hosts"
      fi
      

      然后运行以下命令重新加载更改。

      $ source ~/.bashrc
      

      现在您可以在 WSL2(客户端)中使用 winhost 而不是 localhost 来访问运行 Windows(主机)的服务器。在您的情况下,它将是 winhost:4502 但这适用于任何其他用例以及访问在 Windows 上运行的 Postgres/MySQL 服务器 等。

      注意:始终记得在 Windows 上配置防火墙以允许这些端口,以便 WSL2 可以访问,否则您的连接可能会被防火墙阻止。

      【讨论】:

      • 您好,我也有这个问题,很遗憾您的回答是错误的。我尝试 ssh -p 并且连接立即并且总是被拒绝!还有其他想法吗?
      • @SheppLogan 我不确定您要达到什么目的。你能详细说明一下吗?
      • 这是公认的答案,但这意味着该服务没有在本地主机上侦听,而是在 0.0.0.0 上使用防火墙...
      【解决方案5】:

      最新 Windows 版本的简短回答

      mDNS 已经成为 WSL2 的一项功能已有一段时间了。试试:

      ping "$(hostname).local"
      

      例如,如果您的 hostname 是“MyComputer”,那么 mDNS 应该是 MyComputer.local

      如果 ICMP 被阻止(就像在新的 Windows 11 安装上一样),或者如果您想测试与实际端口的连接,请使用 netcat。它在 WSL Ubuntu 安装中默认可用,但可能需要安装在其他发行版中,如 openSUSE:

      nc -zv "$(hostname).local" <portnumber>
      

      为什么 localhost 不起作用

      WSL2 使用由 Windows 虚拟机平台(Hyper-V 的子集)创建的虚拟网络 (vNIC) 运行。 里面 WSL2,localhost是vNIC的地址。

      你需要什么

      WSL2 还在 Windows 主机上设置了一个虚拟路由器,以允许连接到外部世界以及 Windows 主机。您可以通过以下方式查看:

      ip route
      

      这是您需要用于 Windows 主机的地址。

      当然,您可以从路由中解析它(或者,如之前的答案,从 /etc/resolv.conf),但是 WSL 使用 Windows“计算机名称”设置了一个方便的 mDNS(.local 域) ,也用作 WSL 实例的主机名。

      $(hostname)(或在您的编程/语言环境中的等效项)与".local" 连接应该可以让您访问。

      【讨论】:

        【解决方案6】:

        简单的方法:

        在 ubuntu 命令行中输入:ip route

        default via 172.23.96.1 dev eth0
        172.23.96.0/20 dev eth0 proto kernel scope link src 172.23.97.122

        在您的应用中,将主机配置为:172.23.97.122

        现在您可以使用 Windows 浏览器访问

        【讨论】:

        • 您好,欢迎来到 Stack Overflow。只是提醒一下,我已经介绍了 ip route 命令作为在现有答案中获取 IP 地址的选项。应避免重复答案,因此请确保在编写新答案之前阅读现有答案。另请注意,每次重新启动 WSL(或您的计算机)时,此 IP 地址都会更改,因此很遗憾,这不是“简单的方法”。正如我在回答中提到的,最好使用 mDNS 名称,因为它始终会解析为正确的地址(只要启用了 mDNS)。
        【解决方案7】:

        您需要在 hosts 文件中添加 ipv6 规则。

        喜欢:

        127.0.0.1 example.com
        ::1 example.com localhost
        

        我遇到了类似的问题,并在此链接中找到了解决方案: https://github.com/microsoft/WSL/issues/5728

        【讨论】:

          猜你喜欢
          • 2021-01-14
          • 2016-06-09
          • 2016-08-04
          • 1970-01-01
          • 2021-03-24
          • 2020-09-28
          • 2021-05-25
          • 2021-01-02
          相关资源
          最近更新 更多