菜单

TCP 和 UDP

相关源文件

本文档解释了如何在 frp 中使用和配置 TCP 和 UDP 代理。这些代理类型可以将 TCP 和 UDP 流量从公共网络转发到私有网络中运行的服务,这是 frp 的核心功能。

有关 HTTP 和 HTTPS 代理的信息,请参阅HTTP 和 HTTPS。有关安全 TCP 隧道选项,请参阅STCP 和 XTCP

概述

TCP 和 UDP 代理是 frp 中最基本的代理类型,提供直接的端口转发功能。

  • TCP 代理将 TCP 连接从 frps 服务器上的一个端口转发到 frpc 客户端机器上的指定本地端口。
  • UDP 代理将 UDP 数据包从 frps 服务器上的一个端口转发到 frpc 客户端机器上的指定本地端口。

这些代理允许运行在 NAT 或防火墙后面的服务通过具有公共 IP 地址的服务器从公共互联网访问。

TCP/UDP 代理架构

Sources: server/proxy/tcp.go27-96 server/proxy/udp.go37-246

配置

基本 TCP 代理配置

在 frpc 配置文件中设置 TCP 代理:

此配置将 frps 服务器上端口 6000 的连接转发到 frpc 客户端机器上的端口 22 (SSH)。

基本 UDP 代理配置

在 frpc 配置文件中设置 UDP 代理:

此配置将发送到 frps 服务器端口 6001 的 UDP 数据包转发到 frpc 客户端机器上的端口 53 (DNS)。

随机端口分配

如果将 remotePort = 0,frps 将动态分配一个随机可用端口。

分配的端口将报告给客户端,可以在日志或仪表盘中查看。

Sources: conf/frpc_full_example.toml148-193 pkg/config/v1/proxy.go253-289

高级特性

加密和压缩

TCP 和 UDP 代理都支持流量加密和压缩。

启用后

  • useEncryption: 使用客户端配置中指定的 token 加密 frps 和 frpc 之间的流量。
  • useCompression: 压缩流量以减少带宽使用。

Sources: client/proxy/proxy.go151-164 server/proxy/proxy.go241-253

带宽限制

可以限制代理使用的带宽。

  • bandwidthLimit: 指定带宽限制(例如,“1MB”、“500KB”)
  • bandwidthLimitMode: 应用限制的位置,可以是“client”(默认)或“server”

Sources: pkg/config/v1/proxy.go31-50 client/proxy/proxy.go64-70 server/proxy/proxy.go289-292

负载均衡

TCP 代理可以分组以实现负载均衡。

到端口 6000 的连接将分配到“web_servers”组中的所有代理。

Sources: pkg/config/v1/proxy.go52-60 server/proxy/tcp.go52-65

健康检查

健康检查可以确保流量只发送到正常运行的服务。

  • type: “tcp”(检查是否可以建立连接)
  • timeoutSeconds: 健康检查尝试的超时时间
  • maxFailed: 移除代理前的连续失败次数
  • intervalSeconds: 健康检查之间的时间间隔

Sources: pkg/config/v1/proxy.go73-103

内部工作原理

TCP 代理实现

TCP 连接流程

TCP 代理过程:

  1. 当用户连接到 frps 上的远程端口时,frps 接受连接。
  2. frps 通过控制连接向 frpc 请求一个工作连接。
  3. frpc 与 frps 建立一个工作连接。
  4. frps 通过工作连接将用户的连接转发到 frpc。
  5. frpc 连接到本地服务并连接这两个连接。
  6. 数据在用户和本地服务之间双向流动。

Sources: server/proxy/tcp.go49-89 server/proxy/proxy.go175-209 server/proxy/proxy.go211-272

UDP 代理实现

UDP 数据包处理

UDP 代理过程:

  1. frps 在指定的远程端口上创建 UDP 监听器。
  2. 当收到数据包时,它被放入一个通道。
  3. frpc 与 frps 建立一个工作连接。
  4. UDP 数据包被封装在 UDPPacket 消息中,通过工作连接进行传输。
  5. frpc 将数据包转发到本地 UDP 服务。
  6. 响应数据包遵循反向路径。
  7. 心跳消息维护工作连接。

UDP 代理更复杂,因为 UDP 是无连接的,需要管理数据包转发并为不同的客户端端点维护状态。

Sources: server/proxy/udp.go78-246 server/proxy/udp.go107-152

实现细节

代理注册和工厂模式

TCP 和 UDP 代理都使用工厂模式创建。

注册过程

  1. 代理类型在初始化期间注册其工厂函数。
  2. 当加载新的代理配置时,会根据类型查找相应的工厂。
  3. 工厂创建并返回专门的代理实现。

Sources: server/proxy/proxy.go41-45 server/proxy/tcp.go26-28 server/proxy/udp.go37-39

工作连接管理

工作连接是 frps 和 frpc 之间的数据隧道。

  1. frps 为每个代理维护一个工作连接池。
  2. 当用户连接到达时,frps 从连接池中获取一个工作连接。
  3. 如果连接池为空,它会向 frpc 请求一个新的工作连接。
  4. 工作连接携带有关源和目标地址的元数据。
  5. 对于 UDP 代理,单个工作连接处理来自多个客户端的数据包。

Sources: server/proxy/proxy.go121-173 client/proxy/proxy.go127-134

最佳实践和注意事项

  1. 安全考量:

    • 为敏感流量启用加密。
    • 使用带宽限制防止滥用。
    • 考虑使用STCP 或 XTCP 以实现更安全的代理。
  2. 性能优化:

    • 对高延迟、低带宽连接使用压缩。
    • 调整 transport.poolCount 以预先建立工作连接。
    • 对于对延迟敏感的 UDP 应用程序,请确保 udpPacketSize 设置得当。
  3. 可靠性:

    • 使用健康检查来确保流量只发送到正常运行的服务。
    • 为高可用性服务设置负载均衡。
  4. UDP 限制:

    • 由于数据包封装,UDP 代理开销更高。
    • 某些对时间有严格要求的应用程序可能会遇到问题。
    • 最大 UDP 数据包大小由 udpPacketSize 设置控制(默认:1500 字节)。

Sources: conf/frpc_full_example.toml127-130 client/proxy/proxy.go151-164

结论

TCP 和 UDP 代理构成了 frp 端口转发功能的基础。它们提供了一种直接的方式将本地服务暴露给互联网,并在需要时提供加密、压缩和负载均衡等高级功能。

对于更复杂的用例,您可能需要探索: