V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dzdh
V2EX  ›  问与答

frp 可能自己二开吗?

  •  
  •   dzdh · 327 天前 · 2316 次点击
    这是一个创建于 327 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务需要,想服务器开放 N 个端口,然后 frp 客户端链接上来,每个客户端单独一个端口,访问服务端的某个端口,等于直接访问某个客户端。

    等于是 s1..SN -> frp server : PORT -> Xclient

    而且客户端要强限制,不能随意链接其他端口,每个端口不同的 token ,可能要查询数据库。

    难度大么

    17 条回复    2024-02-05 11:52:17 +08:00
    ccc008
        1
    ccc008  
       327 天前
    可以二开,frp 本身就开源的
    pkxutao
        2
    pkxutao  
       327 天前
    每个端口不同 token 这个不确定是否满足,其他的不就是 frp 基础功能么
    dzdh
        3
    dzdh  
    OP
       327 天前
    @pkxutao
    @ccc008

    想实现一个进程,根据数据库里的配置,不同的 token 对应不同的端口。

    客户端内钉死服务器的 ip ,双击客户端,GUI 提示输入 token 。根据 token 链接到服务器的某个端口,然后访问服务器的这个端口,就等于是访问客户端。
    yplam
        4
    yplam  
       327 天前
    可以换一种思路实现,本地不存配置文件,客户端 token 请求后端接口生成对应配置,然后就是正常的启动 frp 程序;在服务名称里面加点校验字符串,服务端把不合法的踢掉
    dzdh
        5
    dzdh  
    OP
       327 天前
    @yplam

    客户端本地内嵌个 socks5 代理服务器,绑定本地 10000 端口,然后根据 token 链接上服务器。

    服务器上访问服务器端口,远程连接到本地的 socks5 代理服务器 这个场景应该能实现的吧
    pkxutao
        6
    pkxutao  
       327 天前
    @dzdh 你这个需求我还真思考过,我有另一种实现方案,你现在鉴权放在客户端的 frp 上,但是换一种思路,把鉴权放在服务端去,例如每台设备的 ssh 密码不一样,只能通过服务端获取,服务端来做鉴权,告诉使用的人想要连接的设备密码是多少然后才开始连接
    yplam
        7
    yplam  
       327 天前
    @dzdh 所以你的业务场景是把内网服务通过 socks5 暴露到公网?这种方式实现应该是没问题,不过可能有安全性以及资源问题
    isnullstring
        8
    isnullstring  
       327 天前
    NPS
    exqibao
        9
    exqibao  
       327 天前
    可以试试 rathole ,支持配置热加载,而且就是一个 token 对应服务器一个端口的。
    88WoIdBJtW0N1gEk
        10
    88WoIdBJtW0N1gEk  
       327 天前
    Sharuru
        11
    Sharuru  
       327 天前 via iPhone
    以前做过一个简单版本的,所有配置的 service name 等都是 uuid 随机生成,外面用 C# 套个 GUI ,用户运行时输入一个 key 后请求一串加密内容,解密后就是命令行运行参数,丢给 frp 运行。frp 自己也重新编译过,去掉了一些输出,硬编码一些地址信息。
    MADBOB
        12
    MADBOB  
       327 天前
    我们业务也有这种需求,最后选择了 NPS,仅在客户端配置 key ,每个客户端一个 key ,所有端口转发相关的配置全在服务端配置,有一定的安全性。
    mxT52CRuqR6o5
        13
    mxT52CRuqR6o5  
       327 天前
    有没有可能二开得问你自己啊
    Cola98
        14
    Cola98  
       327 天前
    应该是可以,我目前也有这种需求,大概是想将家里的 k8s 集群对外提供服务,想的是把 frp 对接一个 nginx 网关,然后网关里面集成服务
    dzdh
        15
    dzdh  
    OP
       326 天前
    @yplam #4

    尝试了一下,还是有点难度的。

    我只是简单的应用。

    这样看可以不可以。

    我用 go 写个 server 端,开放个 tcp 监听,每个链接标记 auth 状态,auth:false 的,for read 第一行找到 token ,开放新端口,io.copy 。

    nodejs 连接,发送 token+\n

    这样逻辑上应该是 ok 的吧
    yplam
        16
    yplam  
       326 天前
    @dzdh socks5 协议跟这个差别不大吧,不懂为何还要自定义认证。

    另外,如果业务上只需要简单的 TCP 转发感觉也没必要上 frp ,直接在 yamux 上面加上自己的认证逻辑可能更简单
    dzdh
        17
    dzdh  
    OP
       326 天前
    @yplam #16

    最终目的是通过服务端发送 http 请求 经过客户端的代理。

    客户端由服务端分配好的端口。

    abc : 10000
    ccc : 10001
    eee : 10002

    socks 代理运行在客户端。

    客户端先连接 ip:port 进行 token 认证,拿到是谁并且端口是什么。

    然后服务端开对应端口 然后 协程跑 io.copy 。

    客户端认证完成后通过这个链接把数据发送给本地的 socks 代理。这么个意思。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2090 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.