Frp 内网穿透,远程访问
前序
自从建了这个主页,一直没想好写什么东西,正巧碰上远程连接软件 Team Viewer 无法使用的情况, 在对比了多个远程连接软件后,选择了 Frp 作为解决我目前困境的一个方式的同时,也想记录下本次搭建的过程。
Frp 全名:Fast Reverse Proxy,是一个可用于内网穿透的高性能的反向代理应用,支持 TCP, UDP, HTTP, HTTPS 协议。可以利用 Frp 内网穿透服务实现穿透处于内网或防火墙后的设备及主机;对外网环境提供 HTTP 或 HTTPS 服务;利用处于内网或防火墙后的机器,对外网环境提供 TCP/UDP 服务等。
比如我这次的搭建 Frp 服务的主要目的就是通过 Frp + RDP 访问处于公司内网环境内的主机,达到远程办公的目的。
这里不得不提一句,Team Viewer 其实是一个很好用的远程软件,但是不知道为什么从 6 月开始突然大手笔的封杀了免费版,让我这个日常白嫖党,不禁有些措手不及。在尝试其他多款软件后,始终感觉效果不怎么样,于是,有了这次的实践。
Frp 的作用
- 利用处于内网或防火墙后的机器,对外网环境提供 HTTP 或 HTTPS 服务。
- 对于 HTTP, HTTPS 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个 80 端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 TCP 和 UDP 服务,例如在家里通过 RDP/SSH 访问处于公司内网环境内的主机。
搭建过程
😝😝 终于开始了,上面讲了好多我自己都看不懂的废话。不过,例行介绍还是有必要的。
首先,介绍一下我安装 Frp 的 VPS 及配置,服务器是 GCP 的香港节点,f1 配置,1v CPU 和 0.5 G 内存。经过多次尝试,IP 段为 34.96.x.x ,在我这个小城市的联通延迟还是不错的,ping 大概维持在 70s-90s 上下。系统上我选择的是 Ubuntu 18.04 版本。
2025 年更新,原来使用的是谷歌云的免费云服务器 GCP,后来免费时间到期,虽然也有续期的方法,但是不想再折腾。恰巧又碰上 甲骨文 (Oracle Cloud) 的云服务器免费。于是便开始使用 甲骨文 (Oracle Cloud)。
甲骨文 (Oracle Cloud) 免费套餐给每个用户两个基于 AMD 的计算虚拟机,每个虚拟机具有 1/8 个 OCPU 和 1 GB 内存,和一个基于 Arm 的 Ampere A1 内核和 24 GB 内存,可用作 1 个虚拟机或最多 4 个虚拟机。出站流量每月最多 10 T,几乎可以算作无限。出站带宽是 480 Mbps。
综上,可以有 3 到 6 个的免费服务器任意使用。只是 4 C 24 G 的 ARM 架构服务器比较难开,需要运气或者使用脚本。但是另外两台 x86_64 的服务器也已足够使用。
下面继续开始。系统上,依旧选择的是 Ubuntu,系统版本选择的是最新的 24.04。
服务器端
1.下载程序
前往 Frp 的 Github releases 页面下载最新版的、对应你的 VPS 的处理器架构的包,地址:Frp 内网穿透 。
其实目前大多数 VPS 主机商在购买时都已标注,看选择的处理器是什么架构即可。且主流都是使用的 amd64 架构,所以下载时直接选择对应此架构的版本就可以。当然,如果不放心,也可以运行以下命令,查看一下你的 VPS 处理器架构:
arch
如果输出 x86_64 那么就说明是 amd64,即需要下载带 linux_amd64 的那个压缩包;如果输出的是其他的,则在文件列表中寻找 linux 的对应架构的压缩包。记住,右键复制链接。
本文便以 amd64 架构举例,截至目前更新文章的时间 2025 年 3 月, Frp 最新版是 v0.61.2 。
## 切换到你想要 Frp 存放的目录,此处我选择的是 /opt/data,你也可以选择其他的目录。
## /opt 目录一般为用户系统级用户程序存放的目录,此处我在 /opt 下创建了一个 data 文件夹,当作以后存放程序的目录。
## mkdir 创建目录命令,-p 创建嵌套目录时使用,“需要时创建目标目录的父目录,但即使这些目录已存在”。
## 例如,如果创建/目录1/目录2/目录3/目录4,假设当前只有目录1存在,使用 -p 参数即可将后续所有目录都创建。
## 如果不添加 -p,直接使用 sudo mkdir /目录1/目录2/目录3/目录4,则会报错。
sudo mkdir -p /opt/data
## 切换到 data 工作目录,并向 VPS 下载 Frp 包
cd /opt/data
sudo wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_linux_amd64.tar.gz
## 解包
sudo tar -xzf frp_0.61.2_linux_amd64.tar.gz
## 将文件夹名改成 frp,不然目录太长了,一是记不住,二是也不方便操作
sudo mv frp_0.61.2_linux_amd64 frp
## 切换到 frp 目录
cd frp/
## 执行 chmod 命令,确保 frps 程序具有可执行权限
sudo chmod +x frps
此处可以尝试运行一下,看看是否能正常运行:
./frps -help
正常情况下,大概会出现一页的帮助文档信息,这里我就不截图或者 print 下来了,没多大必要,当然不是我懒 。倘若你没有出现帮助信息,那或许是你下载的版本不对。
配置文件
文档名称 | 功能 |
---|---|
frpc | 客户端程序 |
frpc.toml | 客户端配置文件 |
frps | 服务端程序 |
frps.toml | 服务端配置文件 |
大约在 50 版本的时候,frp 的配置文件由 ini,切换成了 toml,参数的格式有所变动。
2.配置程序
你可以参考以下配置说明来书写配置文件 frps.toml,我觉得可以先在电脑上打一份草稿,先列举自己的需求。 我这里列举了一些必要的、我用到的和你可能用到的配置,如果你想研究完整的配置说明可以看 Github 项目中的 frps_full.toml ,以及参考资料内的 Frp 官方中文文档 。
# 必须将 IPv6 的文字地址或主机名括起来
# 放在方括号中,如 “[::1]:80”, “[ipv6-host]:http” 或 “[ipv6-host%zone]:80”
# 对于单个 “bindAddr” 字段,不需要方括号,比如 `bindAddr = "::"`.
bindAddr = "0.0.0.0"
bindPort = 7000
# 用于 kcp 协议的 udp 端口,可以与 'bindPort' 相同。
# 如果未设置,则在 FRPS 中禁用 KCP。
kcpBindPort = 7000
# 每个代理中的池计数将不超过 maxPoolCount。
# 如果使用 tcp 流复用,default 为 true
[transport]
maxPoolCount = 5
tcpMux = true
# transport.tls.force 指定是否只接受 TLS 加密的连接。默认情况下,该值为 false。
transport.tls.force = false
# 如果要支持虚拟主机,必须设置监听的 http 端口(可选)
# 注意:http port 和 https port 可以和 bindPort 一致
vhostHTTPPort = 80
vhostHTTPSPort = 443
# Configure the web server to enable the dashboard for frps.
# dashboard is available only if webServer.port is set.
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "123456"
webServer.password = "123456"
# webServer.tls.certFile = "server.crt"
# webServer.tls.keyFile = "server.key"
# dashboard assets directory(only for debug mode)
# webServer.assetsDir = "./static"
# 在仪表盘监听器中启用 golang pprof 处理程序。
# 必须先设置 Dashboard 端口
webServer.pprofEnable = false
# enablePrometheus 会在 /metrics api 中导出 webServer 上的 prometheus 指标。
enablePrometheus = true
# DetailedErrorsToClient 定义是否将特定错误(带有调试信息)发送到 frpc。默认情况下,此值为 true。
detailedErrorsToClient = true
[auth]
method = "token"
token = "123465789"
# 每个客户端可以使用的最大端口数,默认值为 0 表示没有限制
maxPortsPerClient = 0
# 如果 subDomainHost 不为空,可以在 frpc 的配置文件中设置 type 为 http 或 https 时的子域
# 当子域为test时,路由使用的主机为 test.frps.com
subDomainHost = "example.com"
# 指定UDP报文大小,单位为字节。如果未设置,则默认值为 1500。
# 客户端和服务器之间的参数应该相同。
# 它会影响 udp 和 sudp 代理。
udpPacketSize = 1500
# NAT打孔策略数据的保留时间。
natholeAnalysisDataReserveHours = 168
检查没有什么想要增删的后,将配置文件写入 frps.toml 就可以了。这里介绍两种方法,
你可以使用 Vim 编辑器,一般而言 Ubuntu 系统已经安装好了一些必要的软件程序,比如 Vim,但如果你使用的是其它的系统,可能需要安装:
sudo apt -y install vim
安装成功后,
sudo vim /opt/data/frp/frps.toml
这里我是出于演示,输入完整的路径,其实,上面已经切换到 frp 的工作目录内,可以直接输入文件名而不必输入前面一串的文件夹路径信息。
进入编辑配置文件,按下 insert
键,进入编辑模式,将你的配置文件复制进去,检查无误后,按下 Esc
退出编辑模式,直接输入 :wq!
保存并退出。

