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 连接卡在 'Exchange address...' 怎么办?
这说明双方无法通过 MQTT 服务器交换信息。
- 检查是否有一方网络屏蔽了 MQTT 端口(通常是 1883)。
- 尝试更换 MQTT 服务器:
-mqttsrv "tls://broker.emqx.io:8883"。
能连接但传输速度很慢?
- 检查是否有一方网络上行带宽受限。
- 尝试添加
-kcp参数开启 KCP 协议加速(以带宽换延迟)。
支持 IPv6 吗?
完美支持。如果检测到双方都有 IPv6 地址,gonc 会优先通过 IPv6 建立直连(通常无需打洞),速度和稳定性都是最佳的。