背景简介
WSL2 是 Windows 的子系统,可以在 Windows 上运行 Linux,但是 WSL2 是运行在虚拟机中的,所以无法直接访问 WSL2 中的服务,比如 SSH 服务。本文介绍如何使用内网穿透工具花生壳来实现远程访问 WSL2 中的服务。
实现这一需求需要完成两个功能。
- WSL2 中的服务是运行在虚拟机中的,如何将公网的访问转发到 WSL2 中。
- Windows 没有公网 IP,如何通过公网来访问。
WSL2 端口转发
获取 WSL2 的 IP 地址:
hostname -I | awk '{print $1}'
172.26.13.98
Windows 自带的netsh interface portproxy
可以实现端口转发。管理员身份打开 cmd,执行以下命令:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.26.13.98 connectport=22
- listenport:公网访问的端口(改一个不冲突的就行)
- connectaddress:WSL2 的 IP 地址
- connectport:WSL2 中 SSH 服务的端口 (默认为 22,不需要更改)
开启 Windows 防火墙入站规则,管理员身份打开 cmd,执行以下命令:
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
这个命令是用于在 Windows 高级防火墙中添加一条规则。下面是对每个参数的解释:
name=WSL2
:将规则命名为 “WSL2”。dir=in
:指定规则适用于传入的网络流量。action=allow
:允许通过该规则的流量通过防火墙。protocol=TCP
:指定规则适用于 TCP 协议的流量。localport=2222
:指定本地端口号为 2222。
验证端口转发是否成功:
ssh -p 2222 user@localhost
- user 修改成 WSL2 的用户名
如果配置成功,则会成功登录 WSL2。
安装配置花生壳
进入官网下载花生壳客户端,安装后打开,注册账号,登录。需要实名认证
免费账户可以绑定2 个映射,对我来说暂时够用了,免费流量 1G/月。实测阅读代码不编译的话大概每天 50M左右。
打开客户端,添加映射,配置如下:
保存即可。
验证是否配置成功,找一台不在同一个局域网的电脑,使用 SSH 连接 WSL2:
如果复制出来的访问地址为abcdjsj.goho.co:33445
,那么 SSH 命令修改为如下:
ssh -p 33445 user@abcdjsj.goho.co
- user 修改成 WSL2 的用户名
如果配置成功,则会成功登录 WSL2。
题外话
- WSL2 的 IP 会经常变化,如果连不上了,可以重新获取一下 IP,然后修改一下各个配置。或者想办法将 WSL2 的 IP 固定下来。
- 带宽有限,登录时比较慢,耐心等待。后续准备使用 frp 自建一个穿透服务。
- PC 耗电伤不起啊,一百多瓦赶上三四台 NAS 了。这玩意只能应急,长时间挂机电费都够买个云服务器了。
常见问题
“System is booting up. Unprivileged users are not permitted to log in yet”
登录服务端,也就是 WSL2,执行以下命令
sudo rm /run/nologin