基本概念

FRP在配置过程中存在三个主要终端:
服务端:具有公网IP的服务器,用于运行frps服务
客户端:需要被访问的内网服务器,运行frpc服务
访问端:用于访问内网服务器的终端设备,根据frp的运行模式(常规、STCP、P2P)不同,可直接连接客户端或通过frpc连接客户端

本教程基于FRP-v0.57.0,0.52.0版本前后配置文件差异较大,在实际应用中应根据版本调整配置设置
项目链接:frp github
中文文档:frp README

FRP服务端配置

FRP客户端配置

以Ubuntu为例,先下载frp客户端,对于不同的frp版本,需要对链接进行相应调整

wget https://github.com/fatedier/frp/releases/download/v0.57.0/frp_0.57.0_linux_amd64.tar.gz

解压压缩包并修改文件夹名

tar -zxvf frp_0.57.0_linux_amd64.tar.gz
cp -r frp_0.57.0_linux_amd64 frp

清理过程文件

rm -rf frp_0.57.0_linux_amd64
rm -rf frp_0.57.0_linux_amd64.tar.gz

进入文件目录并清理frpc文件

cd frp
rm -rf frpc, frpc.toml

修改frps.toml文件内容

# 端口设置
bindAddr = "0.0.0.0"		# 外部访问IP限制
bindPort = XXXX			# frp服务端口
# 认证设置
auth.method = "token"		# 认证方式
auth.token = "XXXX"		# token设置
# 面板设置
webServer.addr = "0.0.0.0"	# 监测面板访问IP限制
webServer.port = XXXX		# 监测面板服务端口
webServer.user = "XXXX"		# 监测面板用户名
webServer.password = "XXXX"	# 检测面板密码
# frps测试运行
XXXX/frps -c XXXX/frps.toml	# 替换为frps实际路径

frps.toml文件中主要需要设置的内容包括:端口认证面板三项,在运行服务前需要在服务器中放行对应端口
注意:IP地址应为字符串类型
frps.toml完整文档:frps Full-Example

FRP服务设置

完成FRP客户端配置后,复制frps,frps.toml路径,在/etc/systemd/system 目录下创建一个 frps.service文件,用于配置frps服务

# 注意root权限
sudo vim /etc/systemd/system/frps.service

写入以下内容

[Unit]
Description = frps
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
ExecStart = XXXX/frps -c XXXX/frps.toml	# 替换为frps实际路径
[Install]
WantedBy = multi-user.target

配置frps服务开机自动启动

sudo systemctl enable frps

使用systemd命令管理frps服务

# 启动frps
sudo systemctl start frps
# 重启frps
sudo systemctl restart frps
# 终止frps
sudo systemctl stop frps
# 查看frps运行状态
systemctl status frps

其他说明

Docker部署:除前述默认部署方式外,某些面板(如1Panel)支持frps的Docker化部署,可以在面板应用商店内进行部署,配置方法与签署方法相同,但不需要专门对frps服务进行管理;

可视化文件编辑:大多数面板均支持可视化方式对文件进行编辑,无需使用vim,可以通过命令行对服务进行设置,再通过可视化方式管理文件内容。

FRP客户端配置

常规模式

FRP客户端与服务端配置类似,主要需要修改frpc.toml文件

# 下载链接与前同
https://github.com/fatedier/frp/releases/download/v0.57.0/frp_0.57.0_linux_amd64.tar.gz

frpc.toml文件设置如下所示

serverAddr = "XXXX"				# 服务器IP地址
serverPort = XXXX				# 服务端口
auth.token = "XXXX"				# token
# log.to = "./logs/frpc.log"	# Log设置

[[proxies]]
name = "XXXX"					# 连接名
type = "tcp"					# 连接类型
localIP = "127.0.0.1"			# 本地IP
localPort = XXXX				# 本地端口
remotePort = XXXX				# 远程端口,需要在公网服务器放行

frpc服务启动

./frpc -c ./frpc.toml

STCP/P2P模式

常规模式frp服务下访问端无需进行特殊设置,可直接对客户端进行连接,但相当于直接向公网暴露了一个tcp端口,存在很大的安全隐患
此外,在该模式下每次信息传递都需要走完“访问端-服务器-客户端”全流程,数据都需要通过公网服务器进行中转,受到服务器带宽、流量、延迟影响严重(国内服务器带宽一般较小,国外服务器延迟一般较高)
FRP的STCP、P2P模式即分别为上述两个问题的解决方案

STCP模式客户端设置

STCP模式需要客户端、访问端均运行frpc服务,通过密钥进行验证,构建客户端、访问端对应端口间的映射

# 客户端frpc
serverAddr = "XXXX"				# 服务器IP地址
serverPort = XXXX				# 服务端口
auth.token = "XXXX"				# token

[[proxies]]
name = "XXXX"					# 连接名
type = "stcp"					# 连接类型
secretKey = "XXXXXX"			# 密钥
localIP = "127.0.0.1"			# 本地IP
localPort = XXXX				# 本地端口
# 访问端frpc
serverAddr = "XXXX"				# 服务器IP地址
serverPort = XXXX				# 服务端口
auth.token = "XXXX"				# token

[[proxies]]
name = "XXXX"					# 连接名
type = "stcp"					# 连接类型
serverName = "XXXX"				# 服务端连接名
secretKey = "XXXXXX"			# 密钥
localIP = "127.0.0.1"			# 本地IP
localPort = XXXX				# 本地端口

建立连接需要先后启动客户端、访问端的frpc服务,此后在访问端,通过访问127.0.0.1:XXXX即可访问客户端对应端口

P2P模式客户端设置

P2P模式(XTCP模式)通过NAT打洞实现客户端、访问端对应端口的直接连接,服务端在连接初期进行识别配对,建立连接后客户端、访问端直接进行通信,因此可以大幅超出服务端的带宽、流量、延迟限制
P2P模式无法保证一定能够打洞成功,部分网络环境可能禁止打洞,在校园网、园区网等环境使用该模式时需要慎重考虑,必要时与管理员进行联系

# 客户端frpc
serverAddr = "XXXX"				# 服务器IP地址
serverPort = XXXX				# 服务端口
auth.token = "XXXX"				# token

[[proxies]]
name = "XXXX"					# 连接名
type = "xtcp"					# 连接类型
secretKey = "XXXXXX"			# 密钥
localIP = "127.0.0.1"			# 本地IP
localPort = XXXX				# 本地端口
# 访问端frpc
serverAddr = "XXXX"				# 服务器IP地址
serverPort = XXXX				# 服务端口
auth.token = "XXXX"				# token

[[proxies]]
name = "XXXX"					# 连接名
type = "xtcp"					# 连接类型
serverName = "XXXX"				# 服务端连接名
secretKey = "XXXXXX"			# 密钥
localIP = "127.0.0.1"			# 本地IP
localPort = XXXX				# 本地端口

与STCP模式相同,P2P模式需要先后启动客户端、访问端的frpc服务,此后在访问端,通过访问127.0.0.1:XXXX即可访问客户端对应端口