```
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:
121
README.md
Normal file
121
README.md
Normal 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.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](https://github.com/miekg/dns)
|
||||
Reference in New Issue
Block a user