我刚刚在 Win 10 主机上的 Hyper-V 上使用 Ubuntu 17.10.1 VM 设置了一个小型实验室,并尝试从该 VM 通过 SSH 进入 Win 10 中的 WSL(适用于 Linux 的 Windows 子系统)Ubuntu 实例。我不断收到连接超时错误。
为您提供更快速的摘要:
- 我可以直接从我的 Win 10 主机通过 SSH 进入 WSL Ubuntu 实例(使用适用于 Win 10 的新 Open SSH Beta CLient)。
- 我能够从我的 Win 10 主机通过 SSH 进入 Hyper-V 上的 Ubuntu 17.10.1 VM。
- 我能够从 Win 10 上的 WSL Ubuntu 实例通过 SSH 进入 Hyper-V 上的 Ubuntu 17.10.1 VM。
- 我无法从 Hyper-V 上的 Ubuntu 17.10.1 VM 通过 SSH 连接到 Win 10 上的 WSL Ubuntu 实例。
我已经在 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 服务之后的截图。
一旦停止底层 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 地址访问它。