flykey
发布于 2026-01-14 / 2 阅读
0

frp(Fast Reverse Proxy)

产品介绍

frp(Fast Reverse Proxy) 是一款开源的高性能反向代理工具,它允许您在不同网络之间建立安全的通信通道,用于实现端口映射、内网穿透和远程访问等多种网络连接需求。

主要功能

  • 反向代理服务:frp 允许您将外部流量转发到内部网络中的应用程序或服务,使外部用户可以访问您的内部资源,如Web服务器、数据库或其他应用程序。

  • 端口映射:您可以使用 frp 轻松设置端口映射,将外部请求转发到内部设备的特定端口,这对于在不同网络之间共享服务非常有用。

  • 内网穿透:frp 支持内网穿透,使您可以通过公共互联网轻松访问位于受限网络中的设备或服务,无需复杂的网络配置。

  • TCP/UDP 支持:frp 不仅支持 TCP 流量的代理,还支持 UDP 流量,适用于各种应用场景,如在线游戏或实时通信。

  • 安全性:frp 支持使用加密协议来保护数据传输的安全性,如TLS/SSL,以确保通信过程中的数据保密性和完整性。

  • 多用户支持:frp 允许您配置多个用户和权限,以细粒度控制对代理服务的访问权限,增强安全性。

  • 跨平台:frp 可在多个操作系统上运行,包括Linux、Windows和macOS,因此适用于各种不同的环境。

  • 开源和自定义配置:frp 是开源软件,允许您根据特定需求自定义配置,以满足各种使用情况。

  • 活跃的社区支持:frp 有一个积极的开发社区,提供广泛的文档和支持,以帮助用户快速入门和解决问题。

# 此配置文件仅作参考使用。请勿直接使用本配置运行程序,该配置可能存在各类适配问题。

# IPv6 格式的纯地址或主机名必须使用方括号包裹,
# 示例格式:"[::1]:80"、"[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
# 【注】如果是单独的 bindAddr 字段(仅填写地址、不带端口),无需添加方括号,例如 bindAddr = "::" 即可
bindAddr = "0.0.0.0"
bindPort = 7000

# KCP 协议所使用的UDP端口号,该端口可以与 bindPort 配置为同一个值。
# 【注】如果不配置此项,则 frps 中禁用 KCP 协议
kcpBindPort = 7000

# QUIC 协议所使用的UDP端口号。
# 【注】如果不配置此项,则 frps 中禁用 QUIC 协议
# 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

# 每个代理所能维持的最大空闲连接池数量,超出则自动释放
transport.maxPoolCount = 5

# 是否启用 TCP 流多路复用功能,默认值为 true(开启)
# transport.tcpMux = true

# 指定 TCP 多路复用的保活探测时间间隔,
# 【注】该配置仅在 tcpMux 为 true 时生效
# transport.tcpMuxKeepaliveInterval = 60

# tcpKeepalive 配置:frpc 与 frps 之间的活跃网络连接中,TCP保活探测的时间间隔。
# 【注】配置为负数时,禁用TCP保活探测功能
# transport.tcpKeepalive = 7200

# transport.tls.force:是否强制要求 仅接收 TLS 加密的客户端连接。默认值为 false(兼容加密/非加密连接)
transport.tls.force = false

# TLS证书相关配置(自建证书场景,按需启用)
# transport.tls.certFile = "server.crt"  # 服务端证书文件路径
# transport.tls.keyFile = "server.key"   # 服务端密钥文件路径
# transport.tls.trustedCaFile = "ca.crt" # CA根证书,用于验证客户端证书有效性

# 如果需要支持 虚拟主机 功能,必须配置HTTP协议的监听端口(可选配置)
# 【注】HTTP端口、HTTPS端口 可以与 bindPort(主端口)配置为同一个值
vhostHTTPPort = 80
vhostHTTPSPort = 443

