Files
dot/README.md
aixiao 916a7c8127 ```
feat(cache): 引入 LRU 缓存并优化缓存清理与 TTL 处理

- 使用 github.com/hashicorp/golang-lru/v2 替代原生 sync.Map 实现 LRU 缓存
- 修复缓存读写过程中的并发安全问题,使用 RWMutex 保护共享状态
- 调整缓存键结构注释,明确支持 TTL 和 LRU 策略
- 优化负面缓存 TTL 计算逻辑,更准确识别 NODATA 场景
- 在缓存写入前统一剥离伪 RR(如 OPT、TSIG)
- 增加 cache-size 命令行参数,支持配置 LRU 缓存最大条目数
- 移除旧的缓存清理协程中不必要的全量遍历逻辑
- 更新日志输出内容,包含 cache-size 配置项
```
2025-10-14 16:37:39 +08:00

2.8 KiB
Raw Blame History

🧠 DNS-over-TLS Cache Proxy

一个基于 Go 的高性能 DNS-over-TLS (DoT) 缓存代理服务器。
支持多上游并发解析、智能缓存、隐私保护与优雅关闭。
轻量、无依赖、可直接部署。

特性

  • 🔒 加密传输 — 完全支持 DNS-over-TLS (RFC 7858)
  • 多上游并发查询 — 类似“快乐眼球”机制,提升解析速度
  • 🧠 TTL 智能缓存 — 支持正向与负面缓存RFC 2308
  • 🧹 自动清理 — 定期清除过期缓存
  • 🧩 隐私保护 — 默认剥离 ECS (EDNS Client Subnet)
  • 🪶 轻量高效 — 单文件可执行,零外部依赖

📦 安装

🧰 源码构建

git clone https://git.aixiao.me/aixiao/dot.git
cd dot
go build -o dot main.go

🐳 Docker 构建

#构建、启动
bash build.sh build
bash build.sh run

#清理
bash build.sh stop
bash build.sh clean

🚀 启动服务

./dot \
  -cert=server.crt \
  -key=server.key \
  -addr=":853" \
  -upstream="8.8.8.8:53,1.1.1.1:53" \
  -cache-ttl=120s \
  -timeout=3s \
  -max-parallel=2 \
  -strip-ecs=true \
  -tcp-fallback=true \
  -v

输出示例:

🚀 starting DNS-over-TLS on :853
[req] A www.example.com. (id=40192 cd=false do=true from=127.0.0.1:58877)
[cache] MISS A www.example.com.
[answer] www.example.com. 300 IN A 93.184.216.34

🧩 配置参数

参数 默认值 说明
--addr :853 监听地址
--cert server.crt TLS 证书路径
--key server.key TLS 私钥路径
--upstream 8.8.8.8:53,1.1.1.1:53 上游 DNS 服务器
--cache-ttl 60s 最大缓存 TTL
--timeout 3s 上游查询超时
--max-parallel 3 并发上游查询数
--strip-ecs true 是否剥离 ECS 信息
--tcp-fallback true 是否启用 TCP 回退
--v false 详细日志模式

🧪 测试解析

使用 kdigdig 进行测试:

kdig @127.0.0.1 +tls-ca +tls-host=dot.local www.example.com

📊 缓存机制

  • 缓存键domain|type|class|DO|CD
  • 正向缓存:取最小 TTL 与配置上限的较小值
  • 负面缓存:依据 SOA.MINIMUMRFC 2308
  • 动态 TTL 续算:返回时根据剩余时间更新 TTL
  • 清理周期:每 5 分钟清除过期项

🔐 安全特性

  • 默认支持 TLS 1.2 / 1.3
  • 剥离 EDNS Client Subnet
  • 不缓存 OPT/TSIG 伪记录
  • 独立缓存空间隔离 DO/CD 查询

🧭 路线图

  • 支持 DoH (DNS-over-HTTPS)
  • LRU 缓存上限控制
  • 增加配置文件支持 (YAML/JSON)
  • 集成 Docker Compose & CI/CD

👨‍💻 作者信息

Email: aixiao@aixiao.me
License: MIT
Language: Go 1.22+
Dependency: github.com/miekg/dns