内网穿透工具 Frp 配置文件示例(中文翻译版)

若有错误,恳请指正
cicii翻译于2024年5月19日
GitHub - fatedier/frp

服务端配置文件 frps.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
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
# frps.toml
# 此配置文件仅供参考。请不要直接使用此配置来运行程序,因为它可能存在各种问题。

# 必须包含IPv6的文本地址或主机名在方括号中,例如 [::1]:80 、 [IPv6-host]:http 或 [IPv6-host%zone]:80 。对于单个 bindAddr 字段,不需要方括号,例如 bindAddr = "::" 。
bindAddr = "0.0.0.0"
bindPort = 7000

# 用于KCP协议的UDP端口,它可以与 bindPort 相同。如果未设置,则在frp中禁用KCP协议。
kcpBindPort = 7000

# 用于QUIC协议的UDP端口。如果未设置,则QUIC将在frp中禁用。
# quicBindPort = 7002

# 指定代理将监听的地址,默认值与 bindAddr 相同。
# proxyBindAddr = "127.0.0.1"

# QUIC协议选项
# transport.quic.keepalivePeriod = 10
# transport.quic.maxIdleTimeout = 30
# transport.quic.maxIncomingStreams = 100000

# 心跳配置,不建议修改默认值, heartbeatTimeout 的默认值为90,设置负值以禁用它。
# transport.heartbeatTimeout = 90

# 每个代理中的池计数将保留不超过 maxPoolCount 。
transport.maxPoolCount = 5

# 如果使用TCP多路复用技术,则默认值为 true 。
# transport.tcpMux = true

# 指定TCP多路复用的保活间隔,仅当 tcpMux 为 true 时才有效。
# transport.tcpMuxKeepaliveInterval = 60

# tcpKeepalive 指定frpc和frps之间活动网络连接的保活探测器之间的间隔。如果为负数,则禁用保活探测器。
# transport.tcpKeepalive = 7200

# transport.tls.force 指定是否仅接受TLS加密的连接。默认情况下,该值为 false 。
transport.tls.force = false

# transport.tls.certFile = "server.crt"
# transport.tls.keyFile = "server.key"
# transport.tls.trustedCaFile = "ca.crt"

# 如果要支持虚拟主机,则必须设置用于监听的HTTP端口(可选)。注意:HTTP端口和HTTPS端口可以和 bindPort 一样。
vhostHTTPPort = 80
vhostHTTPSPort = 443

# vhostHTTP服务器的响应标头超时(秒),默认为60秒。
# vhostHTTPTimeout = 60

# tcpmuxHTTPConnectPort 指定服务器监听HTTP连接请求的TCP端口。
# 如果该值为0,则服务器不会在一个端口上TCP多路复用请求。
# 如果该值不为0,它将监听HTTP连接请求的TCP端口。默认情况下,此值为0。
# tcpmuxHTTPConnectPort = 1337

# 如果 tcpmuxPassthrough 为 true ,则frps不会对流量进行任何更新。
# tcpmuxPassthrough = false

# 配置Web服务器以启用frps仪表板。仪表板仅当设置了 webServer.port 时才可用。
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"

# webServer.tls.certFile = "server.crt"
# webServer.tls.keyFile = "server.key"

# 仪表板资产目录(仅适用于调试模式)
# webServer.assetsDir = "./static"

# 在仪表板监听器中启用golang pprof处理程序。必须先设置仪表板端口。
webServer.pprofEnable = false

# enablePrometheus 将在 /metrics api 中导出 webServer 上的 prometheus 指标。
enablePrometheus = true

# 控制台或实际日志文件路径,如 ./frps.log 。
log.to = "./frps.log"

# 跟踪、调试、信息、警告、错误
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3

# log.to 为控制台时是否禁用日志颜色,默认为 false 。
log.disablePrintColor = false

# DetailedErrorsToClient 定义是否将特定错误(带有调试信息)发送到frpc。默认情况下,此值为 true 。
detailedErrorsToClient = true

# auth.method 指定使用哪种认证方式对frpc与frps之间进行认证。
# 如果指定了 token ,令牌将被读入登录消息中。
# 如果指定了 oidc ,将使用OIDC设置颁发OIDC令牌。默认情况下,此值为 token 。
auth.method = "token"

# auth.additionalScopes 指定包含其他范围的身份验证信息,可选值为 HeartBeats 、 NewWorkConns 。
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# 身份验证令牌
auth.token = "12345678"