2024.8.27,这里更新了一张图片。
到此基本结束了,尝试启动一下 frps
## 使用 -c 参数指定配置文件
sudo ./frps -c frps.toml
仔细查看运行后的命令,出现绿色 success 字样,代表配置没有问题,可以正常使用了。此时,可以按下 Ctrl
+ **c
退出。
3.后台运行和开机自启
启动
直接使用上面的命令运行是不行的,当断开 SSH 的时候,程序 frps 就会停止运行,因此可以使用 nohup 来使它在后台运行。
sudo nohup /opt/data/frp/frps -c /opt/data/frp/frps.toml &
停止
停止就使用 pkill ,结束 frps 即可。
sudo pkill frps
重启
先停止,再启动。
开机自启
对比了网上多种开机自启的方式,我最终选择了 systemctl 来控制,因为很好用,而且还方便.当然,原理我并不清楚,毕竟我也是一个新手,能用就行。
## 使用管理员权限编辑系统服务文件
sudo vim /lib/systemd/system/frps.service
####### 启动分割线 #######
##配置文件
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写我们刚才存放 frps 的目录,或者你自定义存放的目录)
ExecStart=/opt/data/frp/frps -c /opt/data/frp/frps.ini
[Install]
WantedBy=multi-user.target
那么,接下来就启动吧!
- sudo systemctl start frps
再打开自启动。
- sudo systemctl enable frps
Systemd常用命令
- 重启应用,sudo systemctl restart frps
- 停止应用,sudo systemctl stop frps
- 查看服务日志,sudo systemctl status frps
- 设置开机启动,sudo systemctl enable frps
- 自启配置文件有改动重新加载,systemctl daemon-reload
题外话
使用 GCP 、阿里云、腾讯云、Oracle Cloud 等还需在安全组-入站规则内放开对应的端口,不然会出现客户端无法连接到服务端的情况。具体放开的方法见此:云服务器安全组设置。
客户端配置
1.书写配置
基本配置,这是整个配置文件的必须
# frpc.toml,user 代表当前配置的名称,为区别其它的客户端,需要各自不同的名称
user = "frpc"
# 此处的 serverAddr 需要填写,服务器的 IP 地址,或者 DNS 解析的域名。
serverAddr = "example.com"
serverPort = 7000
loginFailExit = true
auth.token = "123456789"
[transport]
protocol = "tcp"
connectServerLocalIP = "0.0.0.0"
[transport.tls]
enable = true
disableCustomTLSFirstByte = false
TCP/UDP
这里以 SSH 连接为例,
# proxies,代表此处为客户端连接配置
[[proxies]]
# name,是你需要穿透的服务的自定义名称
name = "ssh"
# type,连接类型,填写 tcp、udp、http、https等,具体的类型需要到官网查看。
type = "tcp"
# 如果是转发到frp客户端所在本机(比如远程主机)则填 127.0.0.1
# 否则填对应机器的内网ip
localIP = "127.0.0.1"
## 需要转发的端口,比如远程连接的端口是 3389,SSH 的端口是 22
localPort = 11122
# frp 服务端的远程监听端口,即你访问服务端的 remotePort 就相当于访问
# 客户端的 localPort ,如果填0则会随机分配一个端口
remotePort = 11122
[proxies.transport]
## 是否加密客户端与服务端之间的通信,默认是 false
use_encryption = true
## 是否压缩客户端与服务端之间的通信,默认是 false
use_compression = true
## 压缩可以节省流量,但需要消耗 CPU 资源
## 加密自然也会消耗 CPU 资源,但是不大
鉴于我只是为了远程桌面连接而配置的 frp ,其他的我没有深入去了解,想了解的可以去 参考资料 中自己学习。
2.合并配置
上面已经将基本我们需要的配置都写出来了,将二者合而为一,然后填写到 frpc.toml 配置文件中。看起来就是这样子的:
user = "frpc"
serverAddr = "example.com"
serverPort = 7000
loginFailExit = true
auth.token = "123456789"
[transport]
protocol = "tcp"
connectServerLocalIP = "0.0.0.0"
[transport.tls]
enable = true
disableCustomTLSFirstByte = false
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 11122
remotePort = 11122
[proxies.transport]
use_encryption = true
use_compression = true
将下载的对应你的远程主机版本的 frpc 客户端文件,解压在一个方便的位置,例如我的存放位置在
D:\frp
在当前文件夹,按住 shfit
+ 鼠标右键
,在出现的右键菜单中选择 从此处打开 PowerShell 窗口
,也有可能是 从此处打开 CMD 窗口
,亦或是 在终端中打开
。总之选择一种,执行
.\frpc -c frpc.toml
如果出现的是如下结果,则说明 frp 客户端启动成功。
PS D:\frp> .\frpc -c frpc.toml
2020/06/16 16:25:19 [I] [service.go:282] [34gd169d91sffsa6] login to server success, get run id [34gd169d91sffsa6], server udp port [0]
2020/06/16 16:25:19 [I] [proxy_manager.go:144] [34gd169d91sffsa6] proxy added: [RDP]
2020/06/16 16:25:19 [I] [control.go:179] [34gd169d91sffsa6] [RDP] start proxy success
记住末尾的 start proxy success
出现这个字样,代表已经启动成功,如果不是这个,就要检查是否配置文件错误,是否与远程服务器连接不通畅。
3.开机自启
关于 Windows 客户端如何开机自启,网上也有很多方式,什么脚本啊、注册服务啊,多不胜数,这里我介绍一种使用非常简单的方式,纯粹的可视化图形交互界面,简单几步就能将程序注册为系统服务。
(1)下载软件不提供了
下载地址:SrvanyUI 访问码:wl5f 失效了哦!
Srvany 是微软套件的一个小工具,可以手动将程序或其他可执行文件注册为系统服务。但是操作涉及到注册表操作,使用颇为不便。而 SrvanyUI 是一位大神,封装简化的可视化工具,将原本繁琐的操作,点击几下键盘就能完成。具体下载请参考 参考资料。
下载完成后,将程序放在一个比较顺手的文件夹,
(2) 创建服务
打开 SrvanyUI ,截图如下:

