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

frp 可能自己二开吗?

  •  
  •   dzdh · 2024-02-04 09:52:23 +08:00 · 2371 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    难度大么

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

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

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

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

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

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

    我只是简单的应用。

    这样看可以不可以。

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

    nodejs 连接,发送 token+\n

    这样逻辑上应该是 ok 的吧
    yplam
        16
    yplam  
       2024-02-05 11:43:34 +08:00
    @dzdh socks5 协议跟这个差别不大吧,不懂为何还要自定义认证。

    另外,如果业务上只需要简单的 TCP 转发感觉也没必要上 frp ,直接在 yamux 上面加上自己的认证逻辑可能更简单
    dzdh
        17
    dzdh  
    OP
       2024-02-05 11:52:17 +08:00
    @yplam #16

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

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

    abc : 10000
    ccc : 10001
    eee : 10002

    socks 代理运行在客户端。

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

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

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