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 配置项
```
This commit is contained in:
2025-10-14 16:37:39 +08:00
parent bcd0914b2f
commit 916a7c8127
7 changed files with 430 additions and 213 deletions

121
README.md Normal file
View File

@@ -0,0 +1,121 @@
# 🧠 DNS-over-TLS Cache Proxy
一个基于 Go 的高性能 **DNS-over-TLS (DoT)** 缓存代理服务器。
支持多上游并发解析、智能缓存、隐私保护与优雅关闭。
轻量、无依赖、可直接部署。
## ✨ 特性
- 🔒 **加密传输** — 完全支持 DNS-over-TLS (RFC 7858)
-**多上游并发查询** — 类似“快乐眼球”机制,提升解析速度
- 🧠 **TTL 智能缓存** — 支持正向与负面缓存RFC 2308
- 🧹 **自动清理** — 定期清除过期缓存
- 🧩 **隐私保护** — 默认剥离 ECS (EDNS Client Subnet)
- 🪶 **轻量高效** — 单文件可执行,零外部依赖
## 📦 安装
### 🧰 源码构建
```bash
git clone https://git.aixiao.me/aixiao/dot.git
cd dot
go build -o dot main.go
```
### 🐳 Docker 构建
```bash
#构建、启动
bash build.sh build
bash build.sh run
#清理
bash build.sh stop
bash build.sh clean
```
## 🚀 启动服务
```bash
./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` 进行测试:
```bash
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](https://github.com/miekg/dns)