frp 可能自己二开吗?

2024-02-04 09:52:23 +08:00
dzdh  dzdh

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

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

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

难度大么

2382 次点击
所在节点   问与答  问与答
17 条回复
ccc008
ccc008
2024-02-04 09:55:43 +08:00
可以二开,frp 本身就开源的
pkxutao
pkxutao
2024-02-04 10:05:44 +08:00
每个端口不同 token 这个不确定是否满足,其他的不就是 frp 基础功能么
dzdh
dzdh
2024-02-04 10:13:13 +08:00
@pkxutao
@ccc008

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

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

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

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

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

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

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

abc : 10000
ccc : 10001
eee : 10002

socks 代理运行在客户端。

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

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

客户端认证完成后通过这个链接把数据发送给本地的 socks 代理。这么个意思。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX