Skip to content

Releases: fcchbjm/dnsproxy

Release v0.82.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 19:36

v0.82.0 — 上游同步、DNSCrypt 迁移与 quic-go 0.60 对齐

本版本同步上游至 5235b4c,纳入 AdguardTeam/dnsproxy 的 DNSCrypt 官方库迁移、DoH/DoT 行为修正、FORMERR 与读取限制等更新;工具链升至 Go 1.26.5quic-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 ALPN dot;清除上游 AA 位;上游响应校验更严格。
  • 工具链:Go 1.26.5quic-go v0.60.0(修复 GO-2026-5856 / GO-2026-5676)。
  • 本 fork 保留:PPv2、DoH HTTP/3 Mutex+Lock 串行化(9b12982 方案延续)、DoQ streamOpenMu、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 与上游响应体使用 LimitReaderdns.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.RWMutexRLock。本 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 RoundTrip mutex, DoQ streamOpenMu, GHCR.

Behavior changes (EN)

  • DNSCrypt: AdguardTeam/dnscrypt replaces ameshkov/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 dot required 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

Release v0.81.10

Choose a tag to compare

@github-actions github-actions released this 26 May 13:16

v0.81.10 — 上游同步、DoQ/缓存改进与 DoH3 竞态修复

本版本同步上游至 f214e79,纳入 AdguardTeam/dnsproxy 的 DoQ 与 DNS 缓存行为更新,并对本 fork 的 HTTP/3(DoH)并发做加固。标签 v0.81.10 指向 9b12982(DoH3 串行化最终方案);中间尝试(cd2b354b0af9cf)仅作实验,以本 tag 为准。

亮点

  • 上游:Go 1.26.3、DoQ 空闲/accept 超时、DNS 缓存区分 DNSSEC DO 位、UDP 查询 ID 处理、从 tag 解析版本号、GitHub Actions 安全加固。
  • 本 fork:修复 HTTP/3(DoH)握手竞态(有意串行化);CI/测试稳定性(DNSCrypt -race、DoH 0-RTT qlog);Codecov v5。
  • 相对 v0.81.9 未变:PPv2、GHCR 镜像、DoQ streamOpenMu、TLS 会话恢复 / TFO 相关行为。

行为变更

DNS 缓存与 DO 位(上游)

查询带 DNSSEC DO 位时,缓存 key 包含该位;带/不带 DO 的查询不再共用同一缓存项。参见 AdGuard Home #8384

DoQ 超时(上游)

QUIC 空闲超时由 5 分钟 缩短为 30 秒;accept 循环增加超时,异常退出时更不易遗留 goroutine。

其它上游修复

  • UDP 查询 ID 为 0 时的处理(AGDNS-3952)。
  • 构建版本可从 GITHUB_REF / 发布 tag 解析。

Fork 专属行为

本 fork 在可行处与上游语义对齐;以下为有意的偏离说明。

DoH HTTP/3 — 串行化 RoundTrip9b12982

问题。 多个 goroutine 并发进入 http3Transport.RoundTrip 时,可能与 quic-go 的 QUIC 握手重叠(handleTransportParameters 与打开 stream),在高压测试(go test -race、高并行)下表现为 HTTP/3 DoH 路径上的 DATA RACE。

上游。 AdguardTeam 在 RoundTrip 全程使用 sync.RWMutexRLock,同一 transport 上允许多个并发读者。

本 fork。 http3Transport 使用 sync.Mutex整次 RoundTrip(含 OnlyCachedConn 与拨号)在 Lock 下执行;仍使用 quic.DialAddrEarly,0-RTT 语义不变,仅限制对同一 transport 并发进入 quic-go。

取舍。同一 DoH upstream 实例的 HTTP/3 查询会串行化。对典型 DNS 上游负载,这一取舍通常可接受。若你依赖大量 goroutine 对单个 DoH3 upstream 并行打满吞吐,升级前请自行压测。

Bisect 说明。 cd2b354(无锁快路径)与 b0af9cf(恢复 RLock)未能完全稳定 CI;本 tag 以 9b12982 为准。

沿用自更早 fork 版本

  • 支持监听上的 PPv2
  • DoQOpenStreamSync 外有 streamOpenMu(本 fork 独有;本版未改)。
  • GHCR 容器发布(ghcr.io/fcchbjm/dnsproxy)。

运维说明

  • DoQ:空闲超时采用上游更短的默认值(30s)。长时间空闲的 DoQ 连接可能比以前更早被断开。
  • DoH HTTP/3同一 upstream 实例上的请求在本 fork 中串行化,以避免 quic-go 握手竞态(见上)。DoT、DoQ、UDP 及 HTTP/2 DoH 不受此互斥锁影响。
  • DNS 缓存:升级后,启用 DO 时,带 DO 与不带 DO 的查询将使用不同缓存项。
  • PPv2 / TFO / TLS 会话恢复:与 v0.81.9 一致。
  • 镜像ghcr.io/fcchbjm/dnsproxy:v0.81.10(本 tag 的 Docker workflow 成功后可用)。

升级说明

  • 多数部署可直接替换二进制或拉取新镜像。
  • 若依赖长时间空闲的 DoQ,请结合防火墙/中间设备检查 30s 空闲超时
  • 仅当你刻意对单个 DoH3 upstream 对象做极高并行查询时,需关注 HTTP/3 串行化 影响。

维护(CI 与测试)

  • Codecov 上传:v5slug: fcchbjm/dnsproxy
  • DNSCrypt 测试:-race 下先 shutdown 再 wait serve goroutine。
  • DoH 0-RTT 测试:用 require.Eventually 等待 qlog(macOS CI 稳定性)。

自 v0.81.9 以来(参考)

范围 说明
上游合并 缓存 DO 位、DoQ 超时、Go 1.26.3、Actions 安全、版本修复、UDP ID
Fork — DoH3 9b12982 Mutex 串行化(最终)
Fork — CI/测试 Codecov v5、DNSCrypt race、DoH 0-RTT 测试

完整变更v0.81.9...v0.81.10


v0.81.10 — Upstream sync, DoQ/cache improvements, and DoH3 race fixes

Highlights (EN)

  • Upstream sync through f214e79 (Go 1.26.3, DoQ timeouts, DNS cache DO bit, UDP ID fix, tag-based version).
  • Fork: DoH HTTP/3 race fix via full RoundTrip mutex; CI/test hardening.
  • Unchanged from v0.81.9: PPv2, GHCR, DoQ streamOpenMu.

Behavior changes (EN)

  • DNS cache: DO bit included in cache key when set (#8384).
  • DoQ: QUIC idle timeout 5m → 30s; accept loop timeout reduces goroutine leak risk on abnormal exit.
  • Other: UDP query ID 0 handling; version from release tags.

Fork-specific behavior (EN)

DoH HTTP/3 (9b12982). Upstream uses RWMutex.RLock for the full RoundTrip. This fork uses sync.Mutex (Lock for the entire RoundTrip, including dial) to avoid quic-go handshake races under concurrent use. quic.DialAddrEarly is unchanged (0-RTT preserved). HTTP/3 queries on the same upstream instance are serialized; this tradeoff is generally acceptable for typical DNS upstream workloads. 9b12982 is authoritative; cd2b354 and b0af9cf are experimental only.

Carried forward: PPv2, DoQ streamOpenMu, GHCR images.

Operational notes (EN)

  • DoQ idle timeout: 30s (upstream default).
  • Same-instance DoH3: serialized; DoT/DoQ/UDP/H2 DoH unaffected.
  • PPv2 / TFO / TLS session resumption: same as v0.81.9.
  • Image: ghcr.io/fcchbjm/dnsproxy:v0.81.10.

Upgrade notes (EN)

Drop-in for most users. Review DoQ idle timeout if you keep long-lived QUIC sessions. Review DoH3 concurrency only if you maximize parallel queries on a single DoH3 upstream object.

Full changelog: v0.81.9...v0.81.10

Release v0.81.9

Choose a tag to compare

@github-actions github-actions released this 02 May 10:15
fe4763a
修复 TCP/DoT 分帧短读问题,优化 PPv2 并发处理,提升高负载稳定性。

修复:io.ReadFull 读取长度前缀,避免 TCP 分片导致丢包
优化:PPv2 解析不再占用 worker,解决高并发阻塞
新增:PPv2 读取超时控制(默认 3s)
调整:默认并发参数与测试稳定性优化

Release v0.81.8

Choose a tag to compare

@github-actions github-actions released this 28 Apr 19:29
稳定性修复,暂时没有添加新功能

Release v0.81.7

Choose a tag to compare

@github-actions github-actions released this 22 Apr 16:18
支持Proxy Protocol v2

Release v0.81.6

Choose a tag to compare

@github-actions github-actions released this 13 Apr 14:07
避免 FIN 后 TLS 尾写引发RST

Release v0.81.5

Choose a tag to compare

@github-actions github-actions released this 13 Apr 02:56
修复OpenBSD平台GO语言不支持TFO的问题

修复了TFO ,实现了长连接和网络优化

Choose a tag to compare

@fcchbjm fcchbjm released this 12 Apr 17:23

针对DoT服务器做了以下优化

  1. 修复TCP Fast Open(TFO)
  2. 实现了长连接
  3. 网络优化,减少RST报文

实现TCP Fast Open(TFO) 实现TLS会话恢复 优化TCP挥手RST问题

Choose a tag to compare

@fcchbjm fcchbjm released this 12 Apr 08:29

实现TCP Fast Open(TFO)
实现TLS会话恢复
优化TCP挥手RST问题

修复内部模块名引用

Choose a tag to compare

@fcchbjm fcchbjm released this 07 Apr 08:29
v0.81.2

更改模块名引用