WSL 中的 SSH 与远程访问
如果你只是想在 Windows 本机里打开一个 WSL 终端,其实不需要 SSH。但当你想做下面这些事情时,SSH 就会很有用:
- 从 Windows Terminal、VS Code、其他终端工具统一连接到 WSL
- 从局域网另一台机器登录到你的 WSL 环境
- 在 WSL 中长期运行开发服务,希望配合 SSH 做转发或远程开发
这篇文档把整个链路拆成两层:
- 先让 WSL 内部的 SSH 服务 正常工作
- 再决定是只给 Windows 本机访问,还是给 局域网其他机器访问
1. 在 WSL 中安装 OpenSSH
以下示例以 Ubuntu / Debian 为例:
sudo apt update
sudo apt install -y openssh-server
安装完成后,先确认服务文件已经存在:
sshd -T | head
如果系统提示找不到 sshd,通常说明 openssh-server 还没安装成功。
2. 配置 SSH 的最小安全基线
编辑配置文件:
sudo nano /etc/ssh/sshd_config
建议至少确认这些项目:
Port 22
ListenAddress 0.0.0.0
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
这里的默认思路是:
- 优先使用公钥认证
- 不默认开放 root 直接登录
- 不默认保留密码登录
如果你只是临时测试,也可以把 PasswordAuthentication 改成 yes,等公钥登录确认可用后再关回去。
3. 生成并导入公钥
如果你还没有 SSH 密钥,先在 客户端机器 上生成。以 Windows PowerShell 为例:
ssh-keygen -t ed25519 -C "your_email@example.com"
生成后查看公钥内容:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
再把公钥追加到 WSL 用户的 authorized_keys:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
如果权限不对,SSH 往往会直接忽略这个文件,所以这一步不要省略。
4. 启动 SSH 服务
先判断你的 WSL 是否启用了 systemd。
方式 A:已启用 systemd
如果你的 /etc/wsl.conf 中已经启用了 systemd:
[boot]
systemd=true
那么可以直接使用:
sudo systemctl enable --now ssh
sudo systemctl status ssh
修改完 wsl.conf 后,记得在 Windows 中执行一次:
wsl --shutdown
然后重新进入发行版。