V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
le4tim

给 netcat 引入了 P2P 穿透、多路复用、强加密以及内置服务模块,并且完全开源

  •  
  •   le4tim · Jan 8 via Android · 3908 views
    This topic created in 112 days ago, the information mentioned may be changed or developed.

    之前在这发布过的,最近花了些时间给这个小工具写了份比较详细的文档了,请查阅

    文档: https://www.gonc.cc/docs/

    Github: https://github.com/threatexpert/gonc

    自己平时使用的场景:

    1 、公司的 VPN 好久不用了,家里 CGNAT 宽带和公司建立 P2P 的 HTTP+SOCKS5 代理隧道,自由访问公司网络。

    2 、和分公司内网直接 P2P 快速(实时压缩)传输文件/目录。

    3 、内置服务模块满足其他场景,例如 TCP/UDP 端口转发、类 frp 反向代理、甚至科学上网,一个工具都胜任了。

    还真别说,通过打洞建立 P2P 的加密隧道,定期端口轮换的功能本来是针对运营商 Qos 的,在科学上网方面有独特的效果。

    52 replies    2026-04-14 09:02:00 +08:00
    ThirdFlame
        1
    ThirdFlame  
       Jan 8
    已 star 很多思路值得学习
    theend233
        2
    theend233  
       Jan 8
    之前我使用的命令是
    服务端:
    gonc -p2p xxxx -socks5server
    客户端:
    gonc -p2p xxxx -socks5local-port 3080
    客户端访问 10.0.0.1-3389.gonc.cc:3080 就能直接远程桌面

    现在 P2P 连接不再区分“服务端”和“客户端”,双方都是平等的对等端 (Peer)。
    请问我该使用什么命令可以获得同样的效果?
    theend233
        3
    theend233  
       Jan 8
    @theend233 看文档找到了,谢谢
    listenerri
        4
    listenerri  
       Jan 8
    之前找 windows 下的 netcat 时发现了这个项目,感谢 OP 分享开源
    EricYuan1
        5
    EricYuan1  
       Jan 9   ❤️ 1
    你的头像,有点东西…
    cheng6563
        6
    cheng6563  
       Jan 9
    好好好
    能用配置文件配置么
    hzsdr
        7
    hzsdr  
       Jan 9
    gonc -nat-checker 命令显示 failed: <nil>是不是没救了
    le4tim
        8
    le4tim  
    OP
       Jan 9
    @cheng6563 用配置文件多麻烦,一开始就坚持不会设计成需要用配置文件的使用方式。
    le4tim
        9
    le4tim  
    OP
       Jan 9
    @hzsdr 好奇,不知道为什么就一行报错??什么系统环境?
    chouvel
        10
    chouvel  
       Jan 9
    这个太厉害了吧,和 tailscale 有啥区别?
    p2o521
        11
    p2o521  
       Jan 9
    有没有公司电脑访问家里群晖 nas 的教程?小白不知道怎么安装在 DSM 上
    yinmin
        12
    yinmin  
       Jan 9
    @le4tim OP 做一个 docker 版本吧 ;-)
    Valpha6
        13
    Valpha6  
       Jan 9
    受启发了,已素质三连。
    wymam
        14
    wymam  
       Jan 10
    Mark 一下后续研究一下
    maninnet
        15
    maninnet  
       Jan 10
    没搞明白,电脑的远程桌面端口不是 3389 怎么指定?服务器用 gonc -p2p 0rZj85CEjRBABmofzALgUN -linkagent 这种方式启动。
    le4tim
        16
    le4tim  
    OP
       Jan 10
    @maninnet
    假如客户端-link 1080
    目的不是 3389 假如是 4489 ,那连接目标地址:10.0.0.1:4489
    就是
    10.0.0.1-4489.gonc.cc:1080
    maninnet
        17
    maninnet  
       Jan 10
    @le4tim 不行,提示内部错误
    我家里电脑的输出:
    20260110-123313 [:mux] Waiting for linkagent handshake...
    20260110-123313 [:mux] [link] Sending R-Config: none?peer_active=1
    20260110-123313 [:mux] [link] Waiting for Remote ACK...
    20260110-123313 [:mux] [link] Remote ready (OK:none).
    20260110-123313 [:mux] [link-x] Listening on 0.0.0.0:1080 (TProxy=true)
    20260110-123313 [:mux] TProxy Format: 127.1.13.61:1080 -> 1.1:3389
    20260110-123313 [:mux] [link] Local service started.
    20260110-123318 [:mux] New client connected from 127.0.0.1:34870
    20260110-123318 [:mux] TCP: 127.0.0.1:34870->1.132:9172 connecting...
    20260110-123318 [:mux] 127.0.0.1:34870->1.132:9172 failed: ERROR: DNS lookup failed for '1.132' on network 'ip': lookup 1.132: no such host
    20260110-123318 [:mux] Proxy session 127.0.0.1:34870->1.132 (T-CONNECT) finished with error: tunnel TCP connect failed: ERROR: DNS lookup failed for '1.132' on network 'ip': lookup 1.132: no such host

    公司电脑输出
    20260110-123314 [:mux] [linkagent] Session established. OwnerID=
    20260110-123316 [MQTT] Waiting for event on topic: nat-exchange/288b1baf89dc533d across 4 servers
    20260110-123319 [:mux] TCP-Connect: 1.132:9172
    le4tim
        18
    le4tim  
    OP
       Jan 10
    @maninnet TProxy Format: 127.1.13.61:1080 -> 1.1:3389 这个提示似乎说明了你使用了-magicdns ,而且应该参数有问题?
    le4tim
        19
    le4tim  
    OP
       Jan 10
    @maninnet 感谢,我重现了,发现代码有个 bug ,trim 想删掉最后的一个.0 的逻辑错了,结果所有.0 的都删除了,如果是你指定 magicdns 是 10.0.0.0 ,b 和 c 段是.0 就有 bug 。这个 bug 有点傻。。。
    maninnet
        20
    maninnet  
       Jan 10
    @le4tim 是的,原来没开不行,我就开了 magicdns 。。。
    le4tim
        21
    le4tim  
    OP
       Jan 10
    @maninnet 刚修正 bug 发了新版了。但是默认不用-magicdns 不能透明代理的原因我有点好奇,客户端有什么报错吗,如果方便最好是在 github 发 issue
    abolast
        22
    abolast  
       Jan 10
    大雅~已关注,持续窥视代码~
    maninnet
        23
    maninnet  
       Jan 10
    @le4tim github 找不回账号了,注册过不了验证,算了。直接发日志吧,下面就是按你文档操作的日志
    服务端:
    E:\Downloads>gonc -p2p 0rZj85CEjRBABmofzALgUN -link 1080
    Generating ECDSA(PSK-derived) cert for secure communication...completed.
    20260110-201517 [MQTT] Pushing Hello to topic nat-exchange/288b1fba89dc533d across 4 servers
    20260110-201520 [MQTT] Hello operation completed (via tcp://guest:[email protected]:1883). tid: cdUDQYy91P;cs=tls
    === Checking NAT reachability ===
    Getting local public IP info via 6 STUN servers...(7 answers)OK
    tcp4 : LAN=192.168.1.16:32126 | NAT=223.xxx.xxx.239:31910 (hard)
    udp4 : LAN=192.168.1.16:32126 | NAT=223.xxx.xxx.239:31984 (hard)
    Exchanging address info with peer ...OK (via tcp://guest:[email protected]:1883)
    tcp4 : LAN=10.100.62.128:7531 | NAT=112.xxx.xxx.127:7531 (easy)
    udp4 : LAN=10.100.62.128:7531 | NAT=112.xxx.xxx.127:7531 (easy)
    === Trying P2P Connection ===
    Exchanging sync message for P2P round 1 ... OK
    - Network : tcp4
    - Local Address : 192.168.1.16:32226 (LAN) / 223.xxx.xxx.239:32010 (NAT-hard)
    - Remote Address: 10.100.62.128:7631 (LAN) / 112.xxx.xxx.127:7631 (NAT-easy)
    - Best Route : 112.xxx.xxx.127:7631 (reason: different network)
    - Active Mode : connect start immediately
    ↑ Trying 600 Random Source Ports concurrently...
    P2P(TCP) connection established (RSP)!
    Performing TLS-C handshake (PSK-based mutual authentication)...completed.
    20260110-201528 [gonc] Connected to: 112.xxx.xxx.127:7631
    20260110-201528 [:mux] Waiting for linkagent handshake...
    20260110-201528 [:mux] [link] Sending R-Config: none?peer_active=1
    20260110-201528 [:mux] [link] Waiting for Remote ACK...
    20260110-201528 [:mux] [link] Remote ready (OK:none).
    20260110-201528 [:mux] [link-x] Listening on 0.0.0.0:1080 (TProxy=true)
    20260110-201528 [:mux] TProxy Format: 10.0.0.1-3389.gonc.cc:1080 -> 10.0.0.1:3389
    20260110-201528 [:mux] [link] Local service started.
    20260110-201554 [:mux] New client connected from 127.0.0.1:32145
    20260110-201554 [:mux] TCP: 127.0.0.1:32145->10.0.0.1:1289 connecting...
    20260110-201615 [:mux] 127.0.0.1:32145->10.0.0.1:1289 failed: ERROR: dial tcp 10.0.0.1:1289: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
    20260110-201615 [:mux] Proxy session 127.0.0.1:32145->10.0.0.1 (T-CONNECT) finished with error: tunnel TCP connect failed: ERROR: dial tcp 10.0.0.1:1289: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

    客户端:
    C:\Users\Administrator\Desktop>gonc -p2p 0rZj85CEjRBABmofzALgUN -linkagent
    Generating ECDSA(PSK-derived) cert for secure communication...completed.
    20260110-201413 [MQTT] Waiting for event on topic: nat-exchange/288b1fba89dc533d across 4 servers
    20260110-201519 [MQTT] Received event: SYN@cdUDQYy91P;cs=tls, (via tcp://guest:[email protected]:1883)
    20260110-201519 [MQTT] Waiting for message(SYN@cdUDQYy91P;cs=tls) on topic: nat-exchange/288b1fba89dc533d across 4 servers
    === Checking NAT reachability ===
    Getting local public IP info via 6 STUN servers...(7 answers)OK
    tcp4 : LAN=10.100.62.128:7531 | NAT=112.xxx.xxx.127:7531 (easy)
    udp4 : LAN=10.100.62.128:7531 | NAT=112.xxx.xxx.127:7531 (easy)
    Exchanging address info with peer ...OK (via tcp://guest:[email protected]:1883)
    tcp4 : LAN=192.168.1.16:32126 | NAT=223.xxx.xxx.239:31910 (hard)
    udp4 : LAN=192.168.1.16:32126 | NAT=223.xxx.xxx.239:31984 (hard)
    === Trying P2P Connection ===
    Exchanging sync message for P2P round 1 ... OK
    - Network : tcp4
    - Local Address : 10.100.62.128:7631 (LAN) / 112.xxx.xxx.127:7631 (NAT-easy)
    - Remote Address: 192.168.1.16:32226 (LAN) / 223.xxx.xxx.239:32010 (NAT-hard)
    - Best Route : 223.xxx.xxx.239:32010 (reason: different network)
    - Passive Mode : connect start after 2s
    ↑ Trying 600 Random Destination Ports concurrently...
    P2P(TCP) connection established (RDP)!
    Performing TLS-S handshake (PSK-based mutual authentication)...completed.
    20260110-201529 [gonc] Connected to: 223.xxx.xxx.239:25379
    20260110-201529 [:mux] [linkagent] Session established. OwnerID=
    20260110-201531 [MQTT] Waiting for event on topic: nat-exchange/288b1fba89dc533d across 4 servers
    20260110-201555 [:mux] TCP-Connect: 10.0.0.1:1289
    20260110-201616 [:mux] Failed to connect to target 10.0.0.1:1289: dial tcp 10.0.0.1:1289: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

    使用 10.0.0.1-1289.gonc.cc:1080 远程桌面显示内部错误
    maninnet
        24
    maninnet  
       Jan 10
    @maninnet 打反了,前面日志是客户端的,后面是服务端的。公司局域网段是 10.100.xxx.xxx
    le4tim
        25
    le4tim  
    OP
       Jan 10
    @maninnet 你确定你要连接公司的这个服务器 10.0.0.1:1289 吗?你公司的局域网段不是 10.100 的吗?我假如,你要连接的是 10.100.62.123:1289 ,
    远程桌面就填写 10.100.62.123-1289.gonc.cc:1080
    le4tim
        26
    le4tim  
    OP
       Jan 10
    @maninnet 曝光的口令,就不能用了,如果 linkagent 还运行,别人就能连接你公司内网了。希望你注意安全哦。
    maninnet
        27
    maninnet  
       Jan 10
    @le4tim 口令都是做过处理的。现在成功了,我大概明白怎么用了,我现在用的 tailscale ,显示也是直连,但是 gonc 速度比它快多了!非常感谢!
    le4tim
        28
    le4tim  
    OP
       Jan 10
    @maninnet 有趣,我看你有一端是 NAT-easy ,所以会优先 tcp 打洞直连。由于我自己的体验是有的运营商跨运营商的宽带 tcp 晚上被 qos 限速的难受,所以你有时也可以试试在客户端连接时再加个参数-u 限制用 udp 协议,这样会用 kcp 作为稳定传输层。
    maninnet
        29
    maninnet  
       Jan 10
    @le4tim
    === Trying P2P Connection ===
    Exchanging sync message for P2P round 1 ... OK
    - Network : tcp4
    - Local Address : 10.100.xxx.xxx:12551 (LAN) / 112.xxx.xxx.xxx:12551 (NAT-easy)
    - Remote Address: 192.168.xxx.xxx:40718 (LAN) / 223.xxx.xxx.xxx:31918 (NAT-hard)
    - Best Route : 223.xxx.xxx.xxx:31918 (reason: different network)
    - Passive Mode : connect start after 2s
    ↑ Trying 600 Random Destination Ports concurrently...
    P2P(TCP) connection established (RDP)!
    这样看起来 TCP 建立的连接吗?很奇怪的是,我现在家里的网络是 NAT-hard ,公司的是 easy ,我老家的也是 easy ,但我现在的网络在 tailscale 跟各个节点都能直连,但其他的跟公司都是中转。而且我一般就是晚上 8-10 点这段特别卡,估计就是被 qos 了。
    le4tim
        30
    le4tim  
    OP
       Jan 10
    @maninnet P2P(TCP) connection established (RDP)!说明了是 tcp 打洞建立的。从技术上讲,easy 类型的,跟任何对端都能直连,而且 tcp 的可行性也不错。
    siesta
        31
    siesta  
       Jan 10
    资质平平,愣是没实现,都是 EASY,不知道那里出问题了,
    le4tim
        32
    le4tim  
    OP
       Jan 10
    @siesta 可以反馈日志信息帮你看看
    cfcboy
        33
    cfcboy  
       Jan 11
    服务器有 v4 和 v6 ,设置 s5 代理后,出口怎么设置成 v4 优先呢。
    le4tim
        34
    le4tim  
    OP
       Jan 11
    @cfcboy
    gonc -e ":s5s -local 网卡 ip 省略其他参数" 省略
    -local 指定代理出口用的网卡 ip 。
    cfcboy
        35
    cfcboy  
       Jan 11
    @le4tim
    ":s5s -local 网卡 ip 省略其他参数"
    出现这个错误:
    SOCKS5 TCP Connect failed for 1.2.3.4:55038: tunnel
    TCP connect failed: dial tcp: address 5.6.7.8:0: no suitable address found
    le4tim
        36
    le4tim  
    OP
       Jan 11
    @cfcboy 说明你参数指定的是无效的网卡 ip ,确定 ifconfig 能看到指定的 ip
    cfcboy
        37
    cfcboy  
       Jan 11 via iPhone
    @le4tim 我指定的就是外网 ip 。我是落地机,有前置。上面显示的 1.2.3.4 是前置机的 ip ,5.6.7.8 是落地机的 ip 。
    加上-server-ip 正常,但是无效,出口还是 v6.
    le4tim
        38
    le4tim  
    OP
       Jan 11
    @cfcboy 我的意思是-local 可以用 ip 限定出口网卡,这个 ip 是本地网卡分配的 ip 。你可能是-local 5.6.7.8 ,这个 ip 不是本地分配的 ip
    cfcboy
        39
    cfcboy  
       Jan 11
    @le4tim 你好,测试过多次。换机器测。结果是一样的。你那边可以帮忙测试一下吗?
    le4tim
        40
    le4tim  
    OP
       Jan 11
    @cfcboy -local 在我这边可以工作,你用什么系统?以及你-local 指定的 ip 5.6.7.8 在 ifconfig 里能看到吗,因为你希望出口 ip 是 5.6.7.8 ,但他如果并不是你本机 ip 是无法绑定的,而实际要绑定的 ip 应该从 ifconfig 里选
    cfcboy
        41
    cfcboy  
       Jan 11
    @le4tim 本地是 mac 和 win.

    服务器是 debian11 ,ifconfig 里面能看到这个 ip 。我尝试绑定网卡名称也不行。识别成域名了。

    目前使用一切正常,就是不能 v4 优先。v6 有用。不能禁用。
    le4tim
        42
    le4tim  
    OP
       Jan 11
    @cfcboy 那应该是我代码有 bug ,no suitable address found 信息表示可能在 ipv4 源 ip 去连接了 ipv6 目的 ip 。
    你连接的目的是什么,是 ipv6 的目的吗?是域名的吗?
    请排查,试着连接目的是 ipv4 的地址,和仅仅有 ipv4 的域名。
    cfcboy
        43
    cfcboy  
       Jan 11
    @le4tim 我连接的是公网的 ipv4 地址,填的 IP 。访问查 IP 的网站,优先显示 ipv6.
    asdhak
        44
    asdhak  
       Jan 12
    大佬,多层嵌套 net 能实现成功打洞嘛。
    parsec 在我这打洞失败。
    tailscale 跟 uu 远程能打洞成功。
    parsec 配合 tailscale 可以实现 parsec 的 p2p 。
    le4tim
        45
    le4tim  
    OP
       Jan 12
    @asdhak 仅一边嵌套不一定是问题。具体环境我也不确定,麻烦你测试
    le4tim
        46
    le4tim  
    OP
       Jan 12
    @cfcboy 我之前可能没正确理解你的需求,你说的是优先 v4 ,我以为是只走 v4 的出去。如果-local 指定了 v4 的地址,会导致代理去无法访问 v6 的地址,包括域名解析出来 v6 地址也会无法访问。你说你连接的是公网的 ipv4 地址,在-local 指定了 v4 的情况下,我觉得代理不应该这种报错 no suitable address found 。这种报错我测试都是源 ip 和目的地址 v4 v6 不一致的意思。
    cfcboy
        47
    cfcboy  
       Jan 13
    @le4tim 谢谢回复。怎么给你发我的配置信息,你可以试一下。
    le4tim
        48
    le4tim  
    OP
       Jan 13
    @cfcboy github 主页有邮箱
    waynevan
        49
    waynevan  
       Jan 13
    @le4tim 大佬,有 Android 手机客户端计划吗
    crime1024
        50
    crime1024  
       Mar 23
    很牛,但是一旦开源就像 nps frp 一样,可以加入流量特征分析了,导致一使用就会报警。所以,还是自己用 ai vibe 一个就好了。
    Hermitist
        51
    Hermitist  
       Apr 13
    楼主, 请问你的方案用在直播是否可以保证质量稳定呢?

    因为朋友 TK live stream 需求, 目前买了一些国外落地家宽 IP, 通过 ss 落地. 目前搞了一周, 很稳定, 不过为了有个备份, 也为了省钱, 毕竟落地家宽 ip 不便宜, 打算用下面这个方案, 请问下哪里有需要特别注意的地方:

    国外 dongnanya 的 MY 有个朋友家里宽带, 打算搞个小主机过去, 然后国内直播通过直接 sock5 或 http 方式连过去, 如果直连不行, 会加一条梯.

    走的是 IPV6, 现在有个难点是: 由于家宽会定期释放, 如何能实时更新? 通过 ddns +域名方式吗? 用 cloudflare+ ipv6 结合 ddns? 又这么尝试过的朋友,速度会很慢不适合直播吗? 只能走阿里的 dns?

    小主机上直接装 ss 还是 lucky? 我还打算在小主机上装个 tailscale, 这样平时可以连过去维护.
    le4tim
        52
    le4tim  
    OP
       Apr 14
    @Hermitist gonc 可以帮你建立点对点的通道,让 openvpn 等基于这个通道组网(自己动手会需要讲究一些细节,例如 openvpn mtu 要调),你也可以让 gonc 直接帮你建立一个 socks5 代理隧道,gonc 可以用 timeout 参数检测传输情况并迅速重新建立通道。这两种方式我都用,可以持续很稳定很久。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   836 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 21:58 · PVG 05:58 · LAX 14:58 · JFK 17:58
    ♥ Do have faith in what you're doing.