本文档介绍了 frp 中的 STCP(Secret TCP)和 XTCP(P2P TCP)代理类型。这些特殊的连接模式能够实现私有服务的暴露以及 frp 客户端之间的点对点通信。
STCP 和 XTCP 的工作方式与标准的 TCP 代理不同。
STCP (Secret TCP):允许 frpc 客户端私有地暴露一个服务,只有拥有正确共享密钥的授权 frpc 访问者才能通过 frps 服务器访问它。
XTCP (P2P TCP):允许 frpc 客户端之间建立直接的点对点连接,数据流在初次连接建立后无需通过 frps 服务器。
这些代理类型特别适用于安全地访问私有服务以及减少 frps 服务器在大量数据传输时的带宽消耗。
图示:STCP 架构
来源:README.md387-427 pkg/config/v1/proxy.go395-416 pkg/config/v1/visitor.go140-144
在 STCP 模式下
图示:XTCP P2P 连接流程
来源:README.md428-473 pkg/config/v1/proxy.go418-439 pkg/config/v1/visitor.go152-176 pkg/nathole/discovery.go15-185
在 XTCP 模式下
要使用 STCP 私有地暴露一个服务,
secretKey 作为访问服务必须提供的密码。
要连接到 STCP 服务,
访问者在 bindAddr:bindPort 创建本地端点,该端点将转发到远程服务。
来源:README.md387-427 conf/frpc_full_example.toml347-358 conf/frpc_full_example.toml378-390
要使用 P2P 模式暴露服务,
配置与 STCP 类似,只需将类型更改为“xtcp”。
要连接到 XTCP 服务,
其他 XTCP 访问者选项
keepTunnelOpen:尝试保持隧道连接的持久性。maxRetriesAnHour:限制每小时的连接尝试次数。minRetryInterval:连接尝试之间的最小等待时间。fallbackTo:如果 P2P 连接失败,则使用名称为 STCP 访问者的名称。fallbackTimeoutMs:在回退到 STCP 之前等待的时间(毫秒)。来源:README.md428-473 conf/frpc_full_example.toml360-368 conf/frpc_full_example.toml390-407 pkg/config/v1/visitor.go154-162
XTCP 依赖 NAT 穿透技术来建立防火墙或 NAT 设备后的客户端之间的直接 P2P 连接。
图示:NAT 打洞过程
来源:pkg/nathole/discovery.go15-185 pkg/nathole/utils.go15-109 cmd/frpc/sub/nathole.go15-97
NAT 穿透涉及以下关键步骤:
外部 IP 发现:两个 frpc 实例都使用 STUN 服务器来发现其外部 IP 地址和端口映射。
NAT 分类:对 NAT 的行为进行分类(完全锥形、受限锥形、端口受限、对称)。
同时连接尝试:双方都尝试连接到对方的外部地址。
回退机制:如果 P2P 连接失败,流量可以通过 frps 使用 STCP 模式进行路由。
frp 使用 STUN(Session Traversal Utilities for NAT)服务器来发现外部 IP 地址。您可以配置自定义的 STUN 服务器。
您也可以使用内置的 frpc 命令测试您的 NAT 穿透能力。
此命令将显示:
来源:cmd/frpc/sub/nathole.go15-97 pkg/nathole/utils.go15-109
STCP 和 XTCP 代理的配置在 config 包中定义。
STCPProxyConfig:包含服务器端配置,如 secretKey 和 allowUsers。XTCPProxyConfig:扩展了类似的功能,并支持 NAT 穿透。来源:pkg/config/v1/proxy.go395-416 pkg/config/v1/proxy.go418-439
同样,访问者配置也已定义。
STCPVisitorConfig:STCP 访问者的基本配置。XTCPVisitorConfig:具有 P2P 选项的扩展配置。来源:pkg/config/v1/visitor.go140-176
NAT 打洞功能实现在 nathole 包中,该包负责:
来源: pkg/nathole/discovery.go15-185 pkg/nathole/utils.go15-109
推荐使用 STCP 的情况
推荐使用 XTCP 的情况
关于 frp 中其他代理类型的更多信息,请参阅
有关代理系统架构的概述,请参阅 代理系统。