2025年4月10日
Last updated on

如何科学快速地在异地连上 Windows 上的 WSL


人在外面,突然想连家里 Windows 上的 WSL。没有公网 IP,远程桌面又不想开,最省事的办法就是 frp。

我这篇只讲一个目标:从异地 SSH 进 WSL

frp 官方架构图

什么是 frp

frp 是一个内网穿透工具。

你需要一台有公网 IP 的服务器跑 frps,家里或公司内网机器跑 frpc。外部访问公网服务器某个端口,流量会被 frp 转回内网机器。

这次我们要做的是:

公网服务器:6001 -> 内网 Windows 机器里的 WSL:2222

然后外面直接:

Terminal window
ssh tim@公网IP -p 6001

就进 WSL 了。

WSL 的配置

第一个坑是 22 端口。

Windows 自己可能已经占了 22,WSL 里再开 SSH 很容易打架。所以我一般让 WSL 的 sshd 监听 2222

Terminal window
sudo apt update
sudo apt install openssh-server -y
sudo vim /etc/ssh/sshd_config

改成:

Port 2222
PasswordAuthentication yes

重启:

Terminal window
sudo service ssh --full-restart
ss -tlnp | grep 2222

确认 WSL 本机能连:

Terminal window
ssh [email protected] -p 2222

再配 frpc.toml

server_addr = "你的公网服务器IP"
server_port = 7000
[wsl-main-ssh]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 2222
remote_port = 6001

这里别搞反:

  • local_port = 2222,WSL 里 sshd 的端口
  • remote_port = 6001,外面访问公网服务器的端口

多台机器也简单,每台机器用不同名字和不同公网端口:

[wsl-lab-ssh]
remote_port = 6002

穿透的持续性

这个东西最怕断。因为一旦断了,你人在外地,内网机器又连不上,就只能等回去修。

我的小建议:

第一,frpc 别手动跑,尽量做成开机自启。WSL 里可以用 systemd,Windows 侧也可以用任务计划程序拉起脚本。

第二,SSH 尽早换成密钥登录。密码能调通,但长期裸奔不舒服。

Terminal window
ssh-keygen -t ed25519

把公钥放到 WSL:

Terminal window
~/.ssh/authorized_keys

确认密钥能登录后,再关密码:

PasswordAuthentication no

第三,公网服务器安全组、防火墙、frps 端口要一次性放对。至少要放:

7000 frpc 连接 frps
6001 外部 SSH 入口

第四,给每台机器留一个独立端口,别复用,别临时改。比如主力机 6001,实验机 6002。人在外面排查端口冲突很痛苦。

第五,如果这台 WSL 很重要,可以准备第二条路,比如 Tailscale、ZeroTier、RustDesk 或 Windows 远程桌面。frp 很好用,但远程访问这件事,最好别只有一根绳子。

最后再记一句:先在同一局域网里把 WSL SSH 调通,再上 frp。不要一开始就公网调试,不然你会分不清是 sshd、frpc、frps、防火墙,还是安全组的问题。