菜单

插件系统

相关源文件

目的与范围

本页面介绍了frp中的插件系统,该系统允许通过自定义插件扩展frp代理的功能。插件系统提供了一个框架,可以在不修改核心代码库的情况下为客户端和服务器端组件添加附加功能。本文档涵盖了插件系统的架构、可用的插件类型以及插件如何集成到代理工作流程中。

概述

frp插件系统使开发人员能够通过HTTP身份验证、协议转换、静态文件服务等功能来增强代理功能。插件通过在连接转发到目标服务之前拦截和处理来自客户端的连接来工作。

来源

客户端插件架构

客户端插件在连接转发到目标服务之前拦截并处理它们。这些插件实现了Plugin接口,并向注册表注册。

来源

插件注册

插件使用Register函数进行注册,该函数将插件名称与创建者函数关联起来。插件注册表维护着这些创建者函数的映射,以便按需实例化插件。

当代理需要插件时,它会调用Create函数,并传入插件名称、上下文和选项。注册表会查找相应的创建者函数并实例化插件。

来源

插件接口

所有客户端插件都实现了以下接口

  • Name() - 返回插件的名称
  • Handle() - 处理连接
  • Close() - 在不再需要插件时释放资源

来源

服务器端插件架构

服务器端插件为frp服务器执行的各种操作提供钩子,例如登录、创建新代理或关闭代理。

来源

支持的操作

服务器端插件可以为以下操作实现处理程序

操作描述
登录当客户端连接到服务器时调用
NewProxy当客户端请求创建新代理时调用
CloseProxy当客户端关闭代理时调用
Ping在健康检查ping期间调用
NewWorkConn建立新工作连接时调用
NewUserConn用户连接到代理时调用

来源

插件与代理系统的集成

插件通过ProxyManagerWrapper组件集成到代理系统中,这些组件管理着代理及其关联插件的生命周期。

来源

ProxyManager

ProxyManager负责

  1. 创建和管理代理包装器
  2. 处理工作连接
  3. 更新代理配置
  4. 管理代理生命周期

来源

ProxyWrapper

The ProxyWrapper wraps an underlying proxy and

  1. Monitors the proxy's health
  2. Manages the proxy's status (new, waiting, running, etc.)
  3. Handles incoming work connections
  4. Integrates with plugins through the proxy system

来源

可用的客户端插件

frp包含几个内置的客户端插件

插件描述配置
http_proxy支持身份验证的HTTP代理HTTPUser, HTTPPassword
socks5支持身份验证的SOCKS5代理Username, Password
static_file提供静态文件LocalPath, StripPrefix, HTTPUser, HTTPPassword
http2https将HTTP连接转换为HTTPS连接LocalAddr, HostHeaderRewrite
https2http将HTTPS连接转换为HTTP连接LocalAddr, HostHeaderRewrite, CrtPath, KeyPath
https2https带有可自定义证书的HTTPS代理LocalAddr, HostHeaderRewrite, CrtPath, KeyPath
unix_domain_socket转发到unix域套接字UnixPath

来源

示例:HTTP2HTTPS插件

HTTP2HTTPS插件将入站HTTP请求转换为HTTPS。以下是它的工作原理:

  1. 创建一个反向代理,该代理
    • 将入站HTTP请求转发到HTTPS后端
    • 保留转发头(X-Forwarded-For等)
    • 支持头重写
  2. 通过将连接传递给代理监听器来处理入站连接
  3. HTTP服务器通过反向代理处理请求

来源

服务器端插件

服务器端插件通常是基于HTTP的,并实现服务器Plugin接口

服务器包含一个HTTP插件实现,该插件为每个操作向配置的端点发出HTTP请求。

来源

插件管理器

服务器的Manager会注册插件并将操作请求路由到相应的插件。

对于每个操作,管理器都会遍历支持该操作的已注册插件,并调用它们的Handle方法。

来源

插件工作流程

来源

结论

frp插件系统为客户端和服务器组件添加功能提供了一个灵活且可扩展的框架。通过实现适当的接口,开发人员可以创建自定义插件来增强frp的功能,例如身份验证、协议转换或内容转换。

有关功能扩展的更多信息,请参阅功能门和虚拟网络SSH隧道网关