
我的场景主要是在公司访问家里,或者家里访问公司网络例如 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 [email protected] -p 3080 如果是连接 10.0.0.2:3389 ,你可以在远程桌面填入
10.0.0.2-3389.gonc.cc:3080 我自己已经用了几个月了,只要不是两端都 NAT4 类型,或者多出口 IP 的网络环境,NAT 穿透的成功率还不错(tcp 或 udp 直通失败时会尝试生日悖论碰撞端口,实践效果真不错),希望能分享给大家。
1 aa51513 9 天前 我比较担心安全性问题,安全机制上,大佬帮忙审视一下 |
3 perfectlife 9 天前 感觉感觉场景不同,使用 frp 更多是是把内网端口映射到公网上,公司访问家里网络这种场景直接用组网工具了、比如 Zerotier 、Tailscale ,easytier ,星空组网等,更省事。 |
4 Ipsum 9 天前 如果能打洞,zt 和 ts 应该是最方便的。毕竟生态完整,全平台都有。 |
5 le4tim OP @Ipsum @perfectlife 确实是打洞直连的场景问题,这些软件都是在某个访问需求下又希望打洞穿透实现直连。 Zerotier 、Tailscale 场景主要是组网的稳定,有中继保底(应该都有吧?)。 gonc 这个小工具就是 golang 版 netcat ,临时需要就建立个连接,但如果都在内网,netcat 怎么连?希望自己更可控的更方便帮助两边都在内网时建立穿透 NAT 的连接,于是我给 netcat 加入打洞建立连接的功能。 |
6 theend233 9 天前 好东西,感谢分享,已 star |
7 Auston 9 天前 via Android 如果能自定义中间服务器,就更好了 |
8 le4tim OP @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 |
11 wchluxi 8 天前 via Android 好东西,支持楼主 |
12 cy18 8 天前 看起来很方便,相比 FRP ,不需要把端口暴露在内网上,用来访问自己的电脑 请教下,用 10.0.0.2-3389.gonc.cc 这个域名访问到对应端口的原理是什么,是否依赖于 gone.cc 的 DNS ? |
13 le4tim OP |
14 itechify PRO 好耶,又多一种方式 |
15 cccn 8 天前 还没看文档,有个几个疑问 1. 点对点应该不会受公网服务器带宽限制吧。 2. 能否指定自己的 mqtt 或者 STUN 服务器 3. 用 IPV6 会不会有更好的方案。 |
16 le4tim OP @cccn 1. 没有提供中继服务器,用户使用时,穿透成功的后通讯,不存在公网服务器角色,穿透不成功就是无法通讯。 2. 都有命令行参数都可以指定自己的服务器,mqtt 必须两边都设置一样才能交换信息,然而 stun 服务器如果只指定一个,会无法准确研判 nat 类型,建议 3 到 5 个。 3. 目前设计是会优先 ipv6 ,两边 mqtt 交换彼此网络地址后,如果双边都有 ipv6 ,会优先 ipv6 直连,省去打洞,连接成功率更高。 |
18 pakro888 8 天前 |
19 le4tim OP |
20 theend233 8 天前 同上,希望可以自定义域名 |
21 emma3 7 天前 如果单纯是中介角色的中间服务器,只是为了让双方互相握手交换密钥鉴权等等功能,并非为了转发流量的,可否设计成 serverless 模式?方便部署于 cloudflare 的 workers 、pages 等平台,通过自定义域名使用。 |
22 devtiange 6 天前 妙 |