FRP(Fast Reverse Proxy) 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站, 帮你实现 公网 ←→ FRP(服务器) ←→ 内网 的连接,让内网里的设备也可以被公网访问到。GitHub 地址:https://github.com/fatedier/frp

frp有客户端和服务端,客户端放在本地电脑或服务器,服务端放在云服务器。

服务器安装

从github页面下载FRP软件包:https://github.com/fatedier/frp/releases

下载

下载对应的版本,如果不清楚处理器架构,可在终端输入arch命令来查看。

1
2
3
4
5
6
7
# 进入服务器用wget下载
cd /usr/local
wget https://github.com/fatedier/frp/releases/download/v0.46.0/frp_0.46.0_linux_amd64.tar.gz
tar -zxvf frp_0.46.0_linux_amd64.tar.gz # 解压
rm frp_0.46.0_linux_amd64.tar.gz # 删除压缩包
cd frp_0.46.0_linux_amd64
rm -rf frpc* #删除客户端配置

软件包中有客户端和服务端两种程序,以frps和frpc区分。frps即为frp server,frpc即为frp client。

配置

配置文件 frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
# 服务器监听端口
bind_port = 7000
# 网穿透http端口,自己设置, 避免使用80
vhost_http_port = 8088
# 网穿透https端口,自己设置, 避免使用443
vhost_https_port = 8099
# 管理页面防访问端口
dashboard_port = 7500
# 设置令牌,避免外泄,防止滥用
token = 98754321
# 控制面板的用户名密码
dashboard_user = dong
dashboard_pwd = ren41021213

放行相应的端口,我这里是7000,8088,8099,7500。端口自己设置不必和我的一样

启动

1
./frps -c ./frps.ini

启动后台运行

1
nohup ./frps -c ./frps.ini &

关闭服务

1
2
3
4
5
# 首先找到frp服务进程
ps -aux|grep frp| grep -v grep
root 10115 0.0 0.6 720204 25940 pts/0 Sl 19:49 0:00 ./frps -c ./frps.ini
# 删除该进程
kill 10115

使用url访问http://f.lurenx.cn:7500,http://123.249.103.139:7500/ 。输入用户名和密码进入控制面板,查看服务信息。

客户端安装

下载合适的安装包,我用的是英特尔处理器的苹果,下载的这个 frp_0.46.0_darwin_amd64.tar.gz

配置

和服务端类似下载后解压,放到合适的地方。删除frps相关的文件,配置frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[common]
#服务端地址
server_addr = 123.249.103.139
#服务端监听端口,对应服务器bind_port
server_port = 7000
#令牌跟服务端保持一致
token = 98754321

#应用名称,自己设置
[web_http]
# 协议
type = http
# 本地应用端口名称
local_port = 81
#自定义域名,需为此服务准备一个域名,并解析指向frp服务器地址
custom_domains = f.lurenx.cn

# https服务
[web_https]
type = https
# 本地https端口可以和http端口一致
local_port = 82
# 自定义域名,需为此服务准备一个域名,并配置CNAME指向frp服务器地址
custom_domains = f.lurenx.cn

# 接下来的配置是支持 https 的重点配置
# 配置插件,将 https 请求转换成 http 请求后再发送给本地 Web 服务程序
plugin = https2http
# 转换成 http 后,发送到本机的 82 端口
plugin_local_addr = 127.0.0.1:82
# 这里必须写成 127.0.0.1
plugin_host_header_rewrite = 127.0.0.1
# 指定代理方式为 frp
plugin_header_X-From-Where = frp
# 指定域名证书的路径,没错证书放在客户端(证书需要在域名服务商处申请)
plugin_crt_path = /usr/local/frp_0.46.0_darwin_amd64/f.lurenx.cn_nginx/f.lurenx.cn_bundle.crt
plugin_key_path = /usr/local/frp_0.46.0_darwin_amd64/f.lurenx.cn_nginx/f.lurenx.cn.key



# 可添加更多其它服务映射,具体设置请参考官方文档或者frpc_full.ini文件。

启动

1
./frpc -c ./frpc.ini

测试

本地启动一个测试springboot 服务,端口81的项目。使用url访问您的本地Web服务http://f.lurenx.cn:8088,https://f.lurenx.cn:8099

常见错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
错误1(frps): Create vhost http listener error, listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
解决方法:端口被其他应用程序占用,关闭其他应用程序或改用其他端口。

错误2(frpc): [rdp] start error: port already used
解决方法:远程端口已被使用,改用其他端口。

错误3(frpc): [web01] start error: proxy name [web01] is already in use
解决方法:代理名称[web01]已被使用,检查并更换一个代理名称。

错误4(frpc): [web01] start error: router config conflict
解决方法:[web01]指定的域名(custom_domains)已被使用,检查并更换其他域名。

错误5(frpc): work connection closed, EOF
解决方法:连不上服务器端,检查服务器端运行是否正常,服务器端恢复后客户端会自动恢复连接。