本页面介绍了frp中的插件系统,该系统允许通过自定义插件扩展frp代理的功能。插件系统提供了一个框架,可以在不修改核心代码库的情况下为客户端和服务器端组件添加附加功能。本文档涵盖了插件系统的架构、可用的插件类型以及插件如何集成到代理工作流程中。
frp插件系统使开发人员能够通过HTTP身份验证、协议转换、静态文件服务等功能来增强代理功能。插件通过在连接转发到目标服务之前拦截和处理来自客户端的连接来工作。
来源
客户端插件在连接转发到目标服务之前拦截并处理它们。这些插件实现了Plugin接口,并向注册表注册。
来源
插件使用Register函数进行注册,该函数将插件名称与创建者函数关联起来。插件注册表维护着这些创建者函数的映射,以便按需实例化插件。
当代理需要插件时,它会调用Create函数,并传入插件名称、上下文和选项。注册表会查找相应的创建者函数并实例化插件。
来源
所有客户端插件都实现了以下接口
Name() - 返回插件的名称Handle() - 处理连接Close() - 在不再需要插件时释放资源来源
服务器端插件为frp服务器执行的各种操作提供钩子,例如登录、创建新代理或关闭代理。
来源
服务器端插件可以为以下操作实现处理程序
| 操作 | 描述 |
|---|---|
| 登录 | 当客户端连接到服务器时调用 |
| NewProxy | 当客户端请求创建新代理时调用 |
| CloseProxy | 当客户端关闭代理时调用 |
| Ping | 在健康检查ping期间调用 |
| NewWorkConn | 建立新工作连接时调用 |
| NewUserConn | 用户连接到代理时调用 |
来源
插件通过ProxyManager和Wrapper组件集成到代理系统中,这些组件管理着代理及其关联插件的生命周期。
来源
ProxyManager负责
来源
The ProxyWrapper wraps an underlying proxy and
来源
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插件将入站HTTP请求转换为HTTPS。以下是它的工作原理:
来源
服务器端插件通常是基于HTTP的,并实现服务器Plugin接口
服务器包含一个HTTP插件实现,该插件为每个操作向配置的端点发出HTTP请求。
来源
服务器的Manager会注册插件并将操作请求路由到相应的插件。
对于每个操作,管理器都会遍历支持该操作的已注册插件,并调用它们的Handle方法。
来源
来源
frp插件系统为客户端和服务器组件添加功能提供了一个灵活且可扩展的框架。通过实现适当的接口,开发人员可以创建自定义插件来增强frp的功能,例如身份验证、协议转换或内容转换。