本教程旨在帮助你从任何状态(无论是已损坏、配置错误还是未安装)的WSL(Windows Subsystem for Linux)环境中,建立一个全新的、可正常工作的SSH服务器。我们将使用 systemctl
进行服务管理,这要求你的WSL发行版(如Ubuntu 22.04)已启用 systemd
。
前提:启用 Systemd
如果 systemctl
命令无法工作,请先在WSL中启用 systemd
。
-
编辑或创建
/etc/wsl.conf
文件:sudo vim /etc/wsl.conf
-
在文件中添加以下内容(在
vim
中按i
进入插入模式):[boot] systemd=true
-
保存并关闭文件(在
vim
中,按Esc
键,然后输入:wq
,最后按Enter
)。 -
关闭并重启WSL。打开Windows的PowerShell或CMD,运行以下命令:
wsl --shutdown
关闭后,重新打开你的WSL终端即可。
第1步:停止并禁用当前的SSH服务
为了避免冲突,我们首先尝试停止并禁用任何可能正在运行的SSH服务。你看到的 ssh.socket
提示是因为 systemd
使用套接字激活(socket activation)机制,即使服务停止了,套接字仍在监听。我们需要同时停止并禁用服务和套接字。
即使服务或套接字不存在,运行这些命令也不会报错。
-
停止 SSH 服务
sudo systemctl stop ssh.service
-
停止 SSH 套接字
sudo systemctl stop ssh.socket
-
禁用 SSH 服务
sudo systemctl disable ssh.service
-
禁用 SSH 套接-字
sudo systemctl disable ssh.socket
第2步:彻底卸载 OpenSSH Server
我们将使用 purge
命令,它会删除软件包及其所有的配置文件,确保一个干净的环境。
-
彻底卸载ssh服务器
sudo apt-get purge openssh-server -y
-
移除不再需要的依赖项
sudo apt-get autoremove -y
第3步:清理残留文件(可选但推荐)
通常 purge
会清理干净,但为了确保万无一失,我们可以手动删除可能残留的目录。
sudo rm -rf /etc/ssh
第4步:重新安装 OpenSSH Server
现在,我们从一个干净的状态开始安装SSH服务器。
-
更新软件包列表
sudo apt-get update
-
安装openssh-server
sudo apt-get install openssh-server -y
安装完成后,系统会自动生成新的默认SSH密钥和配置文件。
第5步:配置 SSH 服务器
我们将修改核心配置文件 /etc/ssh/sshd_config
以允许密码登录。这是最简单快捷的连接方式。
-
打开配置文件:
sudo vim /etc/ssh/sshd_config
-
修改以下两行:
-
找到
#Port 22
,去掉前面的#
号,让SSH服务监听标准端口22。 -
找到
#PasswordAuthentication yes
或PasswordAuthentication no
,确保它是PasswordAuthentication yes
并且没有被#
注释掉。
修改后应如下所示:
Port 22 # ... 其他配置 ... PasswordAuthentication yes
-
-
保存并关闭文件(按
Esc
键,然后输入:wq
,最后按Enter
)。
安全提示 :允许密码登录虽然方便,但安全性较低。在生产环境或需要更高安全性的场景下,强烈建议使用SSH密钥登录并禁用密码登录(将 PasswordAuthentication
设置为 no
)。
第6步:启动并验证 SSH 服务
现在,让我们启动SSH服务,并设置为开机自启。
-
重新启动SSH服务以应用新配置
sudo systemctl restart ssh
-
将SSH服务设置为开机自启动
sudo systemctl enable ssh
注意 :执行此命令时,你可能会看到一条
sh: 0: getcwd() failed: No such file or directory
的警告。这是一个无害的提示,通常因为你当前终端所在的目录(/etc/ssh
)在之前的步骤中被删除并重建了。只要你看到最后有Created symlink
的输出,就说明命令已经成功执行。 -
检查SSH服务状态
sudo systemctl status ssh
如果服务正常运行,你会看到类似下面的输出。关键信息是绿色的 Active: active (running)
和 Server listening on ... port 22
。
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-10-13 20:51:49 CST; 50s ago
TriggeredBy: ● ssh.socket
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 2019 (sshd)
Tasks: 1 (limit: 19189)
Memory: 1.9M
CPU: 15ms
CGroup: /system.slice/ssh.service
└─2019 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Oct 13 20:51:49 DESKTOP-M32KRCT systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Oct 13 20:51:49 DESKTOP-M32KRCT sshd[2019]: Server listening on 0.0.0.0 port 22.
Oct 13 20:51:49 DESKTOP-M32KRCT sshd[2019]: Server listening on :: port 22.
Oct 13 20:51:49 DESKTOP-M32KRCT systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
按 Q
键退出状态查看。
第7步:获取 WSL 的 IP 地址
要从Windows或其他设备连接到WSL,你需要知道它的IP地址。
运行以下命令查看:
hostname -I
这个命令可能会返回多个IP地址(包括IPv4和IPv6),如下所示:
10.0.0.140 fd97:68cf:7c9b:0:42:5df:85ea:184b fd97:68cf:7c9b::736 fd97:68cf:7c9b:0:e40a:e4c3:1d37:73a6
通常,你应该使用第一个显示的IPv4地址 (在此示例中是 10.0.0.140
)。
第8步:从 Windows 连接到 WSL
打开Windows Terminal, PowerShell, 或 CMD,使用以下命令进行连接。
# 格式: ssh <你的WSL用户名>@<WSL的IP地址>
# 示例:
ssh yuuu@10.0.0.140
-
将
yuuu
替换为你在WSL中的用户名。 -
将
10.0.0.140
替换为你在上一步中获取到的IP地址。
首次连接时,系统会询问你是否信任该主机的指纹,输入 yes
并回车。然后输入你的WSL用户密码,即可成功登录。
第9步:防火墙故障排除(连接失败时必看)
如果你可以 ping
通 WSL 的 IP 地址,但 SSH 命令没有任何反应或连接超时,这几乎总是因为 Windows Defender 防火墙 阻止了连接。
你需要为 SSH 的 22
端口创建一个入站规则,允许网络连接。
-
以管理员身份打开 PowerShell:
-
点击 "开始" 菜单。
-
输入 "PowerShell"。
-
右键点击 "Windows PowerShell",选择 "以管理员身份运行"。
-
-
运行以下命令 :
将下面的命令复制并粘贴到管理员 PowerShell 窗口中,然后按
Enter
。New-NetFirewallRule -DisplayName "WSL SSH" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22
这条命令会创建一个名为 "WSL SSH" 的新规则,允许所有进入的 TCP 流量访问本机的22号端口。
-
重新尝试 SSH 连接
创建规则后,无需重启,直接回到你的普通 CMD 或 PowerShell 窗口,再次尝试 SSH 连接。
ssh yuuu@10.0.0.140
如果仍然失败,请继续执行第10步。
第10步:高级网络故障排除 (端口转发)
如果防火墙规则已添加但仍然无法连接,说明你需要设置端口转发。这是因为 WSL2 默认使用虚拟网络(NAT模式),需要手动将 Windows 主机的端口映射到 WSL 的端口。
-
确认你的WSL IP地址
WSL 的 IP 地址可能会在重启后改变。再次运行命令确认:
hostname -I
记下第一个 IPv4 地址,例如
1.0.0.140
。 -
以管理员身份打开 PowerShell
(如果已打开,请继续使用该窗口)。
-
设置端口转发规则
复制以下命令模板,将
10.0.0.140
替换为上一步中你自己的IP,然后在管理员 PowerShell 中运行。netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=10.0.0.140
-
listenport=22
: 监听 Windows 主机的 22 端口。 -
listenaddress=0.0.0.0
: 在 Windows 的所有网络接口上监听。 -
connectport=22
: 转发到 WSL 内部的 22 端口。 -
connectaddress=10.0.0.140
: 这里必须是你自己的 WSL IP 地址。
-
-
现在,使用
localhost
进行连接!设置端口转发后,你不再需要连接 WSL 的动态 IP 地址。你应该连接到 Windows 主机本身,它会自动将请求转发给 WSL。
打开一个新的、普通权限的 PowerShell 或 CMD 窗口,运行:
ssh yuuu@localhost
或者使用
127.0.0.1
:ssh yuuu@127.0.0.1
这次它应该会提示你输入密码并成功连接。
其他检查项:
-
查看已有的端口转发规则 :在管理员 PowerShell 中运行
netsh interface portproxy show all
。 -
删除端口转发规则 :如果需要,可以使用
netsh interface portproxy delete v4tov4 listenport=22 listenaddress=0.0.0.0
来删除。 -
第三方杀毒/防火墙软件:如果你安装了如 McAfee, Norton, Kaspersky 等第三方安全软件,它们可能有自己的防火墙。请尝试暂时禁用它们,或者在它们的设置中为 22 端口添加入站例外。