v0.82.0 — 上游同步、DNSCrypt 迁移与 quic-go 0.60 对齐
本版本同步上游至 5235b4c,纳入 AdguardTeam/dnsproxy 的 DNSCrypt 官方库迁移、DoH/DoT 行为修正、FORMERR 与读取限制等更新;工具链升至 Go 1.26.5、quic-go v0.60.0(govulncheck 清零)。标签 v0.82.0 指向本 release 提交;核心 DNS 逻辑以 19800a8(quic-go 对齐)为准,README 清理在本 tag 提交。
亮点
- 上游:DNSCrypt →
AdguardTeam/dnscrypt;DoH 请求 ID 置 0(RFC 8484);FORMERR 响应;读取大小限制(AGDNS-4074);DoT ALPNdot;清除上游 AA 位;上游响应校验更严格。 - 工具链:Go 1.26.5、quic-go v0.60.0(修复 GO-2026-5856 / GO-2026-5676)。
- 本 fork 保留:PPv2、DoH HTTP/3
Mutex+Lock串行化(9b12982方案延续)、DoQstreamOpenMu、GHCR 镜像、TCP/TLS 优雅关闭。
行为变更
DNSCrypt 库迁移(上游 AGDNS-4107)
依赖由 ameshkov/dnscrypt/v2 切换为 github.com/AdguardTeam/dnscrypt。协议语义应对齐;若使用 DNSCrypt 上游或服务端,升级后请做一次连通性验证。
DoH 请求 ID(上游 AGDNS-4080)
DoH 出站 pack 后将 DNS header ID 设为 0(缓存友好);响应若为非零 ID 则拒绝,校验通过后恢复为原请求 ID。对不符合 RFC 8484 的 DoH 上游更严格。
FORMERR 与读取限制
- 非法请求(如 question 数量 ≠ 1)返回 FORMERR;UDP unpack 失败但有有效 header 时也回 FORMERR,而非静默丢弃。
- DoH POST body 与上游响应体使用 LimitReader(
dns.MaxMsgSize),降低超大报文耗尽资源的风险。
DoT ALPN(上游 AGDNS-4210)
DoT TLS 配置增加 NextProtos: ["dot"],与 NextDNS 等非标准端口等场景对齐。
上游响应语义
- 代理转发时清除 AA(Authoritative) 位。
- 上游返回
nil或 question 数量 ≠ 1 时生成 SERVFAIL(fail-closed;不再补构造 question)。
依赖与安全
- Go 1.26.3 → 1.26.5
- quic-go 0.59.0 → 0.60.0(与上游一致;勿降回 0.59.0)
Fork 专属行为(相对上游)
DoH HTTP/3 — 串行化 RoundTrip(延续 v0.81.10)
上游在 RoundTrip 全程使用 sync.RWMutex 的 RLock。本 fork 仍使用 sync.Mutex:整次 RoundTrip(含 OnlyCachedConn 与拨号)在 Lock 下执行;仍使用 quic.DialAddrEarly,0-RTT 语义不变。经同一 DoH upstream 实例的 HTTP/3 查询会串行化。
沿用自更早 fork 版本
- 监听侧 PPv2(TCP/TLS)。
v0.82.0 — Upstream sync, DNSCrypt migration, quic-go 0.60
Highlights (EN)
- Upstream sync through
5235b4c: official DNSCrypt lib, DoH ID=0 (RFC 8484), FORMERR, read limits, DoT ALPN, clear AA bit, stricter upstream validation. - Toolchain: Go 1.26.5, quic-go v0.60.0 (govulncheck clean).
- Fork unchanged: PPv2, DoH HTTP/3 full
RoundTripmutex, DoQstreamOpenMu, GHCR.
Behavior changes (EN)
- DNSCrypt:
AdguardTeam/dnscryptreplacesameshkov/dnscrypt/v2. - DoH: outbound ID set to 0; non-zero response IDs rejected then restored after validation.
- FORMERR / LimitReader: standard errors for bad requests; bounded body reads.
- DoT ALPN:
NextProtos: ["dot"]. - Responses: AA cleared on forward; nil or bad upstream → SERVFAIL.
Fork-specific (EN)
DoH HTTP/3. Same as v0.81.10: sync.Mutex for full RoundTrip (upstream uses RLock); DialAddrEarly unchanged. Serialize queries on the same upstream instance.
Carried forward: PPv2, DoQ streamOpenMu, GHCR.
Operational notes (EN)
- DoH3: serialized per upstream instance; H2 DoH / DoT / DoQ / UDP unaffected.
- DoH upstreams must comply with RFC 8484 ID semantics.
- DoT: ALPN
dotrequired by some providers. - DoQ idle / DNS cache DO / PPv2: same as v0.81.10.
- Image:
ghcr.io/fcchbjm/dnsproxy:v0.82.0.
Upgrade notes (EN)
Drop-in for most users. Validate DNSCrypt and non-standard DoH/DoT if you rely on them. Review DoH3 concurrency only on a single DoH3 upstream object.
Full changelog: v0.81.10...v0.82.0