如何用 SSH 连接 WSL2

引言

首先,我想说明一下为什么会写这样一篇文章。

我最近在使用 VS Code 远程连接主机,但是遇到了一些问题。举例来说,我发现假如在 Windows 上启用 SSH Server,然后用 VS Code 连接到 Windows,再进入 Windows 上的 WSL2,再启用 WSL2 中的容器就会失败。这种层层嵌套导致失败的原因我已经暂时研究明白了,但是本文先不再赘述,防止偏离主题。

我很久之前就在互联网上搜索过类似的问题,但是拿到的答案千奇百怪,在实操中也难以复现。我意识到这些无非是 AI 随便生成的文章,通篇乱说一气,误导了读者,也浪费了读者的时间。我越来越对这样的文章深恶痛绝。

本文旨在成为目前互联网上最全面、最实用、最可复现的关于“如何通过 SSH 访问 WSL2(例如 Fedora 43)”的文档。本文没有丝毫 AI 写作的成分,每一个字都是我实际操作的结晶,如果您觉得有用,还请帮忙大力推广这篇文章,从而把 AI 写出来的那些垃圾的优先级降低。

本文中,我每一步都会解释为什么要这么做、命令每个参数的含义、常见陷阱与对应的排查方法。通过此文章,我希望读者并不仅仅可以解决题目中的主题任务,更可以掌握通用工具的操作方法,以及遇到问题的排查和解决思路。

安装 WSL2

WSL 使用指南

安装发行版

WSL 使用指南

进入发行版的操作

安装 SSH 服务

以我使用的 Fedora 43 这一发行版作为例子:

1
sudo dnf install -y openssh-server

以 systemd 启动 ssh:

1
sudo systemctl enable --now sshd

获取 WSL 的 ip 地址

1
ip -4 addr show eth0 | awk '/inet /{print $2}' | cut -d/ -f1

在宿主机的操作

配置端口转发

请为 Windows 启动 sudo,否则以下操作则必须使用管理员权限的终端运行。

我非常喜欢 Windows 11 24H2 后默认引入的 sudo,这可以减少很多工作量,非常方便。

1
sudo netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=<在上一步获取到的 ip 地址> connectport=22

配置防火墙

1
sudo netsh advfirewall firewall add rule name="WSL SSH 2222" dir=in action=allow protocol=TCP localport=2222

在宿主机上测试

1
ssh < WSL 发行版中的用户名>@localhost -p 2222

在其他机器上的操作

1
ssh < WSL 发行版中的用户名>@<宿主机的 ip> -p 2222

余下的步骤(在宿主机上操作)

查看端口转发:

1
sudo netsh interface portproxy show all

删除端口转发:

1
sudo netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2222

删除防火墙规则:

1
sudo netsh advfirewall firewall delete rule name="WSL SSH 2222" protocol=TCP localport=2222

[TODO]

本文尚未完成,随时同步草稿分支。

发表了 41 篇文章 | 总计 35922 字
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 初始设计,由 蛋卷儿 深入修改