# 虚拟主机HTTP服务的请求头超时时间(单位:秒),默认值为60秒
# vhostHTTPTimeout = 60

# tcpmuxHTTPConnectPort:服务端监听 TCP 协议下 HTTP CONNECT 请求的端口。
# 【注】若配置为0,则服务端不会在单个端口上多路复用TCP请求;若配置非0值,则会监听该端口接收HTTP CONNECT请求。默认值为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" # 控制台的HTTPS证书
# webServer.tls.keyFile = "server.key"  # 控制台的HTTPS密钥
# 控制台静态资源目录(仅调试模式下需要配置)
# webServer.assetsDir = "./static"

# 是否在控制台的监听器中启用 Golang 的 pprof 性能分析功能。
# 【前置条件】必须先配置好控制台端口 webServer.port 才能启用
webServer.pprofEnable = false

# enablePrometheus:是否在 Web 服务的 /metrics 接口暴露 Prometheus 监控指标数据,开启后可对接普罗米修斯监控
enablePrometheus = true

# 日志输出位置:填写 console 表示控制台输出,或填写日志文件的路径(例如 ./frps.log)
log.to = "./frps.log"
# 日志级别,可选值:trace(追踪)、debug(调试)、info(信息)、warn(警告)、error(错误)
log.level = "info"
# 日志文件的最大保留天数
log.maxDays = 3
# 当日志输出到控制台时,是否禁用日志的彩色显示,默认值为 false(开启彩色日志)
log.disablePrintColor = false

# DetailedErrorsToClient:是否将详细的错误信息(包含调试内容)返回给 frpc 客户端。默认值为 true
detailedErrorsToClient = true

# auth.method:配置 frps 验证 frpc 客户端身份的认证方式。
# 可选值说明:如果配置为 "token" → 认证信息为配置的token密钥,会写入登录请求报文;
# 如果配置为 "oidc" → 采用 OIDC(开放身份连接)协议签发的令牌进行认证。默认值为 "token"
auth.method = "token"

# auth.additionalScopes:指定需要携带认证信息的额外请求范围。
# 可选值为:HeartBeats(心跳请求)、NewWorkConns(新建网络连接请求)
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# 全局身份认证的token密钥(核心配置),【必须与所有 frpc 客户端配置的 token 完全一致】
auth.token = "12345678"

# OIDC 认证相关配置项
auth.oidc.issuer = ""          # 用于验证 OIDC 令牌有效性的发行方地址
auth.oidc.audience = ""        # 验证时,要求 OIDC 令牌中必须包含的受众标识
auth.oidc.skipExpiryCheck = false  # 是否跳过 OIDC 令牌的过期时间校验,默认false(校验)
auth.oidc.skipIssuerCheck = false  # 是否跳过 OIDC 令牌的发行方与配置的 issuer 一致性校验,默认false(校验)

# userConnTimeout:等待建立业务连接的最长超时时间(单位:秒)
# userConnTimeout = 10

# 【端口白名单】仅允许 frpc 客户端绑定此列表内的端口,默认值为空表示无任何端口限制。
# 支持「端口段」和「单个端口」两种配置方式,按需追加即可
allowPorts = [
  { start = 2000, end = 3000 },  # 允许绑定 2000~3000 区间的所有端口
  { single = 3001 },             # 允许绑定单个端口 3001
  { single = 3003 },             # 允许绑定单个端口 3003
  { start = 4000, end = 50000 }  # 允许绑定 4000~50000 区间的所有端口
]

# 限制每个 frpc 客户端最多可使用的端口数量,默认值为 0 表示无限制
maxPortsPerClient = 0

# 子域名根域名配置:如果该值非空,frpc 客户端在配置 http/https 类型代理时,可配置 subdomain(子域名)参数。
# 【示例】若此处配置为 frps.com,客户端配置的子域名为 test → 最终访问域名就是 test.frps.com
subDomainHost = "frps.com"

