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 配置项 ```
2.8 KiB
2.8 KiB
🧠 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 |
详细日志模式 |
🧪 测试解析
使用 kdig 或 dig 进行测试:
kdig @127.0.0.1 +tls-ca +tls-host=dot.local www.example.com
📊 缓存机制
- 缓存键:
domain|type|class|DO|CD - 正向缓存:取最小 TTL 与配置上限的较小值
- 负面缓存:依据 SOA.MINIMUM(RFC 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