Skip to content

v2.1

Latest

Choose a tag to compare

@keminar keminar released this 18 Sep 09:24
· 39 commits to master since this release

内网穿透: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