# 自定义 HTTP 请求的 404 错误页面路径,访问不存在的代理域名/路径时展示
# custom404Page = "/path/to/404.html"

# 指定 UDP 数据包的最大大小,单位为字节。未配置时默认值为 1500。
# 【重要】该参数 必须在 frps服务端 和 所有frpc客户端 配置为相同值,会影响 udp、sudp 类型的代理
udpPacketSize = 1500

# NAT 穿透策略数据的保留时长(单位:小时),超出时长会自动清理历史穿透数据
natholeAnalysisDataReserveHours = 168

# SSH 隧道网关功能配置
# 【启用条件】如需开启此功能,必须配置 bindPort 端口,其余配置项为可选。
# 默认状态为禁用;当 bindPort 配置为大于0的数值时,自动启用该功能
# sshTunnelGateway.bindPort = 2200               # SSH隧道网关的监听端口
# sshTunnelGateway.privateKeyFile = "/home/frp-user/.ssh/id_rsa"  # 网关的SSH私钥文件路径
# sshTunnelGateway.autoGenPrivateKeyPath = ""    # 自动生成SSH私钥的存储路径
# sshTunnelGateway.authorizedKeysFile = "/home/frp-user/.ssh/authorized_keys" # 网关的SSH授权公钥文件

# ==================== HTTP插件配置段 开始 ====================
[[httpPlugins]]
name = "user-manager"  # 插件名称,自定义唯一标识
addr = "127.0.0.1:9000" # 插件服务的监听地址+端口
path = "/handler"       # 插件的请求处理路径
ops = ["Login"]         # 插件监听的 frps 事件类型,此处为「客户端登录」事件

[[httpPlugins]]
name = "port-manager"
addr = "127.0.0.1:9001"
path = "/handler"
ops = ["NewProxy"]      # 插件监听的事件类型,此处为「客户端新建代理」事件
# 此配置文件仅作参考使用。请勿直接使用本配置运行程序,其可能存在各类问题。

# 你的代理名称最终会被自动改写为 {用户名}.{代理名} 的格式
user = "你的用户名"

# IPv6 格式的纯地址或主机名必须使用方括号包裹,
# 例如 "[::1]:80"、"[ipv6-主机名]:http" 或 "[ipv6-主机名%zone]:80"
# 【注】如果是单独的 serverAddr 字段(仅填写地址、不带端口),则无需添加方括号,例如 serverAddr = "::" 即可
serverAddr = "0.0.0.0"
serverPort = 7000

# 用于实现NAT穿透的STUN服务器地址
# natHoleStunServer = "stun.easyvoip.com:3478"

# 配置首次向frps服务端登录失败时,是否直接退出程序;若设为false,则会持续重试连接frps
# 默认值为 true
loginFailExit = true

# 日志输出位置:填写 console 表示控制台输出,或填写日志文件路径(如 ./frpc.log)
log.to = "./frpc.log"
# 日志级别,可选值:trace(追踪)、debug(调试)、info(信息)、warn(警告)、error(错误)
log.level = "info"
# 日志文件的最大保留天数
log.maxDays = 3
# 当日志输出到控制台时,是否禁用日志的彩色显示,默认值为 false(即开启彩色)
log.disablePrintColor = false

# 身份验证方式,此处配置为 token 认证
auth.method = "token"
# auth.additionalScopes 用于指定需要加入认证信息的额外请求范围。
# 可选值为:HeartBeats(心跳包)、NewWorkConns(新建网络连接)
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# 身份验证的token密钥(需与frps服务端配置的token一致)
auth.token = "12345678"

# OIDC认证相关配置 - 以下均为注释状态,按需启用
# auth.oidc.clientID = ""  # OIDC认证中,用于获取令牌的客户端ID
# auth.oidc.clientSecret = ""  # OIDC认证中,用于获取令牌的客户端密钥
# auth.oidc.audience = ""  # OIDC认证中,令牌的受众标识
# auth.oidc.scope = ""  # 当认证方式为oidc时,令牌的权限范围,默认值为空字符串
# auth.oidc.tokenEndpointURL = ""  # 实现了OIDC令牌端点的请求地址,用于获取OIDC令牌

