0. 问题与思路
目标: 建立一个稳定、可扩展的方案,从公网通过 SSH 访问局域网内一台或多台机器上的 WSL 环境。
典型障碍:
- 端口冲突: Windows 自带的 SSH 服务已占用
22
端口,导致 WSL 内的 SSH 服务启动失败。 - 配置混淆: 在
frp
中,local_port
与remote_port
的关系理解不清。 - 扩展困难: 添加第二台机器时,
frp
服务端因代理名称冲突而拒绝连接。
解决思路:
- 隔离: 修改 WSL 内 SSH 服务的默认端口,与 Windows 系统服务解耦。
- 映射: 通过
frpc
将公网服务器的特定端口,精确映射到 WSL 内部的新 SSH 端口。 - 唯一化: 为每一台需要穿透的机器分配唯一的代理名称和唯一的公网端口。
1. 基础构建:单机 WSL 穿透
此节解决单台机器的 0 -> 1
问题。
1.1. 配置 WSL 内部 SSH 服务
首先,确保 WSL 自身是一个合格的 SSH 服务器。
- 安装服务 (若未安装)
sudo apt update
sudo apt install openssh-server -y
- 修改端口 (核心步骤)
编辑 SSH 配置文件,避开与 Windows 的22
端口冲突。sudo nano /etc/ssh/sshd_config
- 找到
#Port 22
,修改为一个自定义端口,例如2222
。 # Port 22 Port 2222
为方便初始调试,确保密码登录是开启的。PasswordAuthentication yes
保存并退出。
- 启动并验证
# 重启服务以应用新配置 sudo service ssh --full-restart # 检查服务是否在 2222 端口监听 ss -tlnp | grep sshd
预期输出应包含*:2222
,证明 WSL 的 SSH 服务已在2222
端口正常工作。
1.2. 配置 frpc 客户端 (TOML 格式)
在 WSL 内创建或编辑 frpc.toml
文件,建立连接的桥梁。
# frpc.toml for a single machine
server_addr = "x.x.x.x" # 你的公网服务器 IP
server_port = 7000 # frps 服务端监听的端口
# 定义一个 SSH 代理
[wsl-main-ssh]
type = “tcp” local_ip = “127.0.0.1” # 转发到 WSL 内部 SSH 服务的端口 local_port = 2222 # 从公网访问时使用的端口 remote_port = 6001
配置解读:
[wsl-main-ssh]
: 代理的唯一名称。local_port = 2222
:frpc
接收到流量后,将其转发至本地 (127.0.0.1
) 的2222
端口,即 WSL SSH 服务。remote_port = 6001
:frps
将监听其公网 IP 的6001
端口,等待外部连接。
2. 扩展:多机 WSL 并行穿透
此节解决 1 -> N
的问题。
2.1. 核心原则:唯一性
frps
通过 代理名称 识别和管理所有连接。操作系统通过 端口号 监听网络。因此,要让多台机器的 frpc
共存于同一个 frps
下,必须遵守:
- 代理名称 (
[proxy_name]
) 必须唯一。 - 远程端口 (
remote_port
) 必须唯一。
2.2. 实践配置
假设现在要新增一台 “实验机 (Lab PC)”。
机器 A (主力机) 的 frpc.toml
: (同 1.2 节)
server_addr = "x.x.x.x"
server_port = 7000
[wsl-main-ssh]
type = “tcp”
local_ip = “127.0.0.1”
local_port = 2222
remote_port = 6001
机器 B (实验机) 的 frpc.toml
:
server_addr = "x.x.x.x"
server_port = 7000
# 使用一个全新的、唯一的代理名称
[wsl-lab-ssh]
type = “tcp” local_ip = “127.0.0.1” # 这台机器的 WSL SSH 端口也可以是 2222,因为它们在不同机器上,互不影响 local_port = 2222 # 分配一个全新的、唯一的公网端口 remote_port = 6002
3. 执行与加固
3.1. 启动与连接
- 启动 frpc
在每台机器的 WSL 环境中,分别使用对应的配置文件启动frpc
。为保证长期运行,建议使用nohup
或systemd
。# 在主力机 WSL 中 nohup ./frpc -c ./frpc.toml & # 在实验机 WSL 中 # (使用其各自的 frpc.toml) nohup ./frpc -c ./frpc.toml &
- 远程连接
- 连接到主力机 (A):
bash ssh wsl_user_a@x.x.x.x -p 6001
- 连接到实验机 (B):
bash ssh wsl_user_b@x.x.x.x -p 6002
输入对应 WSL 用户的密码即可登录。
- 连接到主力机 (A):
3.2. 安全加固:切换到 SSH 密钥登录
密码登录存在安全风险。配置密钥登录是标准操作。
- 在你的本地电脑 (即发起 SSH 连接的机器) 上生成密钥对。
ssh-keygen -t rsa -b 4096
- 分发公钥
将你本地电脑~/.ssh/id_rsa.pub
文件中的 全部内容,复制并追加到 目标 WSL 环境 的~/.ssh/authorized_keys
文件中。对每一台需要免密登录的 WSL 都执行此操作。 - 禁用密码登录 (在目标 WSL 中)
再次编辑/etc/ssh/sshd_config
:PasswordAuthentication no
重启 SSH 服务:sudo service ssh restart
。
此后,所有连接都将通过密钥验证,更加安全和便捷。
发表回复