frp基础设置示例详解

前言

当初开始用 frp 走了一些弯路,主要原因还是对 frp 的工作原理理解不透彻,所以在设置时才会出现各种错误,导致不成功,所以下面我们以实例来做详细的说明。

frp 工作原理

官网的架构图比较抽象,不便于描述

title

所以我重绘了一张,结合实例来进行说明

title

说明

  1. frps 需要有公网 IP,例如:IP 是 10.146.0.3
  2. frps 要绑定域名,例如:绑定到 laosu.ml
  3. 根据需要访问的内容,在 dns 解析中绑定二级域名,所有的域名均指向 10.146.0.3
  • 为NAS管理页面绑定了:nas.laosu.ml
  • 为Jellyfin绑定了域名:movie.laosu.ml
  • 为airsonic绑定了域名:music.laosu.ml
  • 为R6300v2绑定了域名:router.laosu.ml

过程

当我在浏览器中输入: http://movie.laosu.ml 时,dns 服务会将其解析到 IP:10.146.0.3 上,也就是跳转到了我们安装了 frps 的主机上,frps 会根据用户输入的域名向 frpc 发起查询,如果存在该服务,则返回 jellyfin 的web 页面。

而当我输入了错误的二级域名,或者该二级域名没有被解析、绑定,又或者是 frps 和 frpc 之间的网络出现了问题,也就是服务不存在时,则会返回下面的错误界面。

例如在浏览器中输入了:http://movie1.laosu.ml 之后

title

frps.ini 说明

frps 服务器有了一键安装包之后,变得简单多了,可以输入frps config 来查看 /usr/local/frps/frps.ini 的内容,下面的 frps.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
# [common] is integral section
[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 5443
# udp port used for kcp protocol, it can be same with 'bind_port'
# if not set, kcp is disabled in frps
kcp_bind_port = 5443
# if you want to configure or reload frps by dashboard, dashboard_port must be set
dashboard_port = 6443
# dashboard assets directory(only for debug mode)
dashboard_user = admin
dashboard_pwd = xxxxxxxx
# assets_dir = ./static
vhost_http_port = 80
vhost_https_port = 443
# console or real logFile path like ./frps.log
log_file = ./frps.log
# debug, info, warn, error
log_level = info
log_max_days = 3
# auth token
token = yyyyyyyyyyyyyyyy
# It is convenient to use subdomain configure for http、https type when many people use one frps server together.
subdomain_host = 10.146.0.3
# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
#allow_ports = 1-65535
# pool_count in each proxy will change to max_pool_count if they exceed the maximum value
max_pool_count = 50
# if tcp stream multiplexing is used, default is true
tcp_mux = true

这里比较关键的信息:

  • 子域名主机和 frps 服务器的公网IP是同一个
1
subdomain_host = 10.146.0.3
  • 管理页面
1
2
3
4
5
# if you want to configure or reload frps by dashboard, dashboard_port must be set
dashboard_port = 6443
# dashboard assets directory(only for debug mode)
dashboard_user = admin
dashboard_pwd = xxxxxxxx

你可以在浏览器中输入:http://10.146.0.3:6443 ,输入用户名、密码后,可以查看实时的服务状态是否在线等信息。

title

  • token

frpc 登录到 frps 时的认证凭证,在 frpc.ini 要用到的。

1
2
# auth token
token = yyyyyyyyyyyyyyyy

frpc.ini 说明

先上实例 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
[common]
server_addr = 10.146.0.3
server_port = 5443
token = yyyyyyyyyyyyyyyy

[nas]
type = http
local_ip = 192.168.0.199
local_port = 5000
custom_domains = nas.laosu.ml

[movie]
type = http
local_ip = 192.168.0.199
local_port = 8096
custom_domains = movie.laosu.ml

[music]
type = http
local_ip = 192.168.0.199
local_port = 4040
custom_domains = music.laosu.ml

[router]
type = http
local_ip = 192.168.0.1
local_port = 80
custom_domains = router.laosu.ml

客户端 token 认证

frpc.ini 中,在 [common]节:

1
token = yyyyyyyyyyyyyyyy

开启kcp协议

kcp协议虽然会有额外的流量消耗,但在弱网环境下传输效率提升明显。关于kcp协议,有兴趣的可以自己度娘。

首先在 frps.ini 中启用 kcp 协议支持,指定一个 udp 端口用于接收客户端请求:

1
2
3
4
5
bind_addr = 0.0.0.0
bind_port = 5443
# udp port used for kcp protocol, it can be same with 'bind_port'
# if not set, kcp is disabled in frps
kcp_bind_port = 5443

其次在 frpc.ini 中,在 [common]节:

1
2
3
4
server_addr = 10.146.0.3
server_port = 5443

protocol = kcp

节的名称不能重复

在示例 frpc.ini 中,一共有5个节,名称分别是 [common][nas][movie][music][router]

【重要说明】

  • 这些节的名称是不可以重复的,否则会报错,尤其是一台 frps 服务器对应多台 frpc 客户端,这个错就会比较难发现
  • 个人习惯将节的名称和二级域名的前缀保持一致,这样便于管理

title

加密与压缩

这个是将 frpc 与 frps 之间的通信内容加密与压缩传输

1
2
use_encryption = true
use_compression = true

优点:

  • 加密可以有效防止 frpc 与 frps 之间流量被拦截
  • 压缩可以有效减小 frpc 与 frps 之间的网络流量

缺点:

  • 会额外消耗一些 cpu 资源

[nas] 为例:

1
2
3
4
5
6
7
[nas]
type = http
local_ip = 192.168.0.199
local_port = 5000
use_encryption = true
use_compression = true
custom_domains = nas.laosu.ml

增加密码保护

对于一些没有安全保护的页面,需要输入账号、密码才能访问

1
2
http_user = abc
http_pwd = abc

[nas] 为例:

1
2
3
4
5
6
7
8
9
[nas]
type = http
local_ip = 192.168.0.199
local_port = 5000
use_encryption = true
use_compression = true
http_user = abc
http_pwd = abc
custom_domains = nas.laosu.ml

当你在浏览器中输入: http://nas.laosu.ml 时,浏览器中会弹出用户号、密码的输入窗口,需要输入配置的用户名和密码才能继续访问。

参考文档

frp官网
地址:https://github.com/fatedier/frp