本文档解释了如何在 frp 中使用和配置 TCP 和 UDP 代理。这些代理类型可以将 TCP 和 UDP 流量从公共网络转发到私有网络中运行的服务,这是 frp 的核心功能。
有关 HTTP 和 HTTPS 代理的信息,请参阅HTTP 和 HTTPS。有关安全 TCP 隧道选项,请参阅STCP 和 XTCP。
TCP 和 UDP 代理是 frp 中最基本的代理类型,提供直接的端口转发功能。
这些代理允许运行在 NAT 或防火墙后面的服务通过具有公共 IP 地址的服务器从公共互联网访问。
TCP/UDP 代理架构
Sources: server/proxy/tcp.go27-96 server/proxy/udp.go37-246
在 frpc 配置文件中设置 TCP 代理:
此配置将 frps 服务器上端口 6000 的连接转发到 frpc 客户端机器上的端口 22 (SSH)。
在 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 代理过程:
Sources: server/proxy/tcp.go49-89 server/proxy/proxy.go175-209 server/proxy/proxy.go211-272
UDP 数据包处理
UDP 代理过程:
UDPPacket 消息中,通过工作连接进行传输。UDP 代理更复杂,因为 UDP 是无连接的,需要管理数据包转发并为不同的客户端端点维护状态。
Sources: server/proxy/udp.go78-246 server/proxy/udp.go107-152
TCP 和 UDP 代理都使用工厂模式创建。
注册过程
Sources: server/proxy/proxy.go41-45 server/proxy/tcp.go26-28 server/proxy/udp.go37-39
工作连接是 frps 和 frpc 之间的数据隧道。
Sources: server/proxy/proxy.go121-173 client/proxy/proxy.go127-134
安全考量:
性能优化:
transport.poolCount 以预先建立工作连接。udpPacketSize 设置得当。可靠性:
UDP 限制:
udpPacketSize 设置控制(默认:1500 字节)。Sources: conf/frpc_full_example.toml127-130 client/proxy/proxy.go151-164
TCP 和 UDP 代理构成了 frp 端口转发功能的基础。它们提供了一种直接的方式将本地服务暴露给互联网,并在需要时提供加密、压缩和负载均衡等高级功能。
对于更复杂的用例,您可能需要探索: