我正在尝试通过 Windows Subsystem for Linux 2(WSL 2) ssh 进入在 Windows 10 机器上运行的 Ubuntu 20.04。
我已经关注本指南在 Medium 上,并另外研究了这,这,以及其他几篇博客文章。
基本上,我所做的是:
openssh-server
在 Ubuntu 服务器上重新安装。- 将文件更改
sshd_config
为监听端口 2222,并在 Ubuntu 服务器上PasswordAuthentication
进行设置。yes
- 通过在Ubuntu服务器上安装
net-tools
并运行找到IP地址。ifconfig
- 在 Windows 上的 Windows Defender 防火墙中设置规则以打开端口 2222。
从同一台计算机,我可以使用-p 2222
端口标志从 Windows ssh 进入 Ubuntu 服务器。但是,当我尝试从同一互联网网络上的另一台计算机 ssh 进入 Ubuntu 服务器时,我遇到了超时问题。(然而,在这台计算机上,我能在第一台计算机上通过 ssh 进入 Windows - 我在第一台计算机的 Windows 和 Ubuntu 上都安装了 open-ssh 服务器)。
有任何解决此问题的建议吗?
答案1
从表面上看,您链接的所有指南都是很久以前发布的,他们使用的是 WSL1,因为 WSL2 去年夏天才刚刚发布。如果他们在 WSL2 发布之前就一直在使用它,他们可能会提到它需要 Windows Insider/Preview。
在这方面,WSL1 和 WSL2 之间的最大区别在于,WSL1 在与 Windhows 主机的伪桥接模式网络中运行,而 WSL2 在具有自己的虚拟 NAT 网卡的 Hyper-V VM 中运行。从 Windows 计算机本身来看,WSL2 似乎做了一些本地端口映射魔法,让你可以在 localhost 上访问 WSL2 服务。但外部 IP 的行为并非如此,因此网络上的其他计算机(甚至同一台机器上的其他网络,例如 Docker)无法直接访问 WSL2 接口和端口。
我已经在其他问题中为其他服务提供了一些答案(例如这),我强烈建议您阅读它以获得一些见解。
但对于 SSH,我个人采取不同的方法。我只需运行Windows OpenSSH 服务器在 Windows 主机本身上(在端口 22 上),然后在我的每个 WSL 实例(WSL1 和 WSL2)中运行 SSH 服务器(如您所设置)。然后我可以使用 SSH ProxyCommand 选项将 Windows 主机用作进入 WSL 实例的跳转主机(我大多数时候都有多个实例用于不同的场景开发和测试)。
在大多数情况下,这实际上比这更容易。大多数时候,我只需使用以下命令通过 SSH“进入”我的 WSL 实例:
ssh -t windowsip wsl
或者
ssh -t windowsip wsl -d Ubuntu20.04
第一个只是将我启动到默认的 WSL 实例。第二个允许我选择特定的实例/发行版。
我实际上只将 ProxyCommand 版本与 Ansible 或其他需要端点上“真实” SSH 的应用程序一起使用。
另请注意,您可以使用这个技巧来发射在每个实例中启动 SSH 服务器,避免设置“启动时通过任务管理器启动”的麻烦。只需运行如下命令:
ssh -o "RemoteCommand=wsl -d Ubuntu-20.04 sudo service ssh status ^|^| sudo service ssh start" windowshost_ip_or_name
(^|^|
正在转义 CMD 的 ||)。