FRP 使用记录

FRP 使用记录

前言

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

使用示例 https://gofrp.org/docs/examples/

我对将要配置的 FRP 服务有如下目标:

  1. 支持 HTTPS
  2. 服务器打开端口尽可能少
  3. 使用简单、支持泛域名
  4. 和宝塔面板整合

安装服务端

下载服务端

对于服务器在国内的可以手动下载 最新版本的软件包,手动上传 https://github.com/fatedier/frp/releases/

服务器下载 wget https://github.com/fatedier/frp/releases/download/v0.39.1/frp_0.39.1_linux_amd64.tar.gz

解压 并打开目录

1
2
3
tar xvfz frp_0.39.1_linux_amd64.tar.gz
ls
cd frp_0.39.1_linux_amd64

服务器上不需要 frpcfrpc.ini,可以使用 rm -f frpc* 来进行删除

编辑服务端配置

vim frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[common]
bind_addr = 0.0.0.0
bind_port = 30364
log_level = trace
log_max_days = 3
# 配置http访问端口8571
vhost_http_port = 8571
vhost_https_port = 4430

# 开启dashboard,frp提供了一个控制台,可以通过这个端口访问到控制台。可查看frp当前有多少代理连接以及对应的状态
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = xxxxxx

# 服务端的subdomain_host需要和客户端配置文件中的subdomain、local_port配合使用,
# 可通过{subdomain}.{subdomain_host} 的域名格式来访问自己本地的 web 服务。
# 假如服务端的subdomain_host为frp.spacevast.com,客户端某个配置组中的
# subdomain为a,local_port为8585,
# 则访问 a.frp.spacevast.com ,等同于访问本地的localhost:8585
subdomain_host = frp.xxxx.cn

对于 frp 服务端,可以使用系统的 systemd,因为我是宝塔面板,为了更好控制,这里使用了 Supervisor管理器 , 在软件商店搜索并安装,为 frps 添加守护进程

这里需要注意启动命令是全路径命令 /www/wwwroot/frp.xxx.cn/frp_0.39.1/frps -c /www/wwwroot/frp.xxx.cn/frp_0.39.1/frps.ini

在宝塔面板 安全中放行上面配置文件中写的 bind_port, 并在服务器管理控制台添加防火墙规则,此端口允许访问

Supervisor管理器中启动 frps 服务

Nginx 配置

这里提供几种配置

无 https + 泛域名解析 + 无面板程序

泛域名解析需要在 DNS 解析平台添加两个 A 记录,frp.xxx.cn*.frp.xxx.cn

宝塔站点中的” 域名管理 “也要添加 *.frp.xxx.cn

在站点的配置文件中添加如下部分,并删除其他无关的 location css 等配置,否则可能会导致部分资源 404

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
server
{
#FRP反向代理
location / {
proxy_redirect off;
proxy_set_header Host $host;
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Url-Scheme $scheme;

#以下三行配置wss
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_pass http://127.0.0.1:8571;
}


#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
}

https 的使用很简单,直接在宝塔面板中添加即可

泛域名解析 + 面板程序

我想达到访问 frp.xxx.cn 是控制面板,访问 a1.frp.xxx.cna2.frp.xxx.cn*.frp.xxx.cn 是正常的反代接口,由配置文件可知控制面板的端口是 7500,做如下修改即可

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
#FRP反向代理
location / {
set $is_matched 0;
#FRP 面板
if ($host = 'frp.xxx.cn')
{
proxy_pass http://127.0.0.1:7500;
set $is_matched 1;
}
proxy_redirect off;
proxy_set_header Host $host;
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Url-Scheme $scheme;

#以下三行配置wss
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# 没有匹配到,跳转到FRP
if ($is_matched = 0) {
proxy_pass http://127.0.0.1:8571;
}
}

frpc 客户端配置 (内网本地机子)

从仓库里下载对应版本的包 https://github.com/fatedier/frp/releases/

比如 windows 是 frp_0.39.1_windows_amd64.zip

解压后打开 frpc.ini 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr = #公网服务器ip
server_port = 30364 # 服务器配置中bind_port的端口

[web1]
type = http
local_ip = 127.0.0.1
local_port = 32778 # 本机服务的IP
subdomain= 01 # 访问01.frp.xxx.cn 即可访问本服务

[web2]
type = http
local_ip = 192.168.1.7
local_port = 1456
subdomain= 02 # 访问01.frp.xxx.cn 即可访问本服务

打开命令行 使用 frpc.exe -c frpc.ini 启动客户端