Repository navigation
内网穿透:QUIC 直连打洞、VPS 盲转发中继与端到端加密文件传输
本版本把 websocket 内网穿透从「HTTP 头订阅 + 裸 TCP 转发」扩展为完整的数据面能力:
订阅端之间可 QUIC 直连打洞(或经一台公网 VPS 盲转发中继),并在这条通道上做端到端
加密的文件收发;同时补齐配置生成、可观测性,并修掉一批并发与稳定性问题。
✨ 新特性
QUIC 直连打洞(数据面不经服务端)
- 多候选并行打洞,按 RTT + 地址类型偏置择优;监听按需起、空闲释放、socket 可重建。
- 打洞全灭后不再盲选第一条候选:改为对所有候选并行发起真实 QUIC 拨号竞速
(raceQUICDial,标准 TLS 1.3 握手不易被针对性拦截)。 direct.punchFirst:本机在 CGNAT 后时翻转打洞顺序,避免映射被「毒化」导致双向全灭。direct.encrypt:给 PUNCH/PONG 控制包加 AES-256-GCM,避免明文 ASCII 特征被运营商
设备识别丢弃。纯 opt-in,关掉行为完全不变。direct.lanAddrs手工补充局域网候选;direct.portmap默认关闭(UPnP/PCP/NAT-PMP
命中率低,却要付 1~2 秒探测超时)。-direct-plain-udp:绕过 quic-go 的批量/ECN 快速路径,用于某些 Windows 网卡上
高丢包 + 拥塞窗口卡死的场景。
VPS 盲转发中继(TURN 式)
- 两侧都在 CGNAT 后、彼此打不通但都能连到一台公网 VPS 时,由 VPS 做不透明 UDP 盲转发,
QUIC/TLS 仍在两端之间端到端,VPS 看不到明文。 - VPS 侧只需
direct.relay: true一个开关(可用relayAllow收紧到指定 email,
可用relayPublic指定固定公网端点/端口);发起侧用direct.rules[].via或
-via <VPS email>指定。
端到端加密文件收发 -send / -recv
- 内置直连传文件,不依赖对端装 sshd/rsync;支持经服务端中继(
-via relay)或经 VPS
中继打洞。身份用自动生成的 uuid(不再用可伪造的 email),需要对方receive.allow
放行。 -parallel N:大文件按字节区间切块、多连接并行传输,direct/relay、send/recv 双向
都支持;任一块失败即整份作废并清理.part。- 中继路径补流控(不再堵死整条 websocket)、修死锁;进度条改按对端 ACK 回调、显示
瞬时速率,传完打一行 QUIC 收发统计(丢包率/RTT/拥塞窗口)。
其它
-genconf:按-mode生成带注释的配置骨架(示例规则一律注释、不覆盖已有文件),
-genkey生成 websocket 鉴权密钥对。- 黑洞哨兵 IP(
default.blackholeIP,默认192.0.0.0):域名指向它后,没开代理时
天然不可达,开了代理则强制走 remote + 远程 DNS 解析。 websocket.client.proxy:订阅端可经 B 已暴露的代理端口 CONNECT/SOCKS5 到服务端,
服务端不必再单独开公网 ws 端口。- geosite 域名索引改为压缩二分查找,常驻内存只留域名字符一份;
.dat支持按类别过滤。 - 新增
examples/nat-punch、derp-nat、tunnel-hop三个打洞验证工具与实测记录。
⚠️ 破坏性变更
- 原先平铺的
directXxx配置项合并进websocket.client.direct{}块
(accept/rules/encrypt/portmap/punchFirst/relay/
relayAllow/relayPublic/lanAddrs)。 client.direct[].listen的独立protocol字段移除,协议改为写进地址前缀,
如both://:13389。client.direct.port改名为forwardPort(避免误读成内网目标端口)。- 命令行
-ws-connect移除,请改用配置文件websocket.client.connect。 - 走服务端中继(
-via relay)时,服务端 B 也需升级到 v2.1。
🐛 修复
- 服务端全局状态(
ServerHub/ServerBridge/serverStart)改为atomic.Pointer
整体发布的不可变快照,消除热加载/并发访问的 data race 与 nil 解引用隐患。 RouterConfig改为atomic.Pointer,修复配置热加载与请求协程并发读取的 data race。- 修复
Hub.clients的并发读写 map(分块并行传输显著提高了触发概率)。 - 修复进度条 goroutine 泄漏(漏调
done()会每 200ms 刷屏直到进程结束,CI 上曾把
真正的失败日志冲掉);done()改为幂等。 - QUIC 会话复用键由 email 改为 email+port,不再跨端口误用同一条已鉴权连接。
sniffClientHead支持跨多次 Read 拼接分片 TLS ClientHello,大 ClientHello 不再被
截断导致域名嗅探失败;sameTCPAddr修正通配地址语义,避免错误复用旧 fd。- 文件传输:
.part名带上传输 token 避免并发覆盖,最终文件名用O_EXCL原子认领,
rename 失败带退避重试;uniquePath不再把版本号数字误当扩展名。 - UDP 中继 token 比对改常量时间;配置字段类型不匹配不再拖垮整个服务启动;
allowIP补上 IPv6 单地址匹配。
📚 文档
- 新增
docs/en/全套英文文档镜像;README.md改为英文(GitHub 默认落地页),
README_CN.md为中文。 - 重画并双语化「系统架构总览」「内网穿透链路」两张图(
.svg源 + 中/英.png)。 - 新增
docs/websocket.md、direct-punch-order.md、direct-relay-design.md、
blackhole-sentinel.md、tun-dns-resolution.md等;源码编译要求明确为 Go 1.25+。 - 新增 MIT LICENSE。
完整变更:v2.0...v2.1