菜单

架构

相关源文件

本文档描述了 frp (Fast Reverse Proxy) 的架构设计,解释了其组件如何交互以提供 NAT 穿透功能。涵盖了高层架构、通信流程和关键子系统。

有关代理类型详情,请参阅 代理类型。有关配置信息,请参阅 配置

高层架构

frp 遵循客户端-服务器架构模式,包含两个主要组件:frps (服务器) 和 frpc (客户端)。服务器运行在具有公网 IP 地址的机器上,而客户端运行在 NAT 后面的私有网络中。

客户端-服务器架构图

来源: README.md35-37 server/service.go74-128 client/service.go100-134

核心组件

frp 的架构由多个关键组件组成,共同提供反向代理功能。

组件架构图

来源: server/service.go74-128 server/control.go97-167 client/service.go100-134 client/control.go54-81

服务器组件 (frps)

服务器端包含以下关键组件

  1. Service: 主入口点,负责初始化和管理所有其他组件
  2. ControlManager: 管理客户端连接及其生命周期
  3. ProxyManager: 处理代理注册和流量路由
  4. ResourceController: 管理端口和连接等共享资源

来源: server/service.go74-128 server/control.go45-95

客户端组件 (frpc)

客户端包含以下关键组件

  1. Service: 主入口点,负责初始化和管理控制连接
  2. Control: 管理到服务器的控制连接
  3. ProxyManager: 管理本地代理并转发流量
  4. VisitorManager: 处理 P2P 连接和 STCP 访问者

来源: client/service.go100-134 client/control.go54-81

通信流程

客户端和服务器之间的通信通过控制连接和数据连接进行。

通信序列图

来源: client/control.go125-161 server/control.go251-297 client/control.go238-277

连接类型

frp 为不同目的使用了不同类型的连接。

  1. 控制连接: 用于控制消息的持久 TCP/KCP/QUIC/WebSocket 连接
  2. 工作连接: 用于实际数据代理的按需连接
  3. 用户连接: 来自外部用户到服务器的连接

来源: server/service.go222-262 client/control.go225-228

传输协议

frp 支持多种用于控制连接的传输协议:

协议描述配置
TCP默认传输协议默认
KCP基于 UDP,在 UDP 上提供可靠性transport.protocol = "kcp"
QUIC基于 UDP 的多路复用传输transport.protocol = "quic"
WebSocket通过 HTTP 传输使用路径 /~!frp 进行标识
TLS加密传输transport.tls.enable = true

来源: server/service.go239-279 client/service.go246-250

代理系统架构

代理系统是 frp 的核心功能,支持各种网络流量的转发。

代理系统架构图

来源: README.md35-37 server/proxy/proxy.go client/proxy/proxy.go

代理注册流程

  1. 客户端发送带有代理配置的 NewProxy 消息给服务器
  2. 服务器验证配置并创建代理实例
  3. 服务器返回带有成功或错误信息的 NewProxyResp 消息
  4. 成功后,客户端启动本地代理以转发流量

来源: client/control.go163-174 server/control.go370-403 server/control.go456-530

连接管理

连接管理对 frp 的性能和可靠性至关重要。

连接管理图

来源: server/service.go483-542 client/control.go225-228

工作连接池

frp实现了连接池机制来提高性能

  1. 服务器向客户端请求工作连接(ReqWorkConn
  2. 客户端建立并维护一个工作连接池
  3. 当有新的用户连接到达时,服务器从池中获取一个工作连接
  4. 如果池为空,服务器会向客户端请求更多的工作连接

来源: server/control.go251-297 client/control.go125-161

TCP多路复用

TCP多路复用允许多个逻辑连接共享一个物理TCP连接

  1. 使用yamux库进行连接多路复用
  2. 减少连接建立的开销
  3. 可以通过配置启用/禁用

来源: server/service.go516-536 README.md816-824

插件系统

frp包含一个插件系统,允许扩展功能

插件系统图

来源: server/service.go190-195 README.md320-358

启动流程

服务器和客户端有不同的启动流程

服务器启动流程

客户端启动流程

来源: cmd/frps/root.go101-117 cmd/frpc/sub/root.go140-168 server/service.go343-384 client/service.go168-212

安全模型

frp实现了多种安全机制

  1. 身份验证:令牌、OIDC 或其他方法来验证客户端身份
  2. TLS加密:可选的TLS用于保护连接安全
  3. 代理协议:用于保留客户端IP地址
  4. 特定端口允许:限制客户端可用的端口

来源: README.md599-639 README.md655-684

结论

frp的架构设计是模块化、可扩展且安全的。客户端-服务器模型,拥有独立的控制和数据连接,能够实现高效的NAT穿透;代理系统支持多种协议和连接类型;插件系统提供可扩展性;安全机制确保部署的安全性。

来源: README.md35-37 server/service.go client/service.go