服务端插件

    frp 服务端插件会以单独进程的形式运行,并且监听在一个端口上,对外提供 RPC 接口,响应 frps 的请求。

    frps 在执行某些操作前,会根据配置向服务端插件发送 RPC 请求,根据插件的响应来执行相应的操作。

    服务端插件接收到操作请求后,可以给出三种回应。

    • 拒绝操作,需要返回拒绝操作的原因。
    • 允许操作,不需要修改操作内容。
    • 允许操作,对操作请求进行修改后,返回修改后的内容。

    接口路径可以在 frps 配置中为每个插件单独配置,这里以 为例。

    Request

    Response

    拒绝执行操作

    1. {
    2. "reject": true,
    3. "reject_reason": "invalid user"
    4. }

    允许且内容不需要变动

    1. {
    2. "reject": false,
    3. "unchange": true
    4. }

    允许且需要替换操作内容

    1. {
    2. "unchange": "false",
    3. "content": {
    4. ... // 替换后的操作信息,格式必须和请求时的一致
    5. }
    6. }

    目前插件支持管理的操作类型有 LoginNewProxyCloseProxyPingNewWorkConnNewUserConn

    用户登录操作信息

    NewProxy

    创建代理的相关信息

    1. {
    2. "content": {
    3. "user": {
    4. "user": <string>,
    5. "metas": map<string>string
    6. "run_id": <string>
    7. },
    8. "proxy_name": <string>,
    9. "proxy_type": <string>,
    10. "use_encryption": <bool>,
    11. "use_compression": <bool>,
    12. "group": <string>,
    13. // tcp and udp only
    14. "remote_port": <int>,
    15. // http and https only
    16. "custom_domains": []<string>,
    17. "locations": <string>,
    18. "http_user": <string>,
    19. "http_pwd": <string>,
    20. "host_header_rewrite": <string>,
    21. "headers": map<string>string,
    22. // stcp only
    23. "sk": <string>,
    24. // tcpmux only
    25. "multiplexer": <string>
    26. "metas": map<string>string
    27. }
    28. }

    注意: 当单个 frpc 会注册大量 proxy 时,慎重使用此接口,可能会由于连接数超限而影响服务的可用性。

    1. {
    2. "content": {
    3. "user": {
    4. "user": <string>,
    5. "metas": map<string>string
    6. "run_id": <string>
    7. },
    8. "proxy_name": <string>
    9. }
    10. }

    Ping

    心跳相关信息

    1. {
    2. "content": {
    3. "user": {
    4. "user": <string>,
    5. "metas": map<string>string
    6. "run_id": <string>
    7. },
    8. "timestamp": <int64>,
    9. }
    10. }

    创建工作连接

    NewUserConn

    创建用户连接 (支持 tcpstcphttps 和 协议)。

    1. {
    2. "content": {
    3. "user": {
    4. "user": <string>,
    5. "metas": map<string>string
    6. "run_id": <string>
    7. },
    8. "proxy_name": <string>,
    9. "proxy_type": <string>,
    10. "remote_addr": <string>
    11. }
    12. }
    1. [common]
    2. bind_port = 7000
    3. [plugin.user-manager]
    4. addr = 127.0.0.1:9000
    5. path = /handler
    6. ops = Login
    7. [plugin.port-manager]
    8. addr = https://127.0.0.1:9001
    9. path = /handler
    10. ops = NewProxy
    11. tls_verify = true

    addr: 插件监听的网络地址,支持 HTTP 和 HTTPS,默认为 HTTP。 path: 插件监听的请求路径。 ops: 插件需要处理的操作列表,多个 op 以英文逗号分隔。 tls_verify: 如果是 HTTPS 协议,支持忽略 TLS 身份验证。

    为了减少 frps 的代码修改,同时提高管理插件的扩展能力,在 frpc 的配置文件中引入自定义元数据的概念。元数据会在调用 RPC 请求时发送给插件。

    1. # frpc.ini
    2. [common]
    3. server_addr = 127.0.0.1
    4. server_port = 7000
    5. user = fake
    6. meta_token = fake
    7. meta_version = 1.0.0
    8. [ssh]
    9. type = tcp
    10. local_port = 22
    11. meta_id = 123