docs(readme): 重构 README 文档结构与内容以提升可读性

- 更新项目标题图标并优化描述语句
- 重新组织特性列表为表格形式,增加 ECS 剥离、黑名单过滤等功能说明
- 补充快速开始章节,细化源码构建与 Docker 使用方式
- 调整参数说明表,新增黑名单相关配置项及缓存条目限制
- 增加缓存机制详解、黑名单功能使用示例与架构图
- 更新开发依赖信息与推荐编译参数
- 修正作者信息展示格式并添加仓库链接

feat(cache): 改进缓存键生成逻辑与 EDNS 元数据处理

- 使用 dns.CanonicalName 规范化域名避免重复缓存键
- 缓存条目中保存 EDNS 扩展信息(version, rcode, EDE)
- 修复缓存读取函数返回值,传递完整缓存元数据
- 调整 TTL 计算优先级,仅在必要时检查 Extra 区域
- 黑名单匹配提前拦截请求,跳过上游查询
- 启动日志中显示黑名单规则数量与返回码设置
```
This commit is contained in:
2025-10-15 14:19:55 +08:00
parent 916a7c8127
commit 4060e83686
5 changed files with 404 additions and 90 deletions

185
README.md
View File

@@ -1,22 +1,23 @@
# 🧠 DNS-over-TLS Cache Proxy
# 🧩 DNS-over-TLS Cache Proxy
一个基于 Go 的高性能 **DNS-over-TLS (DoT)** 缓存代理服务器。
支持多上游并发解析、智能缓存、隐私保护与优雅关闭。
轻量、无依赖、可直接部署。
一个**Go** 编写的高性能 **DNS-over-TLS (DoT)** 缓存代理服务
专为隐私保护与性能优化而设计。支持多上游并发解析、智能缓存、ECS 剥离和优雅关闭。
## 特性
## 🚀 特性概览
- 🔒 **加密传输** — 完全支持 DNS-over-TLS (RFC 7858)
-**多上游并发查询** — 类似“快乐眼球”机制,提升解析速度
- 🧠 **TTL 智能缓存** — 支持正向与负面缓存RFC 2308
- 🧹 **自动清理** — 定期清除过期缓存
- 🧩 **隐私保护** — 默认剥离 ECS (EDNS Client Subnet)
- 🪶 **轻量高效** — 单文件可执行,零外部依赖
| 功能 | 描述 |
|------|------|
| 🔒 **加密传输** | 完全支持 DNS-over-TLSRFC 7858支持 TLS 1.2/1.3 |
| ⚡ **多上游并发解析** | “快乐眼球”机制并行查询多个上游 DNS取最快响应 |
| 🧠 **智能缓存系统** | 支持正向与负面缓存RFC 2308动态 TTL 调整 |
| 🧹 **自动清理机制** | 定期清理过期缓存项(默认每 5 分钟) |
| 🧩 **隐私保护** | 默认剥离 ECS (EDNS Client Subnet),防止地理泄露 |
| 🧱 **黑名单过滤** | 支持域名黑名单(后缀匹配、文件或命令行加载) |
| 🪶 **轻量高效** | 单一可执行文件,无外部依赖,易于容器化部署 |
## 🏗️ 快速开始
## 📦 安装
### 🧰 源码构建
### 从源码构建
```bash
git clone https://git.aixiao.me/aixiao/dot.git
@@ -24,98 +25,138 @@ cd dot
go build -o dot main.go
```
### 🐳 Docker 构建
### 使用 Docker 构建与运行
```bash
#构建、启动
# 构建镜像
bash build.sh build
# 运行容器
bash build.sh run
#清理
# 查看日志
bash build.sh logs
# 停止与清理
bash build.sh stop
bash build.sh clean
```
> 🧩 默认镜像名为 `dot:latest`,监听 `853` 端口,可通过 `PORT` 环境变量修改。
## 🚀 启动服务
## ⚙️ 启动示例
```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
./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
```
输出示例:
```
启动日志示例:
```bash
🚀 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` | 监听地址 |
| `--addr` | `:853` | 监听地址(支持 IPv4/IPv6 |
| `--cert` | `server.crt` | TLS 证书路径 |
| `--key` | `server.key` | TLS 私钥路径 |
| `--upstream` | `8.8.8.8:53,1.1.1.1:53` | 上游 DNS 服务器 |
| `--cache-ttl` | `60s` | 最大缓存 TTL |
| `--upstream` | `8.8.8.8:53,1.1.1.1:53` | 上游 DNS 服务器列表 |
| `--cache-ttl` | `60s` | 缓存最大 TTL正向/负面均适用) |
| `--timeout` | `3s` | 上游查询超时 |
| `--max-parallel` | `3` | 并发上游查询数 |
| `--max-parallel` | `3` | 最大并发上游查询数 |
| `--strip-ecs` | `true` | 是否剥离 ECS 信息 |
| `--tcp-fallback` | `true` | 是否启用 TCP 回退 |
| `--v` | `false` | 详细日志模式 |
| `--tcp-fallback` | `true` | UDP 截断时是否自动 TCP 回退 |
| `--blacklist` | 空 | 逗号分隔的黑名单域名或通配后缀 |
| `--blacklist-file` | 空 | 黑名单文件路径(每行一个规则) |
| `--blacklist-rcode` | `REFUSED` | 黑名单命中返回码:`REFUSED` / `NXDOMAIN` / `SERVFAIL` |
| `--cache-size` | `10000` | LRU 缓存最大条目数 |
| `--v` | `false` | 启用详细日志模式 |
## 🔍 缓存机制详解
## 🧪 测试解析
**缓存键格式:**
使用 `kdig``dig` 进行测试:
```sh
domain|type|class|DO|CD
```
**缓存策略:**
-**正向缓存**:取最小 TTL 与配置上限的较小值
- 🚫 **负面缓存**:遵循 RFC 2308从 SOA.MINIMUM 计算 TTL
- 🧭 **动态 TTL 调整**:返回时按剩余时间递减 TTL
- 🧹 **自动清理**:每 5 分钟扫描并删除过期条目
- 🔒 **隔离逻辑**DO/CD 不同查询独立缓存空间
## 🧱 黑名单功能
支持两种配置方式:
1. 命令行参数:
```bash
./dot -blacklist="*.ads.com,*.tracking.net"
```
2. 文件加载(每行一个域名或后缀):
```sh
# blacklist.txt
*.ads.com
*.malware.net
```
启动命令:
```bash
./dot -blacklist-file=blacklist.txt -blacklist-rcode=NXDOMAIN
```
黑名单命中后不再上游查询,直接返回指定 RCODE。
## 🧩 架构与运行原理
```mermaid
flowchart TD
A[Client (DoT Request)] --> B[DNS-over-TLS Server]
B --> C[Cache Lookup]
C -- HIT --> D[Return Cached Response]
C -- MISS --> E[Upstream Resolver Pool]
E -->|Fastest Response| F[DNS Response]
F --> G[Cache Write]
G --> H[Return to Client]
```
## 🧰 开发与维护
- 语言:**Go 1.22+**
- 依赖:
- [`github.com/miekg/dns`](https://github.com/miekg/dns)
- [`github.com/hashicorp/golang-lru/v2`](https://pkg.go.dev/github.com/hashicorp/golang-lru/v2)
- 推荐编译参数:
```bash
go build -ldflags="-s -w" -o dot main.go
```
## 🧪 测试方法
使用 `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
**Author:** niuyuling
**Email:** [aixiao@aixiao.me](mailto:aixiao@aixiao.me)
**License:** MIT
**Language:** Go 1.22+
**Dependency:** [github.com/miekg/dns](https://github.com/miekg/dns)
**Repository:** [git.aixiao.me/aixiao/dot](https://git.aixiao.me/aixiao/dot)