从 Win 10 Hyper-V 上的 Ubuntu VM 通过 SSH 连接到 WSL 上的 Ubuntu

从 Win 10 Hyper-V 上的 Ubuntu VM 通过 SSH 连接到 WSL 上的 Ubuntu

我刚刚在 Win 10 主机上的 Hyper-V 上使用 Ubuntu 17.10.1 VM 设置了一个小型实验室,并尝试从该 VM 通过 SSH 进入 Win 10 中的 WSL(适用于 Linux 的 Windows 子系统)Ubuntu 实例。我不断收到连接超时错误。

为您提供更快速的摘要:

  1. 我可以直接从我的 Win 10 主机通过 SSH 进入 WSL Ubuntu 实例(使用适用于 Win 10 的新 Open SSH Beta CLient)。
  2. 我能够从我的 Win 10 主机通过 SSH 进入 Hyper-V 上的 Ubuntu 17.10.1 VM。
  3. 我能够从 Win 10 上的 WSL Ubuntu 实例通过 SSH 进入 Hyper-V 上的 Ubuntu 17.10.1 VM。
  4. 我无法从 Hyper-V 上的 Ubuntu 17.10.1 VM 通过 SSH 连接到 Win 10 上的 WSL Ubuntu 实例。
  5. 我已经在 sshd_config 文件中将 WSL Ubuntu 实例中的 SSH 端口从 22 更改为 2222,并设置:

    UserPrivilegeSeparation No  
    PasswordAutherntication Yes  
    UsePAM to No  
    

    接下来,我重新启动了 SSH 服务器。

Win 10 上的防火墙配置了入站规则以允许 TCP 上的 2222。WSL Ubuntu 实例上没有 IPTables 或任何其他防火墙

请帮忙诊断问题。

更新:还尝试了 -vvvv 选项。输出如下:

调试输出

答案1

经过逐步的逻辑分析,我终于能够自己找到解决问题的方法。

令人惊讶的是,关于这样一个看似简单的事情,信息却如此有限。MS 文档和所有主要的 WSL 博客都没有信息。

因此,根据我的工作,解决方案的关键点如下:

  • WSL 以进程的形式在底层 Windows 10 主机上运行。这也意味着它们共享相同的 IP 地址和主机名

  • 为了实现与 WSL 和 Win 10 之间的 SSH 连接,我们需要在每个服务器上安装 OpenSSH 服务器和 OpenSSh 客户端。对于 Windows 10,此处假定使用本机 OpenSSH 服务器

  • 同时在 Win 10 主机和 WSL 上运行 OpenSSH 服务器会相互冲突,Win 10 主机上的 OpenSSH 服务器优先于 WSL 上的 OpenSSH 服务器(我找不到任何直接的方法让两个 OpenSSH 服务器都运行并单独切换优先级/优先级)。值得注意的是,以前在 Win 10 (1809) 之前没有原生 OpenSSh 服务器支持时,我们通常会使用 Win32 移植版本的 OpenSSH 服务器,这种冲突限制不会发生,因为当时 OpenSSH 服务器不作为 Windows 服务运行,必须明确启动。

  • 每次您尝试从任何地方使用 SSH 连接到 WSL 时,您最终都会将 SSH 连接到底层 Win 10 主机上的 OpenSSH 服务器 Windows 服务。这意味着不会有任何 SSH 调用发送到在 WSL 中运行的 OpenSSH 服务器。

  • 解决方案是停止底层 Win 10 主机上的 OpenSSH Server Windows 服务。不过,您不需要触碰 OpenSSh 身份验证代理 Windows 服务。请参见下面的屏幕截图,这是我在 Win 10 主机上停止 OpenSSH Server Windows 服务之后的截图。

Windows 10 中的 OpenSSH 服务器和身份验证代理 Windows 服务

  • 一旦停止底层 Win 10 主机上的 OpenSSh Server Windows 服务,您将能够从底层 Win 10 主机中的 CMD/PowerShell 控制台内通过 SSH 无缝连接到 WSL,以及从在同一主机上的 Hyper-V/VBox 上运行的任何其他 Linux VM 以及从在同一主机上的 Hyper-V/VBox 上运行的任何其他 Win 10 VM 等。

  • 如果您尝试了不同的方法一段时间,最好清除位于“C:\Users\.ssh”文件夹中的 Win 10 主机中“known_hosts”文件中的所有条目。否则,您可能会收到如下图所示的错误

错误:主机密钥验证失败

答案2

解决此问题的一个方法是转到设置->网络;然后将适配器 1 设置为桥接,重新启动虚拟机。然后在虚拟机中运行 ifconfig 以获取新的 ip 地址

据我了解,此解决方案会在您的网络内设置 IP 地址,允许您通过 IP 地址访问它。

相关内容