基本概念
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即可访问客户端对应端口