选择左上角工具栏第一个绿色的 + 号,开始添加服务,如下图所示,依次选择自建服务,填写完整 名称 ,选项 等内容,然后点击确定,开始使用吧!

大功告成!此时,按下 win
+ x
,点击 计算机管理 ,打开 服务和程序 -> 服务 ,看看 FRP 服务是否已经存在并启动了呢!

结尾
至此,所有步骤都已完成。 在其他电脑使用 win
+ r
弹出运行窗口,输入 mstsc 并确定,打开远程桌面连接,输入你设定的 域名/IP : 端口,如 frp.xxx.com:7001 ,账户和密码就是你设置的这台被远程客户端的登录账户和密码,连接远程桌面看看吧。
参考资料
- Github 官方说明:https://github.com/fatedier/frp/blob/master/README_zh.md
- frp 官方中文文档:https://gofrp.org/zh-cn/docs/overview/
- Frp 内网穿透工具的搭建和使用方法:https://code.skyheng.com/post/52586.html
- 使用 FRP 反向代理实现 Windows 远程连接:https://www.cnblogs.com/zhanggaoxing/p/9221705.html
- 用开源免费的内网穿透工具 frp,实现远程桌面和文件传输 - 少数派:https://sspai.com/post/60852
- FRP 内网穿透 Windows 远程桌面:https://www.cnblogs.com/ingxx/p/12255241.html
- SrvanyUI 服务管理工具发布:https://wangye.org/blog/archives/644/