2009 字
10 分钟
Frp搭建记录

起因#

原本所有服务都是部署到服务器上的,群友推荐了一个mix-space博客,我也想部署上去试一下,试了半天,服务器一编译就崩了,ssh都卡断开了。后来尝试通过tmux保活,确保ssh断开后也能正常编译,等了挺久登录服务器后发现还是编译失败。又试了一下限制编译时的核心和内存占用,一样编译失败,索性本地测试了一下,发现本地编译是没有问题的,于是又找了另一台2H2G的服务器,再次从头搭建了一遍,最后还是编译崩溃,基本就确定问题在于服务器太差了。最后考虑的方案就是本地部署博客项目,然后通过内网穿透去访问,这中间也踩了点坑,本来frp服务端和客户端配置一下挺简单的,但是发现网上教程是有点小问题的,可能是我的版本和他的不一样,配置文件中的细节差了一点,花了一天多的时间来回排查问题。

⚠️声明#

以下配置文件仅适用于frp_0.64.0_linux_amd64.tar.gz版本,如果版本和我不同不要抄以下配置文件,避免踩和我一样的坑

准备工作#

  1. 开放服务器的端口(我这里测试仅开放了50080端口)
  2. 确认服务器防火墙状态(不限制7000、7500、50080等frp需要的端口即可)
  3. 确认本地防火墙状态(我本地直接关了)
  4. 服务器和本地都下载好frp的文件
Terminal window
wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz

镜像站:Github Proxy 文件代理加速

服务器配置#

首先解压下载好的frp_0.64.0_linux_amd64.tar.gz文件

Terminal window
tar -xzvf frp_0.64.0_linux_amd64.tar.gz

解压后内容如下:

frpc frpc.toml frps frps.toml LICENSE

服务器主要看frpsfrps.toml

frps.toml#

文件内容如下,⚠️注意在运行之前最好将注释删除掉:

