适用场景:两台 Windows 电脑,你没有公网 IP,但有一台公网 Linux 服务器。
通过 frp 建立 SSH 隧道,实现纯命令行远程控制。
整体架构
你的 Windows 电脑 --> 公网服务器:6000 --> 对方 Windows:22 (frp隧道)环境说明
| 角色 | 系统 | 条件 |
|---|---|---|
| 你(控制端) | Windows | 有 SSH 客户端(PowerShell 自带) |
| 对方(被控端) | Windows | 无公网 IP |
| 中转站 | Linux 公网服务器 | 有公网 IP,端口 6000 可用 |
第一步:公网服务器部署 frps(frp server)
登录你的公网 Linux 服务器:
# 1. 下载 frp
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
tar -xzf frp_0.61.1_linux_amd64.tar.gz
cd frp_0.61.1_linux_amd64
# 2. 创建配置文件 frps.toml
cat > frps.toml << 'EOF'
bindPort = 6000
auth.method = "token"
auth.token = "你的连接密码"
# 允许客户端映射的远程端口范围
allowPorts = [{ start = 6001, end = 6010 }]
EOF
# 3. 启动 frps(后台运行)
nohup ./frps -c frps.toml > frps.log 2>&1 &
提示:记下
auth.token的值,后面客户端配置要一致。
第二步:对方 Windows 安装 OpenSSH Server
在对方 Windows 上,以管理员身份打开 PowerShell:
# 1. 安装 OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 2. 启动 SSH 服务
Start-Service sshd
# 3. 设置开机自启
Set-Service -Name sshd -StartupType Automatic
# 4. 确认端口 22 在监听(看到 0.0.0.0:22 就对了)
Get-NetTCPConnection -LocalPort 22
创建 SSH 账号(对方需要有账号让你登录):
# 查看现有账号
Get-LocalUser
# 如果对方没有账号,创建一个(可选)
# New-LocalUser -Name "你的用户名" -Password (ConvertTo-SecureString "你的密码" -AsPlainText -Force)
注意:确认对方 Windows 防火墙允许 22 端口入站。控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 22 允许。
第三步:对方 Windows 部署 frpc(frp client)
3.1 下载 frp
在对方电脑上访问:
https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_windows_amd64.zip
解压到 C:\frp\
3.2 创建 frpc.toml
在 C:\frp\ 下新建 frpc.toml,内容如下:
serverAddr = "你的公网服务器IP"
serverPort = 6000
auth.method = "token"
auth.token = "你的连接密码(与 frps.toml 一致)"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001
3.3 下载运行
打开 CMD(管理员),运行:
cd C:\frp
frpc.exe -c frpc.toml
看到类似输出说明连接成功:
login to server success, frpc proxy started
3.4 设置 frpc 开机自启(注册 Windows 服务)
让对方电脑重启后 frp 隧道自动重建,创建一个批处理文件 C:\frp\frpc.bat:
@echo off
cd /d C:\frp
frpc.exe -c frpc.toml
然后创建计划任务:
# 管理员 PowerShell 中运行
$action = New-ScheduledTaskAction -Execute "C:\frp\frpc.bat" -WorkingDirectory "C:\frp"
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "frpc" -Action $action -Trigger $trigger -RunLevel Highest
第四步:你连接对方 Windows
在你自己的 Windows 上,打开 PowerShell:
ssh -p 6001 对方Windows用户名@公网服务器IP
示例:
ssh -p 6001 administrator@1.2.3.4
输入对方 Windows 的密码,即可远程控制。
完整命令速查
公网服务器(frps)
# 启动
./frps -c frps.toml
# 查看日志
tail -f frps.log
# 停止
pkill frps
对方电脑(frpc)
# 启动
cd C:\frp && frpc.exe -c frpc.toml
# 查看日志(frpc.toml 中可配置 console 或 verbose)
你连接
ssh -p 6001 username@服务器IP
常见问题
Q1:连接拒绝 (Connection refused)
- 检查对方 Windows 22 端口是否在监听:
netstat -an | findstr :22 - 检查对方防火墙是否放行了 22 端口
- 检查 frpc 是否成功连接 frps(看日志)
Q2:frpc 连接不上 frps
- 确认服务器 6000 端口已开放(
telnet 服务器IP 6000测试) - 确认
serverAddr和serverPort配置正确 - 确认
auth.token与 frps.toml 一致
Q3:连接成功但密码错误
- 确认使用的是对方 Windows 的本机账号密码,不是微软账号
- 如果密码有特殊字符,用引号包裹
Q4:frpc 断线后重连
- 上面已配置计划任务开机自启
- 手动重启:
Start-ScheduledTask -TaskName "frpc"
Q5:想控制多台 Windows 电脑
在 frps.toml 的 allowPorts 中扩展端口范围,比如 6001-6100,然后在每台 Windows 的 frpc.toml 中分配不同的 remotePort(如 6002、6003……)。
安全建议
auth.token用强密码,不要用简单字符串- SSH 密码至少 8 位,含大小写字母和数字
- frps 日志定期清理:
> frps.log - 不要把 frpc 配置发给别人,谁拿到都能尝试连接
附:frp 下载地址汇总
| 组件 | 下载 |
|---|---|
| frps (Linux) | https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz |
| frpc (Windows) | https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_windows_amd64.zip |
当前版本 0.61.1(2024 年),如有新版请自行替换版本号。
