frp Guidelines

EWinner Lv2

一、官方文档

frp中文概览

二、frp是什么?

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

三、为什么使用frp?

通过在具有公网IP的节点上部署frp服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持TCPKCP以及Websocket等多种协议。
  • 采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTPSOCK5代理等),便于独立使用frp客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端UI页面。

四、下载

Releases · fatedier/frp

五、工作原理

frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。内网服务由于没有公网IP,不能被非局域网内的其他用户访问。用户通过访问服务端的frps,由frp负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。在frp中一个代理对应一个需要暴露的内网服务。一个客户端支持同时配置多个代理。frp支持多种代理类型来适配不同的使用场景。

类型描述
tcp单纯的TCP端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp单纯的UDP端口映射,服务端会根据不同的端口路由到不同的内网服务。
http针对HTTP应用定制了一些额外的功能,例如修改HostHeader,增加鉴权。
https针对HTTPS应用定制了一些额外的功能。
stcp安全的TCP内网代理,需要在被访问者和访问者的机器上都部署frpc,不需要在服务端暴露端口。
sudp安全的UDP内网代理,需要在被访问者和访问者的机器上都部署frpc,不需要在服务端暴露端口。
xtcp点对点内网穿透代理,功能同stcp,但是流量不需要经过服务器中转。
tcpmux支持服务端TCP端口的多路复用,通过同一个端口访问不同的内网服务。

六、配置文件

1.基本配置解析

配置文件是frp的核心组件,决定了frp的运行方式和运行参数。frp目前仅支持ini格式的配置文件,frpsfrpc各自支持不同的参数。frpc:指客户端(Clinet)配置文件,frps:指服务端(Server)配置文件。frps主要配置服务端的一些通用参数,frpc则需要额外配置每一个代理的详细配置。

1
2
3
4
5
6
7
8
9
10
11
#[common]是固定名称的段落,用于配置通用参数。
[common]
server_addr = x.x.x.x
server_port = 7000

#[ssh]代表仅在代理ssh时使用的参数,在客户端使用,代理名称唯一且不可重复,但在同一个客户端中可以配置多个代理,比如[remoteDesktop]等
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

2.使用include参数

通过includes参数可以在主配置中包含其他配置文件,从而实现将代理配置拆分到多个文件中管理。

1
2
3
4
[common]
server_addr = x.x.x.x
server_port = 7000
includes = ./confd/.ini
1
2
3
4
5
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

3.负载均衡

可以将多个相同类型的代理加入到同一个group中,从而实现负载均衡的能力。目前支持的代理类型:tcp,http,tcpmux

1
2
3
4
5
6
7
8
9
10
11
12
13
[test1]
type = tcp
local_port = 8080
remote_port = 80
group = web
group_key = 123

[test2]
type = tcp
local_port = 8081
remote_port = 80
group = web
group_key = 123

用户连接frps服务器的80端口,frps会将接收到的用户连接随机分发给其中一个存活的proxy。这样可以在一台frpc机器挂掉后仍然有其他节点能够提供服务。tcp类型代理要求group_key相同,做权限验证,且remote_port相同。http类型代理要求group_key,custom_domainssubdomainlocations相同。

4.通信加密与压缩

1
2
3
4
5
6
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

通过设置use_encryption=true,将frpcfrps之间的通信内容加密传输,将会有效防止传输内容被截取。如果传输的报文长度较长,通过设置use_compression=true对传输内容进行压缩,可以有效减小frpcfrps之间的网络流量,加快流量转发速度,但是会额外消耗一些CPU资源。

5.服务端完整配置

(1)基础配置

参数类型说明默认值可选值备注
bind_addrstring服务端监听地址0.0.0.0
bind_portint服务端监听端口7000接收frpc的连接
bind_udp_portint服务端监听UDP端口0用于辅助创建P2P连接
kcp_bind_portint服务端监听KCP协议端口0用于接收采用KCP连接的frpc
quic_bind_portint服务端监听QUIC协议端口0用于接收采用QUIC连接的frpc
quic_keepalive_periodintquic协议keepalive间隔,单位:秒10
quic_max_idle_timeoutintquic协议的最大空闲超时时间,单位:秒30
quic_max_incoming_streamsintquic协议最大并发stream数100000
proxy_bind_addrstring代理监听地址同bind_addr可以使代理监听在不同的网卡地址
log_filestring日志文件地址./frps.log如果设置为console,会将日志打印在标准输出中
log_levelstring日志等级infotrace,debug,info,warn,error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
detailed_errors_to_clientbool服务端返回详细错误信息给客户端true
tcp_mux_keepalive_intervalinttcp_mux的心跳检查间隔时间60单位:秒
tcp_keepaliveint和客户端底层TCP连接的keepalive间隔时间,单位秒7200负数不启用
heartbeat_timeoutint服务端和客户端心跳连接的超时时间90单位:秒
user_conn_timeoutint用户建立连接后等待客户端响应的超时时间10单位:秒
udp_packet_sizeint代理UDP服务时支持的最大包长度1500服务端和客户端的值需要一致
tls_cert_filestringTLS服务端证书文件路径
tls_key_filestringTLS服务端密钥文件路径
tls_trusted_ca_filestringTLSCA证书路径

(2)权限配置

参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc
authenticate_heartbeatsbool开启心跳消息鉴权false
authenticate_new_work_connsbool开启建立工作连接的鉴权false
tokenstring鉴权使用的 token 值客户端需要设置一样的值才能鉴权通过
oidc_issuerstringoidc_issuer
oidc_audiencestringoidc_audience
oidc_skip_expiry_checkbooloidc_skip_expiry_check
oidc_skip_issuer_checkbooloidc_skip_issuer_check

