背景简介

WSL2 是 Windows 的子系统,可以在 Windows 上运行 Linux,但是 WSL2 是运行在虚拟机中的,所以无法直接访问 WSL2 中的服务,比如 SSH 服务。本文介绍如何使用内网穿透工具花生壳来实现远程访问 WSL2 中的服务。

实现这一需求需要完成两个功能。

  1. WSL2 中的服务是运行在虚拟机中的,如何将公网的访问转发到 WSL2 中。
  2. 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左右。

打开客户端,添加映射,配置如下:

Responsive Image

保存即可。

Responsive Image

验证是否配置成功,找一台不在同一个局域网的电脑,使用 SSH 连接 WSL2:

如果复制出来的访问地址为abcdjsj.goho.co:33445,那么 SSH 命令修改为如下:

ssh -p 33445  user@abcdjsj.goho.co
  • user 修改成 WSL2 的用户名

如果配置成功,则会成功登录 WSL2。

题外话

  1. WSL2 的 IP 会经常变化,如果连不上了,可以重新获取一下 IP,然后修改一下各个配置。或者想办法将 WSL2 的 IP 固定下来。
  2. 带宽有限,登录时比较慢,耐心等待。后续准备使用 frp 自建一个穿透服务。
  3. PC 耗电伤不起啊,一百多瓦赶上三四台 NAS 了。这玩意只能应急,长时间挂机电费都够买个云服务器了。

常见问题

“System is booting up. Unprivileged users are not permitted to log in yet”

登录服务端,也就是 WSL2,执行以下命令

sudo rm /run/nologin