# OIDC颁发者指定用于验证OIDC令牌的颁发者。
auth.oidc.issuer = ""
# oidc audience 指定验证时OIDC令牌应包含的受众。
auth.oidc.audience = ""
# oidc skipExpiryCheck 指定是否跳过检查OIDC令牌是否过期。
auth.oidc.skipExpiryCheck = false
# oidc skipIssuerCheck 指定是否跳过检查OIDC令牌的颁发者声明是否与 OidcIssuer 中指定的颁发者匹配。
auth.oidc.skipIssuerCheck = false

# userConnTimeout 指定等待工作连接的最长时间。
# userConnTimeout = 10

# 只允许frpc绑定你列出的端口。默认情况下,不会有任何限制。
allowPorts = [
{ start = 2000, end = 3000 },
{ single = 3001 },
{ single = 3003 },
{ start = 4000, end = 50000 }
]

# 每个客户端可以使用的最大端口数,默认值为0表示没有限制。
maxPortsPerClient = 0

# 如果 subDomainHost 不为空,则可以在frpc的配置文件中设置 type 为 http 或 https 时的 subdomain 。
# 当子域为 test 时,路由使用的主机为 test.frps.com 。
subDomainHost = "frps.com"

# HTTP请求的自定义404页面。
# custom404Page = "/path/to/404.html"

# 指定UDP数据包大小,单位为字节。如果未设置,则默认值为1500。客户端和服务器之间的参数应该相同。它会影响UDP和SUDP代理。
udpPacketSize = 1500

# NAT打孔分析数据的保留时间。
natholeAnalysisDataReserveHours = 168

# SSH隧道网关
# 如果要启用此功能,则 bindPort 参数是必需的,而其他参数是可选的。
# 默认情况下,此功能处于禁用状态。如果 bindPort 大于0,则启用它。
# sshTunnelGateway.bindPort = 2200
# sshTunnelGateway.privateKeyFile = "/home/frp-user/.ssh/id_rsa"
# sshTunnelGateway.autoGenPrivateKeyPath = ""
# sshTunnelGateway.authorizedKeysFile = "/home/frp-user/.ssh/authorized_keys"

[[httpPlugins]]
name = "user-manager"
addr = "127.0.0.1:9000"
path = "/handler"
ops = ["Login"]

[[httpPlugins]]
name = "port-manager"
addr = "127.0.0.1:9001"
path = "/handler"
ops = ["NewProxy"]

客户端配置文件 frpc.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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# frpc.toml
# 此配置文件仅供参考。请不要直接使用此配置来运行程序,因为它可能存在各种问题。

# 您的代理名称将更改为 {user}.{proxy} 。
user = "your_name"

# 必须包含IPv6的文本地址或主机名在方括号中,例如 [::1]:80 、 [IPv6-host]:http 或 [IPv6-host%zone]:80 。对于单个 serverAddr 字段,不需要方括号,例如 serverAddr = "::" 。
serverAddr = "0.0.0.0"
serverPort = 7000

# STUN服务器帮助穿透NAT孔。
# natHoleStunServer = "stun.easyvoip.com:3478"

# 决定首次登录失败时是否退出程序,否则连续重新登录frps,默认值为 true 。
loginFailExit = true

# 控制台或实际日志文件路径,如 ./frpc.log 。
log.to = "./frpc.log"

# 跟踪、调试、信息、警告、错误
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3

# log.to为控制台时是否禁用日志颜色,默认为 false 。
log.disablePrintColor = false

auth.method = "token"
# auth.additionalScopes 指定包含其他范围的身份验证信息,可选值为 HeartBeats 、 NewWorkConns 。
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# 身份验证令牌
auth.token = "12345678"

# oidc.clientID 指定用于获取OIDC认证令牌的客户端ID。
# auth.oidc.clientID = ""
# oidc.clientSecret 指定用于在OIDC身份验证中获取令牌的客户端密钥。
# auth.oidc.clientSecret = ""
# oidc.audience 指定OIDC身份验证中令牌的受众。
# auth.oidc.audience = ""
# 如果 AuthenticationMethod == "oidc" , oidc.scope 指定令牌在OIDC身份验证中的权限。默认情况下,此值为 "" 。
# auth.oidc.scope = ""
# oidc.tokenEndpointURL 指定实现OIDC Token Endpoint的URL。它将用于获取OIDC令牌。
# auth.oidc.tokenEndpointURL = ""

