利用frp实现Windows远程桌面

VPS + docker + frp + RD Client

总结

主要目的是在不同内网的环境下利用 frp 的内网穿透功能实现远程电脑

虽然步骤很简单,但是踩了一些小坑,因此记录一篇

使用 VPS + docker + frp + RD Client

步骤

前置准备

VPS 服务器(服务端,需要有公网ip)

Windows 本机(frpc客户端,需要被远程连接的电脑)

用于远程连接的设备(可以在移动设备上安装RD Client,用于远程连接 Windows)

VPS 服务器

在服务端,需要先创建frps.toml(服务端配置文件)

需要声明一点,根据官方信息,从frp 0.52.0开始,ini格式被废弃,改为toml,json,yaml。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[common]
# 服务端监听端口
bind_port = 7000

# 如果你想启用带有认证的dashboard,可以配置以下参数
dashboard_port = 7500
dashboard_user = "admin"
dashboard_pwd = passwd

# vhost_http_port 和 vhost_https_port 用于配置HTTP和HTTPS的虚拟主机端口
vhost_http_port = 8080
vhost_https_port = 4433

frps.toml 中,只有 bind_port = 7000 这一行是必须的,其余可以按需添加

输入命令

1
docker run --restart=always --network host -d -v /path/to/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps

随后可以利用以下命令检查 docker 的运行情况

1
docker ps -a

如果配置了 dashboard ,可以在浏览器中输入 服务器ip:7500 查看

防火墙

需要在防火墙中开发相应的端口

1.bind_port = 7000

2.dashboard_port = 7500

3.remotePort = 6000(这个在后面会用到)

Windows本机(frp)

这里选择 frp 下载(i.e.frp_0.56.0_windows_amd64.zip)

解压后,更改里面的 frpc.toml

1
2
3
4
5
6
7
8
9
serverAddr = "your server ip"
serverPort = 7000

[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6000

在终端中定位到当前路径,运行

1
.\frpc -c frpc.toml

如果成功,应该会有类似的输出

1
2
3
4
5
2024-04-08 21:02:26.758 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2024-04-08 21:02:26.765 [I] [client/service.go:294] try to connect to server...
2024-04-08 21:02:26.797 [I] [client/service.go:286] [d735c117147dda25] login to server success, get run id [d735c117147dda25]
2024-04-08 21:02:26.797 [I] [proxy/proxy_manager.go:173] [d735c117147dda25] proxy added: [test-tcp]
2024-04-08 21:02:26.809 [I] [client/control.go:170] [d735c117147dda25] [test-tcp] start proxy success

RD Client

可以在手机上下在 RD Client

在添加电脑中输入 你的主机ip:6000 ,6000是你的remotePort

进行连接即可,前提是打开远程桌面,并把自己放到准入用户中

踩坑

利用 docker 在 linux 服务端部署 frps 可行的

但是————

在 Windows 端部署 frpc 时,这是错误的

如果用过 WSL2 的话(例如在 Windows 启动 Ubuntu) ,在启动时通常会在第一行输出这么一段话

1
wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。

来自 ChatGPT 的详细解释

您的考虑是正确的。在Windows上使用Docker运行frpc时,确实存在与直接在宿主机上运行不同的网络行为。尤其是当您尝试通过frpc代理连接到运行在Windows宿主机上的服务(比如远程桌面RDP)时,网络配置和行为的差异可能导致连接失败。

Docker网络模式和限制

在Linux环境下,Docker容器可以使用--network host模式,这使得容器共享宿主机的网络堆栈,容器内的应用可以直接监听宿主机的端口。但在Windows或Mac上,由于Docker运行在虚拟机(VM)中,--network host模式并不工作如同Linux一样。这意味着即使你的frpc试图监听某个端口,实际上它是在虚拟机的网络环境中监听,而不是Windows宿主机的网络环境。

解决方案

为了使frpc能够正确代理到Windows宿主机上的服务,有几种可能的方法:

  1. 直接在Windows宿主机上运行frpc:不通过Docker,而是直接在Windows环境中运行frpc的二进制文件。这样可以确保frpc能够访问Windows宿主机上的服务。

  2. 特定端口映射:如果仍然想通过Docker运行frpc,你需要在Docker容器运行命令中设置端口映射,从容器映射到宿主机。然而,这对于frpc要代理的服务(如RDP)可能不是特别直接,因为frpc通常是代理动态的、内部的服务端口到外部,而不是监听外部的连接。

  3. 使用Docker for Windows的网络设置:在某些情况下,调整Docker for Windows的网络配置可能有所帮助,例如配置NAT网络或自定义网络。这可能需要对Docker网络有较深入的了解。

  4. VPN或其他网络隧道工具:在某些复杂的网络环境下,可能需要使用VPN或其他网络隧道工具来确保网络连接的直接性和安全性。

推荐做法

对于大多数用户来说,直接在Windows宿主机上运行frpc 是最简单和最直接的方法,这避免了Docker网络模式的复杂性,并确保了frpc能够以最少的配置直接访问宿主机上的服务。您可以从FRP的GitHub仓库下载适用于Windows的frpc二进制文件,并按照之前的配置方法运行它。

补充

为了避免每次启动都要重复执行 frp 的启动命令,我们可以在任务计划程序中添加一个脚本(.bat)

1
2
3
4
5
6
@echo off
:home
D:\frp\frpc -c D:\frp\frpc.toml
REM 等待一段时间后重试,比如等待60秒
timeout /t 60
goto home
Licensed under CC BY-NC-SA 4.0
最后更新于 Apr 08, 2024 00:00 UTC
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计