总结
主要目的是在不同内网的环境下利用 frp 的内网穿透功能实现远程电脑
虽然步骤很简单,但是踩了一些小坑,因此记录一篇
使用 VPS + docker + frp + RD Client
步骤
前置准备
VPS 服务器(服务端,需要有公网ip)
Windows 本机(frpc客户端,需要被远程连接的电脑)
用于远程连接的设备(可以在移动设备上安装RD Client,用于远程连接 Windows)
VPS 服务器
在服务端,需要先创建frps.toml(服务端配置文件)
需要声明一点,根据官方信息,从frp 0.52.0开始,ini格式被废弃,改为toml,json,yaml。
|
|
frps.toml 中,只有 bind_port = 7000 这一行是必须的,其余可以按需添加
输入命令
|
|
随后可以利用以下命令检查 docker 的运行情况
|
|
如果配置了 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
|
|
在终端中定位到当前路径,运行
|
|
如果成功,应该会有类似的输出
|
|
RD Client
可以在手机上下在 RD Client
在添加电脑中输入 你的主机ip:6000 ,6000是你的remotePort
进行连接即可,前提是打开远程桌面,并把自己放到准入用户中
踩坑
利用 docker 在 linux 服务端部署 frps 可行的
但是————
在 Windows 端部署 frpc 时,这是错误的
如果用过 WSL2 的话(例如在 Windows 启动 Ubuntu) ,在启动时通常会在第一行输出这么一段话
|
|
来自 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)
|
|