# auth.oidc.additionalEndpointParams 用于配置发送给OIDC令牌端点的额外请求参数。
# 例如,如需指定"audience"参数,可按如下方式配置:
# frp会自动在请求中追加 "audience=<配置值>" "var1=<配置值>" 这类额外参数
# auth.oidc.additionalEndpointParams.audience = "https://dev.auth.com/api/v2/"
# auth.oidc.additionalEndpointParams.var1 = "foobar"

# 配置管理后台的地址,用于通过HTTP接口控制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

# frpc与frps之间的活跃网络连接中,保活探测的时间间隔
# 若配置为负数,则禁用保活探测功能
# transport.dialServerKeepalive = 7200

# 预建立的空闲连接池数量,默认值为0(不启用连接池)
transport.poolCount = 5

# 是否启用TCP流多路复用功能,默认值为true,【必须与frps服务端的该配置保持一致】
# transport.tcpMux = true

# 配置TCP多路复用的保活探测间隔,仅在tcpMux启用时生效
# transport.tcpMuxKeepaliveInterval = 60

# frpc连接frps服务端所使用的通信协议
# 支持 tcp、kcp、quic、websocket、wss,默认值为 tcp
transport.protocol = "tcp"

# 配置连接服务端时,客户端绑定的本地IP,默认值为空
# 【注】仅当协议为 tcp 或 websocket 时,该配置才会生效
transport.connectServerLocalIP = "0.0.0.0"

# 如需通过HTTP代理、Socks5代理、NTLM代理连接frps服务端,可在此配置代理地址,也可配置为系统全局环境变量
# 【注】该配置仅在通信协议为tcp时生效
# transport.proxyURL = "http://用户名:密码@192.168.1.128:8080"
# transport.proxyURL = "socks5://用户名:密码@192.168.1.128:1080"
# transport.proxyURL = "ntlm://用户名:密码@192.168.1.128:2080"

# QUIC协议专属配置项(注释状态)
# transport.quic.keepalivePeriod = 10
# transport.quic.maxIdleTimeout = 30
# transport.quic.maxIncomingStreams = 100000

# 若设置为true,frpc将通过TLS加密方式连接frps服务端
# 【注】从v0.50.0版本开始,该配置默认值改为true,即默认启用TLS加密
transport.tls.enable = true

# TLS证书相关配置,按需启用(自建证书场景)
# transport.tls.certFile = "client.crt"  # 客户端证书文件路径
# transport.tls.keyFile = "client.key"   # 客户端密钥文件路径
# transport.tls.trustedCaFile = "ca.crt" # CA根证书文件路径,用于验证服务端证书
# transport.tls.serverName = "example.com" # 服务端证书绑定的域名

# 当tls.enable=true时,是否禁用自定义的TLS首字节标识
# 【注】从v0.50.0版本开始,该配置默认值改为true,即默认禁用自定义首字节
# transport.tls.disableCustomTLSFirstByte = true

# 心跳包相关配置,【不建议修改默认值】
# heartbeatInterval(心跳间隔)默认值为10秒,heartbeatTimeout(心跳超时)默认值为90秒。配置为负数则禁用心跳功能
# transport.heartbeatInterval = 30
# transport.heartbeatTimeout = 90

# 指定frpc使用的DNS服务器地址,配置后将不再使用系统默认DNS
# dnsServer = "8.8.8.8"

# 指定需要启动的代理名称列表
# 默认值为空,表示启动配置文件中所有的代理
# start = ["ssh", "dns"]

