Reading view

There are new articles available, click to refresh the page.

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

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

❌