[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = "admin"
dashboard_pwd = "admin"
# 身份验证
auth.method = "token"
auth.token = "12345678"

修改好后,可以通过./frps -c ./frps.toml测试一下是否可以正常运行

客户端配置#

客户端也是下载好frp_0.64.0_linux_amd64.tar.gz文件并解压,客户端主要看frpcfrpc.toml

frpc.toml#

教程中推荐的配置文件写法如下,⚠️注意在运行之前最好将注释删除掉:

[common]
# server_addr 为 FRPS 服务器 IP 地址
server_addr = "127.0.0.1"
# server_port 为服务端监听端口,bind_port
server_port = 7000
# 身份验证
auth.method = "token"
auth.token = "12345678"
# 下方此处设置为,访问frp服务端的50022端口时,等同于通过中转服务器访问127.0.0.1的2222端口。
# name 服务名称
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口
[[proxies]]
name = "ssh"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 2222
remote_port = 50022
[[proxies]]
name = "mx-shiro"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 2323
remote_port = 50080

其实我更喜欢[proxies.ssh][proxies.http]这种写法,这样写在ui面板中可以看到每一个监听的端口,而如果写成[[proxies]]然后通过name字段区分,在ui面板中只显示一个监听的端口,以下是[proxies.ssh][proxies.http]写法:

[common]
# server_addr 为 FRPS 服务器 IP 地址
server_addr = "127.0.0.1"
# server_port 为服务端监听端口,bind_port
server_port = 7000
# 身份验证
auth.method = "token"
auth.token = "12345678"
# [proxies.ssh] 为服务名称,下方此处设置为,访问frp服务端的50022端口时,等同于通过中转服务器访问127.0.0.1的2222端口。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口
[proxies.ssh]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 2222
remote_port = 50022
[proxies.http]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 2323
remote_port = 50080

修改好后,可以通过./frpc -c ./frpc.toml测试一下是否可以正常运行,如果可以正常运行,就可以先把服务器那边运行起来,然后本地运行起来,看输出是否正常,能否正常访问,正常输出应该是这样的:

PixPin_2025-08-16_01-31-48

WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!这句不用管,只是提醒你.ini格式的配置文件不推荐使用了,最好使用yaml/json/toml格式的

只要看最后输出的是start proxy success即可

问题记录#

remote_port和remotePort问题#

于是就到了我遇到的最重量级的问题了,就是配置文件中字段remote_portremotePort,网上的教程中大多是写成remotePort = 50080这样的格式(至少我搜到的前几篇都是写成remotePort),所以我在运行后无法使用时完全没有怀疑过这个配置文件的写法是有问题的,甚至搜过frp新版配置文件toml详解,里面也是remotePort写法,教程里甚至说:

从 v0.52.0 版本开始,frp 开始支持 TOML、YAML 和 JSON作为配置文件格式。

本文所用版本v0.62.1,并且以debian为例

我的版本是0.64.0,按理说用他这种写法应该是没有问题的,而且最抽象的是我按这种错误写法编写配置文件后,既不能正常使用,又不会报错,真麻了。

PixPin_2025-08-16_02-03-11

请看,他正常运行起来了,没有报错,然后我服务器的50080端口是无法访问的

后来幸好还有耐心,又找了几篇文章,里面提到了ui面板,也就是服务器的配置文件frps.toml中监听的7500端口对应的服务,在ui面板中可查看客户端的连接,同时会显示这个客户端连接后服务器在监听哪个端口,上面这个图片中配置文件remotePort = 50080字段写的是服务器监听50080端口是吧,看看ui面板中现在实际监听的是哪个端口

PixPin_2025-08-16_02-05-41

实际服务器在监听7078端口,这能用就怪了,50080肯定无法访问啊,恰好后面的教程中有旧的frps.ini文件写法,我发现旧的配置文件中是写成remote_port = 50080的,同时好巧不巧发现了服务器输出中的这一行

PixPin_2025-08-16_02-09-46

之前没有仔细看过服务器的输出,再加上这个frp我也是第一次配,所以错过了这个关键信息,看到这我就应该想到是配置文件中的remotePort = 50080字段没有被服务器识别了,所以我改成了remote_port = 50080,重新运行,这次服务器输出如下:

PixPin_2025-08-16_02-12-36

输出中监听的端口不是0了,而是明确写了50080,此时ui面板中也是50080

PixPin_2025-08-16_02-13-46

这下破案了,是之前配置文件中的写法有问题,给我折磨坏了

这回测试没有问题可以把服务托管到systemd了

托管到systemd#

首先按照教程中的说法,将frps.tomlfrps放入服务器的/etc/frp路径下,将frpc.tomlfrpc放入内网主机的/etc/frp路径下

Terminal window
# 内网主机
ls /etc/frp/
frpc frpc.toml
# 服务器
ls /etc/frp/
frps frps.toml

然后编写frps.servicefrpc.service文件

frps.service#

在服务器的/etc/systemd/system/路径中创建frps.service文件,该文件内容如下:

Terminal window
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root
Restart=always
RestartSec=3s
ExecStart=/etc/frp/frps -c /etc/frp/frps.toml
[Install]
WantedBy=multi-user.target

编写后运行服务:

Terminal window
# 重新加载 Systemd 配置
systemctl daemon-reload
# 将服务设置为开机自启动
systemctl enable frps
# 启动服务
systemctl start frps
# 查看服务状态
systemctl status frps

frpc.toml#

在内网主机的/etc/systemd/system/路径中创建frpc.service文件,该文件内容如下:

Terminal window
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
Restart=always
RestartSec=3s
ExecStart=/etc/frp/frpc -c /etc/frp/frpc.toml
[Install]
WantedBy=multi-user.target

编写后运行服务:

Terminal window
# 重新加载 Systemd 配置
systemctl daemon-reload
# 将服务设置为开机自启动
systemctl enable frpc
# 启动服务
systemctl start frpc
# 查看服务状态
systemctl status frpc

参考#

  1. linux最简单自行搭建,使用frp进行内网穿透
Frp搭建记录
https://fuwari.cbba.top/posts/frp搭建记录/
作者
Chen_Feng
发布于
2025-08-16
许可协议
CC BY-NC-SA 4.0