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

2025 年 10 月 31 日
 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

5385 次点击
所在节点    宽带症候群
24 条回复
emma3
2025 年 11 月 2 日
如果单纯是中介角色的中间服务器,只是为了让双方互相握手交换密钥鉴权等等功能,并非为了转发流量的,可否设计成 serverless 模式?方便部署于 cloudflare 的 workers 、pages 等平台,通过自定义域名使用。
devtiange
2025 年 11 月 3 日
妙
bt7vip
2025 年 12 月 14 日
已经尝试了打洞 wiregurd 组网和打洞组隧道,很方便,op 有没有计划写个多平台的 UI 工具
le4tim
2025 年 12 月 15 日
@bt7vip 暂时没计划,ui 没经验所以没精力搞

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

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

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

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

© 2021 V2EX