如何通过 SSH 远程连接另一台 Windows 主机中的 WSL
有这样一个场景,我在 Windows 主机 A 上,想要通过 SSH 连接到 Windows 主机 B 上的 WSL。
1 | 主机A (Windows) -----> 主机B (Windows) |
Google 了一圈,找到了一个比较靠谱的方案(原文):
Latest WSL2 has systemctl support and can automatically map sshd’s connection to the Windows host. No need to redirect port.
- Make sure Windows OpenSSH works.
- In windows, run
wsl --update
to make sure use latest WSL.- In WSL, run
sudo apt-get install openssh-server
to install ssh andsudo systemctl enable --now ssh
to automatically start ssh when WSL starts.- Run
ssh -J windows_user@windows_ip wsl_user@localhost
to login to ssh- If step 4 works, add the following content to
.ssh/config
1
2
3
4
5
6 Host wsl
HostName localhost
User wsl_user
ProxyJump windows_user@windows_ip
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
- Connect to
wsl
remote in VSCode 🎉🎉🎉
看起来非常直观简单,直接使用 ssh -J
的桥接功能,将主机 B 作为跳板机,连接到主机 B 的 WSL 上。事不宜迟,马上来 踩坑 试试吧!
踩坑 1:端口冲突
最新版本 的 WSL2 已经支持 systemctl
,不需要再折腾 WSL 自带的虚拟网卡了。但是,如果你在 WSL 中安装了 openssh-server
,那么 22 端口会和 Windows 的 OpenSSH 服务冲突,导致 WSL 中的 SSH 服务无法启动。
因此我们必须更改 Windows 或是 WSL 二者之一的 SSH 端口。由于防火墙机制的存在,我建议更改 Windows 主机 B 的 SSH 端口,因为在 Windows 中配置管理防火墙比较直观和方便。
请注意 ,更改后的连接指令应该为
ssh -J windows_user@windows_ip:2222 wsl_user@localhost
。
更改 Windows 的 SSH 端口
配置文件路径如下,其中 ProgramData
是隐藏文件夹:
1 | C:\ProgramData\ssh\sshd_config |
解除端口注释,改成你想要的端口,比如我就改成了 2222:
1 | # This is the sshd server system-wide configuration file. See |
在 Windows 管理员权限 下,输入以下命令重启 SSH 服务:
1 | net stop sshd |
或者,你也可以搜索 Windows 服务
,找到 OpenSSH SSH Server
,在图形化界面中重启。
确认服务重启后,输入以下命令查看端口是否已经更改:
1 | netstat -an | findstr /i ":2222" |
配置 Windows 防火墙
开启 Windows 的 Open SSH 服务后,只会自动添加一个默认只允许 22 端口的防火墙规则。我们需要手动添加一个防火墙规则,允许 2222 端口的连接。
详情查看:如何在 windows 开端口
踩坑 2:配置 WSL 的 SSH
在前文中我们新安装了 openssh-server
,并且启动了 SSH 服务:
1 | sudo apt-get install openssh-server |
此时必须对其进行配置才能正常连接。作为本地桥接的主机,我们并没有很多安全需求,很多 SSH 的安全功能反而会给我们带来麻烦。
通过编辑 /etc/ssh/sshd_config
文件,将以下两项配置的注释解除并按如下所示修改:
1 | PubkeyAuthentication yes |
保存后重启 WSL 的 sshd 服务即可
1 | sudo systemctl restart ssh |