总结
主要目的是在不同内网的环境下利用 frp 的内网穿透功能实现远程电脑
虽然步骤很简单,但是踩了一些小坑,因此记录一篇
使用 VPS + docker + frp + RD Client
步骤
前置准备
VPS 服务器(服务端,需要有公网ip)
Windows 本机(frpc客户端,需要被远程连接的电脑)
用于远程连接的设备(可以在移动设备上安装RD Client,用于远程连接 Windows)
Device:
Windows11 Pro 23H2
Ubuntu22.04
VPS 服务器
在服务端,需要先创建frps.toml(服务端配置文件)
需要声明一点,根据官方信息,从frp 0.52.0开始,ini格式被废弃,改为toml,json,yaml。
[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 这一行是必须的,其余可以按需添加
输入命令
docker run --restart=always --network host -d -v /path/to/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps
随后可以利用以下命令检查 docker 的运行情况
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
serverAddr = "your server ip"
serverPort = 7000
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6000
在终端中定位到当前路径,运行
.\frpc -c frpc.toml
如果成功,应该会有类似的输出
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) ,在启动时通常会在第一行输出这么一段话
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宿主机上的服务,有几种可能的方法:
-
直接在Windows宿主机上运行
frpc
:不通过Docker,而是直接在Windows环境中运行frpc
的二进制文件。这样可以确保frpc
能够访问Windows宿主机上的服务。 -
特定端口映射:如果仍然想通过Docker运行
frpc
,你需要在Docker容器运行命令中设置端口映射,从容器映射到宿主机。然而,这对于frpc
要代理的服务(如RDP)可能不是特别直接,因为frpc
通常是代理动态的、内部的服务端口到外部,而不是监听外部的连接。 -
使用Docker for Windows的网络设置:在某些情况下,调整Docker for Windows的网络配置可能有所帮助,例如配置NAT网络或自定义网络。这可能需要对Docker网络有较深入的了解。
-
VPN或其他网络隧道工具:在某些复杂的网络环境下,可能需要使用VPN或其他网络隧道工具来确保网络连接的直接性和安全性。
推荐做法
对于大多数用户来说,直接在Windows宿主机上运行frpc
是最简单和最直接的方法,这避免了Docker网络模式的复杂性,并确保了frpc
能够以最少的配置直接访问宿主机上的服务。您可以从FRP的GitHub仓库下载适用于Windows的frpc
二进制文件,并按照之前的配置方法运行它。
补充
为了避免每次启动都要重复执行 frp 的启动命令,我们可以在任务计划程序中添加一个脚本(.bat)
@echo off
:home
D:\frp\frpc -c D:\frp\frpc.toml
REM 等待一段时间后重试,比如等待60秒
timeout /t 60
goto home