简介

frp的配置文件更新成frp.toml之后很多以前的配置都用不来了,后面我也是找了挺久才找到详细解释,我也是搬运的别人的,如原文作者感觉不妥可以联系我删除本文章

原文链接

点击跳转原文

服务端详细解释

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 服务端监听地址,用于接收 frpc 的连接,默认监听 0.0.0.0 bindAddr = "0.0.0.0" # 服务端监听端口,默认值为 7000 bindPort = 7000 # 服务端监听 KCP 协议端口,用于接收配置了使用 KCP 协议的 frpc 连接。端口可和 bindPort 相同,未配置时默认禁用 KCP kcpBindPort = 7000 # 服务端监听 QUIC 协议端口,用于接收配置了使用 QUIC 协议的 frpc 连接。未配置时默认禁用 QUIC quicBindPort = 7002 # 代理监听地址,可以使代理监听在不同的网卡地址,默认情况下同 bindAddr。 proxyBindAddr = "127.0.0.1" # HTTP 类型代理监听的端口,启用后才能支持 HTTP 类型的代理。端口可和 bindPort 相同。 vhostHTTPPort = 80 # HTTPS 类型代理监听的端口,启用后才能支持 HTTPS 类型的代理。端口可和 bindPort 相同。 vhostHTTPSPort = 443 # HTTP 类型代理在服务端的 ResponseHeader 超时时间,默认为 60s。 vhostHTTPTimeout = 60 # tcpmux 类型且复用器为 httpconnect 的代理监听的端口。 tcpmuxHTTPConnectPort = 1337 # 对于 tcpmux 类型的代理是否透传 CONNECT 请求。 tcpmuxPassthrough = false # 鉴权配置 ## 鉴权方式,可选值为 token 或 oidc,默认为 token。 auth.method = "token" ## 鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns auth.additionalScopes = ["HeartBeats", "NewWorkConns"] ## 在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。 auth.token = "12345678" ## oidc 鉴权配置。 ### oidc issuer specifies the issuer to verify OIDC tokens with. auth.oidc.issuer = "" ### oidc audience specifies the audience OIDC tokens should contain when validated. auth.oidc.audience = "" ### oidc skipExpiryCheck specifies whether to skip checking if the OIDC token is expired. auth.oidc.skipExpiryCheck = false ### oidc skipIssuerCheck specifies whether to skip checking if the OIDC token's issuer claim matches the issuer specified in OidcIssuer. auth.oidc.skipIssuerCheck = false # 日志配置 ## 日志输出文件路径,如果为 console,则会将日志打印在标准输出中。 log.to = "./frps.log" ## 日志级别,可选值为 trace, debug, info, warn, error,默认级别为 info。 log.level = "info" ## 日志文件最多保留天数,默认为 3 天。 log.maxDays = 3 ## 禁用标准输出中的日志颜色。 log.disablePrintColor = false # 服务端 Dashboard 配置。 ## webServer 监听地址,默认为 127.0.0.1。 webServer.addr = "127.0.0.1" ## webServer 监听端口。 webServer.port = 7500 ## HTTP BasicAuth 用户名。 webServer.user = "admin" ## HTTP BasicAuth 密码。 webServer.password = "admin" ## 静态资源目录,Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源。 webServer.assetsDir = "./static" ## 启动 Go HTTP pprof,用于应用调试。 webServer.pprofEnable = false ## Dashboard 启用 HTTPS 的 TLS 相关配置。 ### TLS 证书文件路径。 webServer.tls.certFile = "server.crt" ### TLS 密钥文件路径。 webServer.tls.keyFile = "server.key" # 网络层配置。 ## 允许客户端设置的最大连接池大小,如果客户端配置的值大于此值,会被强制修改为最大值,默认为 5。 transport.maxPoolCount = 5 ## 服务端和客户端心跳连接的超时时间,单位秒,默认为 90 秒。 transport.heartbeatTimeout = 90 ## 和客户端底层 TCP 连接的 keepalive 间隔时间,单位秒,配置为负数表示不启用。 transport.tcpKeepalive = 7200 # 是否启用 tcp mux transport.tcpMux = true ## tcp mux 的心跳检查间隔时间,单位秒。 transport.tcpMuxKeepaliveInterval = 60 ## QUIC 协议配置参数。 transport.quic.keepalivePeriod = 10 transport.quic.maxIdleTimeout = 30 transport.quic.maxIncomingStreams = 100000 ## 服务端 TLS 协议配置。 ### 是否只接受启用了 TLS 的客户端连接。 tls.force = false ### TLS 协议配置 #### TLS 证书文件路径。 transport.tls.certFile = "server.crt" #### TLS 密钥文件路径。 transport.tls.keyFile = "server.key" #### CA 证书文件路径。 transport.tls.trustedCaFile = "ca.crt" # 是否提供 Prometheus 监控接口,需要同时启用了 webServer 后才会生效。 enablePrometheus = true # 服务端返回详细错误信息给客户端,默认为 true。 detailedErrorsToClient = true # 用户建立连接后等待客户端响应的超时时间,单位秒,默认为 10 秒。 # userConnTimeout = 10 # 允许代理绑定的服务端端口。 allowPorts = [ { start = 2000, end = 3000 }, { single = 3001 }, { single = 3003 }, { start = 4000, end = 50000 } ] # 限制单个客户端最大同时存在的代理数,默认无限制。 maxPortsPerClient = 0 # 二级域名后缀。 subDomainHost = "frps.com" # 自定义 404 错误页面地址。 custom404Page = "/path/to/404.html" # 代理 UDP 服务时支持的最大包长度,默认为 1500,服务端和客户端的值需要一致。 udpPacketSize = 1500 # 打洞策略数据的保留时间,默认为 168 小时,即 7 天。 natholeAnalysisDataReserveHours = 168 # 服务端 HTTP 插件配置。 [[httpPlugins]] ## 插件名称。 name = "user-manager" ## 插件接口的地址。 addr = "127.0.0.1:9000" ## 插件接口的 Path。 path = "/handler" ## 插件需要生效的操作列表,具体可选值请参考服务端插件的说明文档。 ops = ["Login"] [[httpPlugins]] name = "port-manager" addr = "127.0.0.1:9001" path = "/handler" ops = ["NewProxy"]

