看到身边挺多人还在用 frp,我真想推荐下我开发的代替品 gonc(点对点,不用服务器中转)

57 天前
 le4tim

我的场景主要是在公司访问家里,或者家里访问公司网络例如 ssh ,RDP ,NAS 这种,想访问的时候就建立点对点通讯,不想依赖 VPS ,也不想使用类似反向代理/端口映射暴露端口到公网 IP 的方式。

然而点对点时 NAT 打洞是肯定要一个中间角色帮忙探测公网地址和交换两边的地址信息的,于是我白嫖了很多个 STUN 公共服务器和公共 mqtt 服务器。

gonc 追求上手简单,零配置,目前设计仅仅点对点之间要约定一个口令(例如 passphrase),接下来假如经常需要远程访问公司内网主机 10.0.0.1:22 ,那么在公司内网内任意主机运行如下命令

gonc -p2p passphrase -socks5server

这时 gonc 会基于 passphrase 专门计算出一个 hash 字符串作为 topic ,保持连接公用的几个免费 mqtt 服务订阅消息(注意 mqtt 服务器是不知道 passphrase 的)。然后 gonc 会一直运行着,但是没有监听任何端口,仅基于 mqtt 订阅消息。

以后任何时候,例如这样在家里使用口令和公司的 gonc 建立一个隧道:

gonc -p2p passphrase -socks5local-port 3080

这时 gonc 基于 passphrase 计算出和公司节点订阅相同的 topic ,连接公用的几个免费 mqtt 服务发布消息,通知公司的 gonc 开始基于 mqtt 交换彼此的地址信息。(口令要足够复杂才安全哦)

接下来两边的 gonc 将通过几个公用的 STUN 服务器并发探测自己的公网地址和端口地址信息,研判 NAT 类型,并基于 mqtt 发布消息交换彼此 NAT 地址信息(交换的消息基于口令加密,mqtt 服务器并不知道口令无法解密),然后两边同时尝试 NAT 打洞建立端到端加密(基于口令派生证书 tls1.3 双向认证)的 socks5 隧道,本地开放 socks5 协议的 3080 端口。

接下来你就可以基于 3080 端口代理访问公司内网任意 ip 端口了。然而,我还研究了可以这样让客户端直接透明接入 3080 代理协议登录公司 10.0.0.1:22 的方法:

ssh root@10.0.0.1-22.gonc.cc -p 3080

如果是连接 10.0.0.2:3389 ,你可以在远程桌面填入

10.0.0.2-3389.gonc.cc:3080

我自己已经用了几个月了,只要不是两端都 NAT4 类型,或者多出口 IP 的网络环境,NAT 穿透的成功率还不错(tcp 或 udp 直通失败时会尝试生日悖论碰撞端口,实践效果真不错),希望能分享给大家。

开源地址 https://github.com/threatexpert/gonc

3541 次点击
所在节点    宽带症候群
24 条回复
aa51513
57 天前
我比较担心安全性问题,安全机制上,大佬帮忙审视一下
le4tim
57 天前
@aa51513 我自己用的工具,整个开发过程都非常重视安全设计,如果这里能提出来存在安全机制的问题,那真是太棒了
perfectlife
57 天前
感觉感觉场景不同,使用 frp 更多是是把内网端口映射到公网上,公司访问家里网络这种场景直接用组网工具了、比如 Zerotier 、Tailscale ,easytier ,星空组网等,更省事。
Ipsum
57 天前
如果能打洞,zt 和 ts 应该是最方便的。毕竟生态完整,全平台都有。
le4tim
57 天前
@Ipsum
@perfectlife
确实是打洞直连的场景问题,这些软件都是在某个访问需求下又希望打洞穿透实现直连。
Zerotier 、Tailscale 场景主要是组网的稳定,有中继保底(应该都有吧?)。
gonc 这个小工具就是 golang 版 netcat ,临时需要就建立个连接,但如果都在内网,netcat 怎么连?希望自己更可控的更方便帮助两边都在内网时建立穿透 NAT 的连接,于是我给 netcat 加入打洞建立连接的功能。
theend233
57 天前
好东西,感谢分享,已 star
Auston
57 天前
如果能自定义中间服务器,就更好了
le4tim
56 天前
@Auston
确实可以,中间服务器涉及的协议都是公开标准的,包括 stun ,mqtt ,中继(标准 socks5 协议,需支持 udp)都可以参数指定,
你说的中间服务器应该是指,例如两边无法打洞,只能中继服务器转发吧?那就是使用 socks5.

https://github.com/threatexpert/gonc?tab=readme-ov-file#%E5%A6%82%E4%BD%95%E9%83%A8%E7%BD%B2%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%80%82%E5%BA%94%E5%AE%9E%E5%9C%A8%E6%97%A0%E6%B3%95p2p%E7%9A%84%E6%9D%A1%E4%BB%B6
s82kd92l
56 天前
很赞,我之前也有发帖讨论过,楼主实现了 https://www.v2ex.com/t/1034441
le4tim
56 天前
@s82kd92l 可能在这里你是最懂我的。
wchluxi
56 天前
好东西,支持楼主
cy18
56 天前
看起来很方便,相比 FRP ,不需要把端口暴露在内网上,用来访问自己的电脑
请教下,用 10.0.0.2-3389.gonc.cc 这个域名访问到对应端口的原理是什么,是否依赖于 gone.cc 的 DNS ?
le4tim
56 天前
@cy18
gonc.cc 这个域名,这种透明代理的方式依赖这个域名,我自己接管 ns 来解析这种格式的域名,
这种域名都会被解析为类似 127.b.c.d 段中 b.c.d 都随机分配的 Fake IP ,由于都是回环地址远程桌面客户端总是会连入本地的 socks5 代理端口 3080 ,然后 gonc 根据连接一端的 Fake IP 127.b.c.d 地址去反解析出域名中的 10.0.0.2-3389 这个信息实现透明代理
itechify
56 天前
好耶,又多一种方式
cccn
56 天前
还没看文档,有个几个疑问
1. 点对点应该不会受公网服务器带宽限制吧。
2. 能否指定自己的 mqtt 或者 STUN 服务器
3. 用 IPV6 会不会有更好的方案。
le4tim
56 天前
@cccn
1. 没有提供中继服务器,用户使用时,穿透成功的后通讯,不存在公网服务器角色,穿透不成功就是无法通讯。
2. 都有命令行参数都可以指定自己的服务器,mqtt 必须两边都设置一样才能交换信息,然而 stun 服务器如果只指定一个,会无法准确研判 nat 类型,建议 3 到 5 个。
3. 目前设计是会优先 ipv6 ,两边 mqtt 交换彼此网络地址后,如果双边都有 ipv6 ,会优先 ipv6 直连,省去打洞,连接成功率更高。
cccn
56 天前
@le4tim good ,star 了
pakro888
56 天前
访问时的 gonc.cc 域名可以自定义吗
10.0.0.2-3389.gonc.cc:3080
le4tim
56 天前
@pakro888 可以,自己买个域名和服务器,运行这个,https://github.com/threatexpert/gonc.cc


这是修改自 sslip.io ,相关细节请自己研究了。
theend233
56 天前
同上,希望可以自定义域名

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

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

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

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

© 2021 V2EX