菜单

功能扩展

相关源文件

本文档介绍了 FRP 中可用的扩展功能和插件系统,这些系统增强了其超出基本代理功能的能力。功能扩展使 FRP 能够转换流量、提供静态内容、实现高级身份验证机制以及在客户端之间建立虚拟网络连接。有关基本代理配置的信息,请参阅 代理类型

概述

FRP 提供了两种主要的扩展功能机制:

  1. 插件系统:一个模块化框架,能够为代理添加额外功能,例如 HTTP 身份验证、SOCKS5 代理和静态文件服务。
  2. 功能开关:一种引入的机制,用于在实验性功能普遍可用之前控制其可用性。

插件系统

插件系统允许 FRP 客户端在转发连接之前通过各种处理程序来处理连接。这使得转换、身份验证和其他高级行为成为可能。

插件架构

FRP 的插件系统由插件创建者注册表、插件接口以及各种插件的具体实现组成。每个插件都实现了 pkg/plugin/client/plugin.go66-71 接口,该接口要求

  • 一个名为 Name() 的方法,该方法返回插件类型标识符
  • 一个名为 Handle() 的方法,该方法处理传入的连接
  • 一个名为 Close() 的方法,用于在插件停止时进行清理

插件通过 Register() 函数 pkg/plugin/client/plugin.go41-46 进行注册,并通过 Create() 函数 pkg/plugin/client/plugin.go48-55 创建。

来源:pkg/plugin/client/plugin.go

可用插件

FRP 包含以下内置插件:

插件类型描述配置键源文件
HTTP 代理提供具有可选身份验证的 HTTP 代理功能http_proxypkg/plugin/client/http_proxy.go
SOCKS5实现 SOCKS5 代理协议socks5pkg/plugin/client/socks5.go
静态文件通过 HTTP 提供静态文件static_filepkg/plugin/client/static_file.go
Unix 域套接字将流量转发到 Unix 套接字unix_domain_socketpkg/plugin/client/unix_domain_socket.go
HTTP 转 HTTPS将 HTTP 请求转换为 HTTPShttp_to_httpspkg/plugin/client/http2https.go
HTTPS 转 HTTP将 HTTPS 请求转换为 HTTPhttps_to_httppkg/plugin/client/https2http.go
HTTPS 转 HTTPS带有证书处理的 HTTPS 代理https_to_httpspkg/plugin/client/https2https.go

来源:pkg/plugin/client/http_proxy.go, pkg/plugin/client/socks5.go, pkg/plugin/client/static_file.go, pkg/plugin/client/unix_domain_socket.go, pkg/plugin/client/http2https.go, pkg/plugin/client/https2http.go, pkg/plugin/client/https2https.go

插件配置

插件在客户端配置文件中进行配置。每个代理都可以指定一个插件及其选项。这是插件配置的一般结构:

[plugin_section_name]
type = "plugin_type"
# Plugin-specific options

例如,配置一个静态文件插件:

[web]
type = "tcp"
local_port = 80
remote_port = 8080
plugin = "static_file"
plugin_local_path = "/var/www/html"
plugin_strip_prefix = "static"
plugin_http_user = "admin"
plugin_http_passwd = "admin"

每个插件都有自己的特定配置选项,可以使用带 plugin_ 前缀的参数进行设置。

功能门控

功能开关提供了一种机制,可以在实验性功能普遍可用之前启用或禁用它们。这允许用户在将新功能与稳定功能集分开的同时对其进行测试。

功能开关架构

功能开关在配置文件中定义为功能名称到布尔值(启用/禁用)的映射。系统会检查此映射以确定运行时是否应提供特定的实验性功能。

来源:Release.md

配置功能开关

功能开关在 FRP 配置文件中的 featureGates 映射下进行配置。

[common]
# Other configuration options...
featureGates = {
    "VirtualNet" = true
}

将功能开关设置为 true 会启用实验性功能,而将其设置为 false(或省略它)则会禁用该功能。

VirtualNet 功能

VirtualNet 是一项实验性功能(目前处于 Alpha 阶段),通过创建虚拟网络,实现不同 FRP 客户端之间的第 3 层连接。

VirtualNet 架构

VirtualNet 功能在每个客户端系统上创建一个 TUN 设备,该设备充当虚拟网络接口。这些虚拟接口通过 FRP 服务器连接,允许客户端之间进行直接的第 3 层(IP 级别)通信,即使它们位于 NAT 或防火墙之后。

来源:Release.md

VirtualNet 的要求和限制

  • 需要 root/管理员权限才能创建 TUN 设备
  • 目前支持 Linux 和 macOS
  • 需要启用 VirtualNet 功能开关
  • 作为一项 Alpha 功能,配置详细信息在未来版本中可能会发生变化

配置 VirtualNet

要使用 VirtualNet 功能,您需要:

  1. 启用 VirtualNet 功能开关

    [common]
    featureGates = {
        "VirtualNet" = true
    }
    
  2. 配置虚拟网络部分

    [virtual_net]
    # Virtual network configuration
    
  3. 为需要第 3 层连接的代理设置 virtual_net 插件。

SSH 隧道网关

SSH 隧道网关是一项功能,它允许在目标机器上不直接运行 FRP 客户端软件的情况下建立代理。而是使用 SSH 连接来建立隧道以代理流量。

有关 SSH 隧道网关的更多信息,请参阅 SSH 隧道网关

插件开发

FRP 的插件系统是可扩展的,允许开发人员创建自定义插件来扩展功能。要创建自定义插件:

  1. 实现 Plugin 接口
  2. 使用 Register() 函数注册插件
  3. 创建特定于插件的配置选项

有关开发 FRP 扩展的更多信息,请参阅 开发和测试