# 指定UDP数据包的最大大小,单位为字节。未配置时默认值为1500
# 【重要】该参数必须在客户端和服务端配置为相同值,会影响udp、sudp类型的代理
udpPacketSize = 1500

# 为客户端配置的自定义元数据信息(键值对)
metadatas.var1 = "abc"
metadatas.var2 = "123"

# 引入外部的代理配置文件,支持通配符匹配
# includes = ["./confd/*.ini"]

# ==================== 代理规则配置段 开始 ====================
[[proxies]]
# 'ssh' 是该代理的唯一标识名称
# 若全局配置了user(用户名),该代理名将被改写为 {user}.ssh 的格式(如 your_name.ssh)
name = "ssh"
# 代理类型:tcp
type = "tcp"
# 本地服务的IP地址
localIP = "127.0.0.1"
# 本地服务的端口号
localPort = 22
# 为当前代理设置带宽限制,单位支持 KB、MB
transport.bandwidthLimit = "1MB"
# 带宽限制的生效端,可选值为 'client'(客户端限流) 或 'server'(服务端限流),默认值为 'client'
transport.bandwidthLimitMode = "client"
# 是否对当前代理的流量进行加密传输,默认值为 false
transport.useEncryption = false
# 是否对当前代理的流量进行压缩传输,节省带宽
transport.useCompression = false
# frps服务端监听的远程端口(外部访问该端口即映射到本地服务)
remotePort = 6001
# 负载均衡配置:将当前代理加入指定的分组,同分组的代理会被frps做负载均衡转发
loadBalancer.group = "test_group"
# 负载均衡分组密钥,同分组的所有代理必须配置相同的groupKey
loadBalancer.groupKey = "123456"
# 为后端本地服务启用健康检查功能,目前支持 'tcp'、'http' 两种类型
# frpc会主动连接本地服务的端口,检测服务是否存活
healthCheck.type = "tcp"
# 健康检查的连接超时时间,单位:秒
healthCheck.timeoutSeconds = 3
# 连续健康检查失败的最大次数,达到该次数后,frps会将该代理从服务列表中移除
healthCheck.maxFailed = 3
# 健康检查的执行间隔,单位:秒
healthCheck.intervalSeconds = 10
# 为当前代理配置的自定义元数据,会传递给服务端插件使用
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会自动为该代理分配一个随机的可用端口

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

# HTTP代理规则:将你的域名解析到frps的serverAddr,即可通过 http://web01.你的域名.com 访问本地web01服务,http://web02.你的域名.com 访问本地web02服务
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
localPort = 80
# HTTP协议的访问用户名和密码,用于基础的身份验证
# 若不配置,则无需认证即可访问该自定义域名
httpUser = "admin"
httpPassword = "admin"
# 子域名配置:若frps的域名是frps.com,则可通过 http://web01.frps.com 访问该代理
subdomain = "web01"
# 自定义绑定的域名列表,访问这些域名会映射到本地服务
customDomains = ["web01.yourdomain.com"]
# locations 仅对http类型的代理生效,配置需要代理的URL路径
locations = ["/", "/pic"]
# 基于HTTP基础认证的用户路由:仅当访问用户为abc时,才将请求路由到该服务
# routeByHTTPUser = abc
# 重写HTTP请求中的Host请求头为指定值
hostHeaderRewrite = "example.com"
# 自定义添加HTTP请求头
requestHeaders.set.x-from-where = "frp"
# 配置HTTP类型的健康检查
healthCheck.type = "http"
# frpc会向本地HTTP服务发送 GET /status 的请求,判断服务状态
# 当返回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会通过代理协议(Proxy Protocol)将连接信息传递给本地服务
# 可选值:v1、v2,留空则禁用
transport.proxyProtocolVersion = "v2"

[[proxies]]
name = "tcpmuxhttpconnect"
type = "tcpmux"
multiplexer = "httpconnect"
localIP = "127.0.0.1"
localPort = 10701
customDomains = ["tunnel1"]
# routeByHTTPUser = "user1"

