菜单

STCP 和 XTCP

相关源文件

本文档介绍了 frp 中的 STCP(Secret TCP)和 XTCP(P2P TCP)代理类型。这些特殊的连接模式能够实现私有服务的暴露以及 frp 客户端之间的点对点通信。

概述

STCP 和 XTCP 的工作方式与标准的 TCP 代理不同。

  • STCP (Secret TCP):允许 frpc 客户端私有地暴露一个服务,只有拥有正确共享密钥的授权 frpc 访问者才能通过 frps 服务器访问它。

  • XTCP (P2P TCP):允许 frpc 客户端之间建立直接的点对点连接,数据流在初次连接建立后无需通过 frps 服务器。

这些代理类型特别适用于安全地访问私有服务以及减少 frps 服务器在大量数据传输时的带宽消耗。

架构

STCP 与标准 TCP 代理对比

图示:STCP 架构

来源:README.md387-427 pkg/config/v1/proxy.go395-416 pkg/config/v1/visitor.go140-144

在 STCP 模式下

  1. 一个 frpc 实例(服务器角色)使用唯一的名称和 secretKey 向 frps 注册服务。
  2. 另一个 frpc 实例(访问者角色)连接到 frps,请求访问已命名的服务。
  3. 在建立连接之前会验证 secretKey。
  4. 与标准 TCP 不同,frps 上不暴露 remotePort——该服务仅对经过身份验证的访问者可用。

XTCP P2P 架构

图示:XTCP P2P 连接流程

来源:README.md428-473 pkg/config/v1/proxy.go418-439 pkg/config/v1/visitor.go152-176 pkg/nathole/discovery.go15-185

在 XTCP 模式下

  1. 两个 frpc 实例都向 frps 注册以交换连接信息。
  2. 每个 frpc 使用 STUN 服务器执行 NAT 发现,以确定其外部 IP 和 NAT 类型。
  3. frpc 实例尝试进行 NAT 打洞以建立直接连接。
  4. 如果成功,后续数据将直接在 frpc 实例之间传输,绕过 frps。
  5. 如果 NAT 穿透失败,连接将回退到 STCP 模式(如果已配置)。

配置

STCP 服务器配置

要使用 STCP 私有地暴露一个服务,

secretKey 作为访问服务必须提供的密码。

STCP 访问者配置

要连接到 STCP 服务,

访问者在 bindAddr:bindPort 创建本地端点,该端点将转发到远程服务。

来源:README.md387-427 conf/frpc_full_example.toml347-358 conf/frpc_full_example.toml378-390

XTCP 服务器配置

要使用 P2P 模式暴露服务,

配置与 STCP 类似,只需将类型更改为“xtcp”。

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 穿透

XTCP 依赖 NAT 穿透技术来建立防火墙或 NAT 设备后的客户端之间的直接 P2P 连接。

NAT 发现过程

图示:NAT 打洞过程

来源:pkg/nathole/discovery.go15-185 pkg/nathole/utils.go15-109 cmd/frpc/sub/nathole.go15-97

NAT 打洞

NAT 穿透涉及以下关键步骤:

  1. 外部 IP 发现:两个 frpc 实例都使用 STUN 服务器来发现其外部 IP 地址和端口映射。

  2. NAT 分类:对 NAT 的行为进行分类(完全锥形、受限锥形、端口受限、对称)。

  3. 同时连接尝试:双方都尝试连接到对方的外部地址。

  4. 回退机制:如果 P2P 连接失败,流量可以通过 frps 使用 STCP 模式进行路由。

STUN 服务器配置

frp 使用 STUN(Session Traversal Utilities for NAT)服务器来发现外部 IP 地址。您可以配置自定义的 STUN 服务器。

您也可以使用内置的 frpc 命令测试您的 NAT 穿透能力。

此命令将显示:

  • 您的外部 IP 地址
  • 您的 NAT 类型
  • 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 穿透实现

NAT 打洞功能实现在 nathole 包中,该包负责:

  1. 发现:使用 STUN 服务器查找外部 IP 地址。
  2. 分类:确定 NAT 行为类型。
  3. 通信:在对等方之间编码和解码消息。
  4. 连接管理:处理 UDP 连接和超时。

来源: pkg/nathole/discovery.go15-185 pkg/nathole/utils.go15-109

用例

何时使用 STCP 与 XTCP

推荐使用 STCP 的情况

  • 您需要保证连接的可靠性
  • 您的网络环境 NAT 穿透困难或无法实现
  • 流量量级较低或中等

推荐使用 XTCP 的情况

  • 双方客户端的 NAT 类型兼容
  • 您需要传输大量数据
  • 您希望降低 frps 服务器的负载
  • 最小化延迟很重要

局限性

  • XTCP 可能无法兼容所有 NAT 类型,特别是对称 NAT
  • 某些企业防火墙或运营商级 NAT 可能会阻止 P2P 连接
  • XTCP 需要 STUN 服务器进行 NAT 类型发现
  • 与标准的 TCP 代理相比,IPv6 支持可能有限

关于 frp 中其他代理类型的更多信息,请参阅

有关代理系统架构的概述,请参阅 代理系统