跳转至

P2P 连接指南

gonc 的核心特色功能。它允许两台处于不同内网(NAT 之后)的主机,在没有公网 IP 的情况下建立直接连接


🔗 快速开始

P2P 连接不再区分“服务端”和“客户端”,双方都是平等的对等端 (Peer)。

-p2p 最简模式 (自动协商)

只要双方持有相同的 Session Key (会话密钥)gonc 就会自动完成信令交换、NAT 打洞和连接建立。

gonc -p2p mysecret123
gonc -p2p mysecret123

注意事项

  • 时间敏感:在默认模式下,两台机器运行命令的时间差不宜超过 30 秒,否则打洞窗口可能会过期。
  • 安全性mysecret123 不仅用于发现对方,还用于生成加密密钥。请使用复杂的字符串(建议使用 -psk . 生成)。

同步连接 (推荐)

为了解决“两边必须同时运行命令”的不便,gonc 引入了基于 MQTT 的等待唤醒机制。这更符合 Client-Server 的操作习惯。

场景:A 等待,B 主动连接

我们通常希望主机 A 像服务器一样一直挂着,主机 B 随时可以连上去,这需要用到-mqtt-wait(-W)-keep-open(-k)组合,如果不用-k,则只接受被唤醒一次P2P。

使用 -mqtt-wait(-W) 进入被动等待模式。它会订阅 MQTT 频道,直到收到 Hello 消息才开始打洞。组合-k可以持续接受不同来源的客户端,使用相同的口令唤起它与对端打洞。

# 加上 -k 持续等待,-e :sh 提供 Shell
gonc -p2p mysecret123 -mqtt-wait -k -e ":sh /bin/bash"

使用 -mqtt-hello(-H) 发送唤醒信号。hello信号中包含客户端建议的通讯加密方案,默认是TLS+PSK

# 发送 Hello -> 双方开始打洞 -> 建立连接 -> 进入交互 Shell
gonc -p2p mysecret123 -mqtt-hello -pty

如果TCP无法穿透会自动尝试UDP,你可以仅从客户端追加参数来设定两端的传输协议,例如添加-u将限定使用UDP+KCP+DTLS+PSK的通讯加密方案,如果再添加-ss将限定使用UDP+KCP+SS的通讯加密方案


🔍 -nat-checker NAT类型与穿透

P2P 的成功率高度依赖于双方的网络环境。使用 -nat-checker 可以自测当前环境。

gonc -nat-checker

NAT 类型解读

gonc 将网络环境分为三类:

类型 显示 穿透难度 描述
容易型 (easy) 对外映射的端口是固定的,与内网端口总是保持不变的。成功率极高。
困难型 (hard) ⭐⭐ 对外映射的端口虽然与内网端口不一致,但是映射一次后它是固定的,即一个NAT端口可以连接不同目的地址,它只允许向外发送过的目标 IP+PORT 访问。gonc 需要精确控制发包时序来穿透。
对称型 (symm) ⭐⭐⭐ 对称型 NAT (Symmetric)。每次访问不同的 IP,对外映射的端口都会变。最难穿透。

穿透策略矩阵

类型 成功率
Easy + Easy 100% 成功。
Easy + Hard 极高。
Easy/Hard + Hard/Symm 中等。gonc 会按需启用“生日悖论”算法进行端口碰撞。发送600个随机端口探测包,成功碰撞的概率约90%
Symm + Symm 放弃。建议使用前置代理-x2 relay中转模式。

🛠️ 关键参数详解

协议控制

参数 说明
-p2p 口令 启用 P2P 模式。口令可以是字符串,也可以是 @filename (从文件读取)。
-ss ShadowStream 模式。使用更轻量的加密协议,流量特征更小。
-plain 明文模式。禁用加密。让gonc纯粹是为你NAT打洞。
-u/-4/-6 限定传输协议。例如-u -4组合使用,只要有一端限定了,双方就只会选择共有的UDP4地址进行P2P连接。

信令与辅助服务器

gonc 内置了公共的服务器,通常无需修改。

参数 说明 默认值
-stunsrv STUN 服务器。用于查询公网 IP。支持 TCP/UDP 协议。 Google, Cloudflare 等公共节点
-mqttsrv MQTT 信令服务器。用于交换 SDP (会话描述信息)。 HiveMQ, Mosquitto 等公共 Broker
-mqtt-nat-topic MQTT Topic 前缀。防止 Topic 冲突。 nat-exchange/

高级调优

当网络环境极其恶劣时使用。

参数 说明
-punch-random-count 碰撞次数。默认 600。当遇到对称型 NAT 时,尝试使用的随机端口数量。数值越大成功率越高,但初始连接越慢。
-punch-short-ttl 短 TTL 探测。默认 5。发送 TTL 很小的包,旨在“欺骗”本地 NAT 创建映射,而不让数据包真正到达运营商网关,防止被防火墙状态机阻断。

🛡️ 备用方案 (Fallback)

虽然 gonc 的打洞能力不错,但总有打不通的时候(例如双方都是symm对称型NAT)。

使用 -x2 参数可以指定一个“备用代理”。当 P2P 直连失败时,自动降级通过该代理连接。

# 尝试 P2P 直连;如果失败,则通过 socks5 代理中转
gonc -p2p mysecret123 -x2 "-psk simplekey123 1.2.3.4:1080"

搭建中转服务器

你可以用一台有公网 IP 的 VPS 运行 gonc 作为中转节点:

# VPS 上运行,开启 UDP 支持,公网上至少用psk上把加密锁哦
gonc -e ":s5s -u" -psk simplekey123 -k -l 1080
然后在 P2P 失败时利用它进行中转。


常见问题

P2P 连接卡在 'Exchange address...' 怎么办?

这说明双方无法通过 MQTT 服务器交换信息。

  1. 检查是否有一方网络屏蔽了 MQTT 端口(通常是 1883)。
  2. 尝试更换 MQTT 服务器:-mqttsrv "tls://broker.emqx.io:8883"
能连接但传输速度很慢?
  1. 检查是否有一方网络上行带宽受限。
  2. 尝试添加 -kcp 参数开启 KCP 协议加速(以带宽换延迟)。
支持 IPv6 吗?

完美支持。如果检测到双方都有 IPv6 地址,gonc 会优先通过 IPv6 建立直连(通常无需打洞),速度和稳定性都是最佳的。