# 插件示例:Unix域套接字代理(无需配置localIP/localPort)
[[proxies]]
name = "plugin_unix_domain_socket"
type = "tcp"
remotePort = 6003
# 【注】如果配置了plugin插件,则localIP和localPort配置项会失效
# 插件会直接处理从frps接收到的所有连接请求
[proxies.plugin]
type = "unix_domain_socket"
unixPath = "/var/run/docker.sock"

# 插件示例:HTTP代理服务
[[proxies]]
name = "plugin_http_proxy"
type = "tcp"
remotePort = 6004
[proxies.plugin]
type = "http_proxy"
httpUser = "abc"
httpPassword = "abc"

# 插件示例:Socks5代理服务
[[proxies]]
name = "plugin_socks5"
type = "tcp"
remotePort = 6005
[proxies.plugin]
type = "socks5"
username = "abc"
password = "abc"

# 插件示例:静态文件服务(将本地目录通过frp暴露为HTTP文件服务)
[[proxies]]
name = "plugin_static_file"
type = "tcp"
remotePort = 6006
[proxies.plugin]
type = "static_file"
localPath = "/var/www/blog"  # 本地文件目录路径
stripPrefix = "static"       # 访问时需要剥离的URL前缀
httpUser = "abc"
httpPassword = "abc"

# 插件示例:HTTPS转HTTP(将外部HTTPS请求转为本地HTTP请求)
[[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"

# 插件示例:HTTPS转HTTPS
[[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"

# 插件示例:HTTP转HTTPS
[[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"

# 安全TCP代理(STCP):点对点私密代理,无需暴露公网端口
[[proxies]]
name = "secret_tcp"
# 若类型为stcp(安全TCP),则remotePort配置项无效
# 【注】想要连接该本地端口的用户,必须部署另一个frpc客户端,配置stcp类型的visitor(访问者)角色
type = "stcp"
# 用于访问者身份验证的密钥,访问者需配置相同的secretKey才能连接
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 允许访问的用户列表,留空则仅允许同用户名的访问者连接;配置为"*"表示允许所有用户
allowUsers = ["*"]

# P2P TCP代理(XTCP):基于P2P穿透的直连代理,frps仅做中转协商,数据直连
[[proxies]]
name = "p2p_tcp"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 允许访问的用户列表,留空则仅允许同用户名的访问者连接
allowUsers = ["user1", "user2"]

# ==================== 访问者规则配置段 开始 ====================
# 访问者模式的通信链路:frpc(访问者) -> frps -> frpc(服务端)
[[visitors]]
name = "secret_tcp_visitor"
type = "stcp"
# 要访问的STCP代理服务端的名称(必须与服务端配置的name一致)
serverName = "secret_tcp"
secretKey = "abcdefg"
# 本地绑定的地址,用于接收STCP代理的转发连接
bindAddr = "127.0.0.1"
# 本地绑定的端口,访问该端口即可连接到远端的STCP服务
# 【注】bindPort可以配置为负数,表示不绑定本地端口,仅接收其他访问者的重定向连接(SUDP类型暂不支持)
bindPort = 9000

[[visitors]]
name = "p2p_tcp_visitor"
type = "xtcp"
# 要访问的XTCP代理服务端的用户名,留空则默认使用当前客户端的user配置
serverUser = "user1"
serverName = "p2p_tcp"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 9001
# 如需让隧道保持自动持久化连接,设置为true
keepTunnelOpen = false
# 仅在keepTunnelOpen=true时生效:每小时尝试穿透的最大次数
maxRetriesAnHour = 8
# 重试穿透的最小时间间隔,单位:秒
minRetryInterval = 90
# 穿透失败时的降级策略:降级到指定的访问者代理
# fallbackTo = "stcp_visitor"
# 降级触发的超时时间,单位:毫秒
# fallbackTimeoutMs = 500