有这样一个场景,我在 Windows 主机 A 上,想要通过 SSH 连接到 Windows 主机 B 上的 WSL。

1
2
3
4
主机A (Windows) -----> 主机B (Windows)
|
V
WSL (在主机B上)

Google 了一圈,找到了一个比较靠谱的方案(原文):

Latest WSL2 has systemctl support and can automatically map sshd’s connection to the Windows host. No need to redirect port.

  1. Make sure Windows OpenSSH works.
  2. In windows, run wsl --update to make sure use latest WSL.
  3. In WSL, run sudo apt-get install openssh-server to install ssh and sudo systemctl enable --now ssh to automatically start ssh when WSL starts.
  4. Run ssh -J windows_user@windows_ip wsl_user@localhost to login to ssh
  5. 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
  1. 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
2
3
4
5
6
7
8
9
10
11
12
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.

Port 2222 # 改这里!
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

在 Windows 管理员权限 下,输入以下命令重启 SSH 服务:

1
2
net stop sshd
net start 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
2
sudo apt-get install openssh-server
sudo systemctl enable --now ssh

此时必须对其进行配置才能正常连接。作为本地桥接的主机,我们并没有很多安全需求,很多 SSH 的安全功能反而会给我们带来麻烦。

通过编辑 /etc/ssh/sshd_config 文件,将以下两项配置的注释解除并按如下所示修改:

1
2
PubkeyAuthentication yes
PasswordAuthentication yes

保存后重启 WSL 的 sshd 服务即可

1
sudo systemctl restart ssh