# oidc.additionalEndpointParams 指定要发送到OIDC Token Endpoint的其他参数。
# 例如,如果要指定 audience 参数,可以设置如下。
# frp会将 audience=<value> 、 var1=<value> 添加到附加参数中。
# auth.oidc.additionalEndpointParams.audience = "https://dev.auth.com/api/v2/"
# auth.oidc.additionalEndpointParams.var1 = "foobar"

# 通过http api设置控制frpc操作的管理员地址,例如重新加载。
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
# 管理员资产目录。默认情况下,这些资产与frpc绑在一起。
# webServer.assetsDir = "./static"

# 在管理员监听器中启用golang pprof处理程序。
webServer.pprofEnable = false

# 拨号到服务器等待连接完成的最长时间。默认值为10秒。
# transport.dialServerTimeout = 10

# dialServerKeepalive 指定frpc和frps之间活动网络连接的保活探测器之间的间隔。如果为负数,则禁用保活探测器。
# transport.dialServerKeepalive = 7200

# 连接会提前建立,默认值为0。
transport.poolCount = 5

# 如果使用TCP多路复用技术,则默认值为 true ,它必须与frps相同
# transport.tcpMux = true

# 指定TCP多路复用的保活间隔,仅当 tcpMux 为 true 时才有效。
# transport.tcpMuxKeepaliveInterval = 60

# 用于连接服务器的通信协议。
# 现在支持TCP、KCP、QUIC、WEBSOCKET和WSS,默认为TCP。
transport.protocol = "tcp"

# 连接服务器时设置客户端绑定IP,默认为空。
# 仅当 protocol = tcp 或 protocol = websocket 时,才会使用该值。
transport.connectServerLocalIP = "0.0.0.0"

# 如果要通过HTTP代理或SOCKS5代理或NTLM代理连接frps, 您可以在此处或在全局环境变量中设置 proxyURL 。它仅在 protocol 为TCP时才有效。
# 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.enable 为 true ,则frpc将通过TLS连接frps。
# 从v0.50.0开始,默认值已更改为 true ,并且默认启用TLS。
transport.tls.enable = true

# transport.tls.certFile = "client.crt"
# transport.tls.keyFile = "client.key"
# transport.tls.trustedCaFile = "ca.crt"
# transport.tls.serverName = "example.com"

# 如果 disableCustomTLSFirstByte 设置为 false , 当启用TLS时,frpc将使用第一个自定义字节与frps建立连接。
# 从v0.50.0开始,默认值已更改为 true ,并且默认禁用第一个自定义字节。
# transport.tls.disableCustomTLSFirstByte = true

# 心跳配置,不建议修改默认值。
# heartbeatInterval 默认值为10, heartbeatTimeout 默认值为90。设置负值以禁用它。
# transport.heartbeatInterval = 30
# transport.heartbeatTimeout = 90

# 指定DNS服务器,frpc将使用它而不是使用默认的。
# dnsServer = "8.8.8.8"

# 你想要启动的代理名称。默认值为空,表示所有代理。
# start = ["ssh", "dns"]

# 指定UDP数据包大小,单位为字节。如果未设置,则默认值为1500。此参数在客户端和服务器之间应相同。它会影响UDP和SUDP代理。
udpPacketSize = 1500

# 客户端的其他 metadatas 。
metadatas.var1 = "abc"
metadatas.var2 = "123"

# 包含其他的代理配置文件。
# includes = ["./confd/*.ini"]

[[proxies]]
# ssh 是唯一的代理名称。如果全局 user 不为空,它将更改为 {user}.{proxy} 如 your_name.ssh 。
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
# 限制此代理的带宽,单位为KB和MB。
transport.bandwidthLimit = "1MB"
# 限制带宽的位置,可以是 client 或 server ,默认为 client 。
transport.bandwidthLimitMode = "client"
# 如果为 true ,则此代理的流量将被加密,默认为 false 。
transport.useEncryption = false
# 如果为 true ,则流量将被压缩。
transport.useCompression = false
# 远程frps上的监听端口
remotePort = 6001
# frps将对同一组中的代理的连接进行负载均衡。
loadBalancer.group = "test_group"
# 组应具有相同的组密钥
loadBalancer.groupKey = "123456"
# 后端服务开启健康检查,现在支持 tcp 和 http 。
# frpc将连接本地服务端口以检测其运行状态。
healthCheck.type = "tcp"
# 健康检查连接超时
healthCheck.timeoutSeconds = 3
# 如果连续失败3次,代理将从frps中移除。
healthCheck.maxFailed = 3
# 每10秒做一次健康检查。
healthCheck.intervalSeconds = 10
# 每个代理的其他 metadatas 。它将被传递给服务器端插件以供使用。
metadatas.var1 = "abc"
metadatas.var2 = "123"
# 你可以通过注解给代理添加一些额外的信息。这些注解会显示在frps仪表盘上。
[proxies.annotations]
key1 = "value1"
"prefix/key2" = "value2"