(3)管理配置

参数类型说明默认值可选值备注
allow_portsstring允许代理绑定的服务端端口格式为 1000-2000,2001,3000-4000
max_pool_countint最大连接池大小5
max_ports_per_clientint限制单个客户端最大同时存在的代理数00 表示没有限制
tls_onlybool只接受启用了 TLS 的客户端连接false

(4)Dashboard 监控

参数类型说明默认值可选值备注
dashboard_addrstring启用 Dashboard 监听的本地地址0.0.0.0
dashboard_portint启用 Dashboard 监听的本地端口0
dashboard_userstringHTTP BasicAuth 用户名
dashboard_pwdstringHTTP BasicAuth 密码
dashboard_tls_modebool是否启用 TLS 模式false
dashboard_tls_cert_filestringTLS 证书文件路径
dashboard_tls_key_filestringTLS 密钥文件路径
enable_prometheusbool是否提供 Prometheus 监控接口false需要同时启用了 Dashboard 才会生效
asserts_dirstring静态资源目录Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
pprof_enablebool启动 Go HTTP pproffalse用于应用调试

(5)HTTP & HTTPS

参数类型说明默认值可选值备注
vhost_http_portint为 HTTP 类型代理监听的端口0启用后才支持 HTTP 类型的代理,默认不启用
vhost_https_portint为 HTTPS 类型代理监听的端口0启用后才支持 HTTPS 类型的代理,默认不启用
vhost_http_timeoutintHTTP 类型代理在服务端的 ResponseHeader 超时时间60
subdomain_hoststring二级域名后缀
custom_404_pagestring自定义 404 错误页面地址

(6)TCPMUX

参数类型说明默认值可选值备注
tcpmux_httpconnect_portint为 TCPMUX 类型代理监听的端口0启用后才支持 TCPMUX 类型的代理,默认不启用
tcpmux_passthroughbool是否透传 CONNECT 请求false通常在本地服务是 HTTP Proxy 时使用

6.客户端完整配置

(1)基础配置

参数类型说明默认值可选值备注
server_addrstring连接服务端的地址0.0.0.0
server_portint连接服务端的端口7000
connect_server_local_ipstring连接服务端时所绑定的本地 IP
dial_server_timeoutint连接服务端的超时时间10
dial_server_keepaliveint和服务端底层 TCP 连接的 keepalive 间隔时间,单位秒7200负数不启用
http_proxystring连接服务端使用的代理地址格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
log_filestring日志文件地址./frpc.log如果设置为 console,会将日志打印在标准输出中
log_levelstring日志等级infotrace, debug, info, warn, error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
pool_countint连接池大小0
userstring用户名设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_serverstring使用 DNS 服务器地址默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exitbool第一次登陆失败后是否退出true
protocolstring连接服务端的通信协议tcptcp, kcp, quic, websocket
quic_keepalive_periodintquic 协议 keepalive 间隔,单位: 秒10
quic_max_idle_timeoutintquic 协议的最大空闲超时时间,单位: 秒30
quic_max_incoming_streamsintquic 协议最大并发 stream 数100000
tls_enablebool启用 TLS 协议加密连接false
tls_cert_filestringTLS 客户端证书文件路径
tls_key_filestringTLS 客户端密钥文件路径
tls_trusted_ca_filestringTLS CA 证书路径
tls_server_namestringTLS Server 名称为空则使用 server_addr
disable_custom_tls_first_byteboolTLS 不发送 0x17false当为 true 时,不能端口复用
tcp_mux_keepalive_intervalinttcp_mux 的心跳检查间隔时间60单位:秒
heartbeat_intervalint向服务端发送心跳包的间隔时间30建议启用 tcp_mux_keepalive_interval,将此值设置为 -1
heartbeat_timeoutint和服务端心跳的超时时间90
udp_packet_sizeint代理 UDP 服务时支持的最大包长度1500服务端和客户端的值需要一致
startstring指定启用部分代理当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用
meta_xxxmap附加元数据会传递给服务端插件,提供附加能力

(2)权限验证

参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc需要和服务端一致
authenticate_heartbeatsbool开启心跳消息鉴权false需要和服务端一致
authenticate_new_work_connsbool开启建立工作连接的鉴权false需要和服务端一致
tokenstring鉴权使用的 token 值需要和服务端设置一样的值才能鉴权通过
oidc_client_idstringoidc_client_id
oidc_client_secretstringoidc_client_secret
oidc_audiencestringoidc_audience
oidc_scopestringoidc_scope
oidc_token_endpoint_urlstringoidc_token_endpoint_url
oidc_additional_xxxmapOIDC 附加参数map 结构,key 需要以 oidc_additional_ 开头

(3)UI

参数类型说明默认值可选值备注
admin_addrstring启用 AdminUI 监听的本地地址0.0.0.0
admin_portint启用 AdminUI 监听的本地端口0
admin_userstringHTTP BasicAuth 用户名
admin_pwdstringHTTP BasicAuth 密码
asserts_dirstring静态资源目录AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
pprof_enablebool启动 Go HTTP pproffalse用于应用调试

七、相关指令

CommandCommandEffect
./frpc-c./frpc.ini通过配置文件frpc.ini启动frp
frpcverify-c./frpc.ini通过frpc校验frpc.ini的正确性
frpsverify-c./frps.ini通过frps校验frps.ini的正确性
frpc reload -c ./frpc.ini根据更新后的配置文件重启
  • 标题: frp Guidelines
  • 作者: EWinner
  • 创建于 : 2024-08-30 18:20:17
  • 更新于 : 2024-08-31 10:49:14
  • 链接: https://ewinner1.github.io/2024/08/30/frp-Guidelines/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。