客户端你详细解释

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# 用户名,设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突。 user = "your_name" # 连接服务端的地址。 serverAddr = "0.0.0.0" # 连接服务端的端口,默认为 7000。 serverPort = 7000 # 鉴权配置 ## 鉴权方式,可选值为 token 或 oidc,默认为 token。 auth.method = "token" ## 鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns auth.additionalScopes = ["HeartBeats", "NewWorkConns"] ## 在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。 auth.token = "12345678" ## oidc 鉴权配置。 ### oidc.clientID specifies the client ID to use to get a token in OIDC authentication. auth.oidc.clientID = "" ### oidc.clientSecret specifies the client secret to use to get a token in OIDC authentication. auth.oidc.clientSecret = "" ### oidc.audience specifies the audience of the token in OIDC authentication. auth.oidc.audience = "" ### oidc.scope specifies the permisssions of the token in OIDC authentication if AuthenticationMethod == "oidc". By default, this value is "". auth.oidc.scope = "" ### oidc.tokenEndpointURL specifies the URL which implements OIDC Token Endpoint.It will be used to get an OIDC token. auth.oidc.tokenEndpointURL = "" ### oidc.additionalEndpointParams specifies additional parameters to be sent to the OIDC Token Endpoint. ### For example, if you want to specify the "audience" parameter, you can set as follow. ### frp will add "audience=<value>" "var1=<value>" to the additional parameters. auth.oidc.additionalEndpointParams.audience = "https://dev.auth.com/api/v2/" auth.oidc.additionalEndpointParams.var1 = "foobar" # xtcp 打洞所需的 stun 服务器地址,默认为 stun.easyvoip.com:3478。 natHoleStunServer = "stun.easyvoip.com:3478" # 使用 DNS 服务器地址,默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址。 dnsServer = "8.8.8.8" # 第一次登陆失败后是否退出,默认为 true。 loginFailExit = true # 日志配置 ## 日志输出文件路径,如果为 console,则会将日志打印在标准输出中。 log.to = "./frpc.log" ## 日志级别,可选值为 trace, debug, info, warn, error,默认级别为 info。 log.level = "info" ## 日志文件最多保留天数,默认为 3 天。 log.maxDays = 3 ## 禁用标准输出中的日志颜色。 log.disablePrintColor = false # 客户端 AdminServer 配置。 ## webServer 监听地址,默认为 127.0.0.1。 webServer.addr = "127.0.0.1" ## webServer 监听端口。 webServer.port = 7400 ## HTTP BasicAuth 用户名。 webServer.user = "admin" ## HTTP BasicAuth 密码。 webServer.password = "admin" ## 静态资源目录,Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源。 webServer.assetsDir = "./static" ## 启动 Go HTTP pprof,用于应用调试。 webServer.pprofEnable = false # 客户端网络层配置。 ## 连接服务端时所绑定的本地 IP。 transport.connectServerLocalIP = "0.0.0.0" ## 和 frps 之间的通信协议,可选值为 tcp, kcp, quic, websocket, wss。默认为 tcp。 transport.protocol = "tcp" ## 连接服务端的超时时间,默认为 10s。 transport.dialServerTimeout = 10 ## 和服务端底层 TCP 连接的 keepalive 间隔时间,单位秒。 transport.dialServerKeepalive = 7200 ## 连接池大小。 transport.poolCount = 5 ## 向服务端发送心跳包的间隔时间,默认为 30s。建议启用 tcp_mux_keepalive_interval,将此值设置为 -1。 transport.heartbeatInterval = 30 ## 和服务端心跳的超时时间,默认为 90s。 transport.heartbeatTimeout = 90 ## TCP 多路复用,默认启用。 transport.tcpMux = true ## tcp_mux 的心跳检查间隔时间。 transport.tcpMuxKeepaliveInterval = 60 ## 连接服务端使用的代理地址,格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm。 transport.proxyURL = "http://user:passwd@192.168.1.128:8080" transport.proxyURL = "socks5://user:passwd@192.168.1.128:1080" transport.proxyURL = "ntlm://user:passwd@192.168.1.128:2080" ## QUIC 协议配置参数。 transport.quic.keepalivePeriod = 10 transport.quic.maxIdleTimeout = 30 transport.quic.maxIncomingStreams = 100000 ## 客户端 TLS 协议配置。 ### 是否和服务端之间启用 TLS 连接,默认启用。 transport.tls.enable = true ### 启用 TLS 连接时,不发送 0x17 特殊字节。默认为 true。当配置为 true 时,无法和 vhostHTTPSPort 端口复用。 transport.tls.disableCustomTLSFirstByte = true ### TLS 证书文件路径。 transport.tls.certFile = "client.crt" ### TLS 密钥文件路径。 transport.tls.keyFile = "client.key" ### CA 证书文件路径。 transport.tls.trustedCaFile = "ca.crt" ### TLS Server 名称。 transport.tls.serverName = "example.com" # 指定启用部分代理,当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用。 start = ["ssh", "dns"] # 代理 UDP 服务时支持的最大包长度,默认为 1500,服务端和客户端需要保持配置一致。 udpPacketSize = 1500 # 附加元数据,会传递给服务端插件,提供附加能力。 metadatas.var1 = "abc" metadatas.var2 = "123" # 指定额外的配置文件目录,其中的 proxy 和 visitor 配置会被读取加载。 includes = ["./confd/*.ini"] # 代理配置,不同的代理类型对应不同的配置 ## TCP代理配置 [[proxies]] ### 代理名称。 name = "ssh" ### 代理类型,可选值为 tcp, udp, http, https, tcpmux, stcp, sudp, xtcp。 type = "tcp" ### 被代理的本地服务 IP,默认为 127.0.0.1。 localIP = "127.0.0.1" ### 被代理的本地服务端口。 localPort = 22 ### 服务端绑定的端口,用户访问服务端此端口的流量会被转发到对应的本地服务。若配置为0则或随机分配端口 remotePort = 6001 ### 代理网络层配置。 #### 设置单个 proxy 的带宽限流,单位为 MB 或 KB,0 表示不限制,如果启用,默认会作用于对应的 frpc。 transport.bandwidthLimit = "1MB" #### 限流类型,客户端限流或服务端限流,可选值为 client 和 server,默认为客户端限流。 transport.bandwidthLimitMode = "client" #### 是否启用加密功能,启用后该代理和服务端之间的通信内容都会被加密传输,如果 frpc 启用了全局 TLS,则不需要再启用此参数。 transport.useEncryption = false #### 是否启用压缩功能,启用后该代理和服务端之间的通信内容都会被压缩传输。 transport.useCompression = false ### 负载均衡配置。 #### 负载均衡分组名称,用户请求会以轮询的方式发送给同一个 group 中的代理。 loadBalancer.group = "test_group" #### 负载均衡分组密钥,用于对负载均衡分组进行鉴权,groupKey 相同的代理才会被加入到同一个分组中。 loadBalancer.groupKey = "123456" ### 健康检查配置。 #### 健康检查类型,可选值为 tcp 和 http,配置后启用健康检查功能,tcp 是连接成功则认为服务健康,http 要求接口返回 2xx 的状态码则认为服务健康。 healthCheck.type = "tcp" #### 健康检查超时时间(秒),默认为 3s。 healthCheck.timeoutSeconds = 3 #### 健康检查连续错误次数,连续检查错误多少次认为服务不健康,默认为 1。 healthCheck.maxFailed = 3 #### 健康检查周期(秒),每隔多长时间进行一次健康检查,默认为 10s。 healthCheck.intervalSeconds = 10 ### 附加元数据,会传递给服务端插件,提供附加能力。 metadatas.var1 = "abc" metadatas.var2 = "123" ## UDP代理配置 [[proxies]] name = "dns" type = "udp" localIP = "114.114.114.114" localPort = 53 remotePort = 6002 ## HTTP 配置 [[proxies]] name = "web01" type = "http" localIP = "127.0.0.1" localPort = 80 ### HTTP Basic Auth 用户名。 httpUser = "admin" ### HTTP Basic Auth 密码。 httpPassword = "admin" ### 子域名。 subdomain = "web01" ### 自定义域名列表。 customDomains = ["web01.yourdomain.com"] ### URL 路由配置。 locations = ["/", "/pic"] ### 根据 HTTP Basic Auth user 路由。 routeByHTTPUser = abc ### 替换 Host Header。 hostHeaderRewrite = "example.com" ### 对请求 Header 的操作配置。 #### 在 Header 中设置指定的 KV 值。 requestHeaders.set.x-from-where = "frp" ### 健康检查配置。 healthCheck.type = "http" #### 健康检查的 HTTP 接口,如果健康检查类型是 http,则需要配置此参数,指定发送 http 请求的 path,例如 /health。 healthCheck.path = "/status" healthCheck.intervalSeconds = 10 healthCheck.maxFailed = 3 healthCheck.timeoutSeconds = 3 ## HTTPS 配置 [[proxies]] name = "web02" type = "https" localIP = "127.0.0.1" localPort = 8000 subdomain = "web02" customDomains = ["web02.yourdomain.com"] # 启用 proxy protocol 协议的版本,可选值为 v1 和 v2。如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容。 transport.proxyProtocolVersion = "v2" ## TCPMux 配置 [[proxies]] name = "tcpmuxhttpconnect" type = "tcpmux" multiplexer = "httpconnect" localIP = "127.0.0.1" localPort = 10701 customDomains = ["tunnel1"] # routeByHTTPUser = "user1" [[proxies]] name = "plugin_unix_domain_socket" type = "tcp" remotePort = 6003 # if plugin is defined, localIP and localPort is useless # plugin will handle connections got from frps [proxies.plugin] type = "unix_domain_socket" unixPath = "/var/run/docker.sock" [[proxies]] name = "plugin_http_proxy" type = "tcp" remotePort = 6004 [proxies.plugin] type = "http_proxy" httpUser = "abc" httpPassword = "abc" [[proxies]] name = "plugin_socks5" type = "tcp" remotePort = 6005 [proxies.plugin] type = "socks5" username = "abc" password = "abc" [[proxies]] name = "plugin_static_file" type = "tcp" remotePort = 6006 [proxies.plugin] type = "static_file" localPath = "/var/www/blog" stripPrefix = "static" httpUser = "abc" httpPassword = "abc" [[proxies]] name = "plugin_https2http" type = "https" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "https2http" localAddr = "127.0.0.1:80" crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "plugin_https2https" type = "https" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "https2https" localAddr = "127.0.0.1:443" crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "plugin_http2https" type = "http" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "http2https" localAddr = "127.0.0.1:443" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "secret_tcp" # If the type is secret tcp, remotePort is useless # Who want to connect local port should deploy another frpc with stcp proxy and role is visitor type = "stcp" # secretKey is used for authentication for visitors secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22 # If not empty, only visitors from specified users can connect. # Otherwise, visitors from same user can connect. '*' means allow all users. allowUsers = ["*"] [[proxies]] name = "p2p_tcp" type = "xtcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22 # If not empty, only visitors from specified users can connect. # Otherwise, visitors from same user can connect. '*' means allow all users. allowUsers = ["user1", "user2"] # 访问者配置,不同的访问者类型对应不同的配置 ## STCP 配置 [[visitors]] ### 访问者名称。 name = "secret_tcp_visitor" ### 访问者类型,可选值为 stcp, sudp, xtcp。 type = "stcp" ### 要访问的 proxy 名称。 serverName = "secret_tcp" ### 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端。 secretKey = "abcdefg" ### visitor 监听的本地地址,通过访问监听的地址和端口,连接到远端代理的服务。 bindAddr = "127.0.0.1" ### visitor 监听的本地端口,如果为 -1,表示不需要监听物理端口,通常可以用于作为其他 visitor 的 fallback。 bindPort = 9000 ## XTCP 配置 [[visitors]] name = "p2p_tcp_visitor" type = "xtcp" ### 要访问的 proxy 所属的用户名,如果为空,则默认为当前用户。 serverUser = "user1" serverName = "p2p_tcp" secretKey = "abcdefg" bindAddr = "127.0.0.1" bindPort = 9001 ### 是否保持隧道打开,如果开启,会定期检查隧道状态并尝试保持打开。 keepTunnelOpen = false ### 每小时尝试打开隧道的次数,默认值为 8。 maxRetriesAnHour = 8 ### 重试打开隧道的最小间隔时间,单位: 秒,默认为 90s。 minRetryInterval = 90 ### 回退到的其他 visitor 名称。 fallbackTo = "stcp_visitor" ### 连接建立超过多长时间(ms) 后回退到其他 visitor。 fallbackTimeoutMs = 500
二维码

发表评论