[[proxies]]
name = "ssh_random"
type = "tcp"
localIP = "192.168.31.100"
localPort = 22
# 如果 remotePort 为0,frps会随机为你分配一个端口。
remotePort = 0

[[proxies]]
name = "dns"
type = "udp"
localIP = "114.114.114.114"
localPort = 53
remotePort = 6002

# 将您的域名解析为 serverAddr 。因此,您可以使用 http://web01.yourdomain.com 浏览Web01和 http://web02.yourdomain.com 浏览Web02。
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
localPort = 80
# httpUser 和 httpPassword 是HTTP协议的安全认证。
# 如果没有设置,你可以在没有证书的情况下访问这个 customDomains 。
httpPassword = "admin"
# 如果给frps设置的域名为frps.com,那么你可以通过URL访问 [web01]代理(http://web01.frps.com)。
subdomain = "web01"
customDomains = ["web01.yourdomain.com"]
# locations 仅适用于HTTP类型。
locations = ["/", "/pic"]
# 如果HTTP基本认证的用户名是abc,则将请求路由到这个服务。
# routeByHTTPUser = abc
hostHeaderRewrite = "example.com"
requestHeaders.set.x-from-where = "frp"
responseHeaders.set.foo = "bar"
healthCheck.type = "http"
#frpc将会向本地的HTTP服务发送一个GET请求,请求的路径是 /status 。
# 当HTTP服务返回 2xx HTTP响应状态码时,它处于活动状态。
healthCheck.path = "/status"
healthCheck.intervalSeconds = 10
healthCheck.maxFailed = 3
healthCheck.timeoutSeconds = 3
# 设置健康检查头
healthCheck.httpHeaders=[
{ name = "x-from-where", value = "frp" }
]

[[proxies]]
name = "web02"
type = "https"
localIP = "127.0.0.1"
localPort = 8000
subdomain = "web02"
customDomains = ["web02.yourdomain.com"]
# 如果不是空的,frpc将使用代理协议将连接信息传输到你的本地服务。
# v1 或 v2 或 "" (空)
transport.proxyProtocolVersion = "v2"

[[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
# 如果定义了插件,则 localIP 和 localPort 是无效的。插件将处理从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"
# 如果类型为 secret tcp ,则 remotePort 无效。
# 想要连接本地端口的人应该使用STCP代理部署另一个frpc,角色是 visitors 。
type = "stcp"
# secretKey 用于访客身份验证。
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 如果不为空,则只有指定用户的访客才能连接。
# 否则,来自同一 user 的 visitors 可以连接。 "*" 表示允许所有用户。
allowUsers = ["*"]

[[proxies]]
name = "p2p_tcp"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 如果不为空,则只有指定用户的访客才能连接。
# 否则,来自同一 user 的 visitors 才可以连接。 "*" 表示允许所有用户。
allowUsers = ["user1", "user2"]

# frpc role visitor -> frps -> frpc role server
[[visitors]]
name = "secret_tcp_visitor"
type = "stcp"
# the server name you want to visitor
serverName = "secret_tcp"
secretKey = "abcdefg"
# 将此地址连接到访客STCP服务器。
bindAddr = "127.0.0.1"
# bindPort 可以小于0,这意味着不要绑定到端口,而只接收从其他访问者重定向的连接。(SUDP现在不支持此功能)
bindPort = 9000

[[visitors]]
name = "p2p_tcp_visitor"
type = "xtcp"
# 如果未设置 serverUser ,则默认为当前用户。
serverUser = "user1"
serverName = "p2p_tcp"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
# bindPort 可以小于0,这意味着不要绑定到端口,而只接收从其他访问者重定向的连接。(SUDP现在不支持此功能)
bindPort = 9001
# 当需要自动隧道持久化时,设置为 true 。
keepTunnelOpen = false
# 当 keepTunnelOpen 设置为 true 时有效,每小时尝试穿孔的次数。
maxRetriesAnHour = 8
minRetryInterval = 90
# fallbackTo = "stcp_visitor"
# fallbackTimeoutMs = 500