重构黑名单匹配算法,采用Trie前缀树数据结构替换原有的后缀匹配, 将百万级域名匹配复杂度从O(n)降至O(L),显著提升性能。 同时优化黑名单文件加载机制,支持hosts格式和通配符匹配, 并实现文件修改自动重载功能,提升系统的灵活性和实用性。 refactor: 重构README文档结构和内容展示 更新项目介绍文档,优化整体布局结构,添加项目徽章标识, 精简功能特性描述,改进快速开始指南,提供更清晰的使用说明。 chore(deps): 更新项目依赖库至最新版本 升级github.com/miekg/dns至v1.1.72版本, 更新golang.org/x/net至v0.52.0版本, 升级golang.org/x/sync至v0.20.0版本, 以及其他相关依赖库的版本更新。
🚀 Go-DoT: 高性能 DNS-over-TLS 缓存代理
Go-DoT 是一个用 Go 语言编写的生产级 DNS-over-TLS (DoT) 缓存代理服务器,专注于隐私保护、极致性能与高可用性。
✨ 特性概览
| 功能 | 描述 |
|---|---|
| 🔒 加密传输 | 支持 RFC 7858,默认强制 TLS 1.3 |
| ⚡ 高效匹配 | 基于 Trie(前缀树)实现百万级黑名单匹配,复杂度 O(L) |
| 🧠 请求合并 | 使用 Singleflight 防止缓存击穿 |
| 🚀 并发查询 | 并行请求上游 DNS,返回最快响应 |
| 📦 智能缓存 | 支持正向缓存 + NXDOMAIN 负缓存(LRU) |
| 🧹 优雅退出 | 支持 SIGTERM 信号 |
| 🧩 隐私保护 | 默认移除 ECS(EDNS Client Subnet) |
🏗️ 快速开始
1. 编译构建
需要 Go 1.22 或更高版本:
git clone https://git.aixiao.me/aixiao/dot.git
cd dot
go mod tidy
go build -ldflags="-s -w -X 'main.BuildDate=$(date)'" -o dot
2. 生成 TLS 证书(测试用)
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=dot.local"
3. 启动服务
./dot \
-cert aixiao.me.cer \
-key aixiao.me.key \
-addr :853 \
-upstream 119.29.29.29:53,223.5.5.5:53,114.114.114.114:53 \
-blacklist-file blacklist.txt \
-v
⚙️ 参数说明
| 参数 | 默认值 | 描述 |
|---|---|---|
| -addr | :853 | DoT 监听地址 |
| -cert | server.crt | TLS 证书路径 |
| -key | server.key | TLS 私钥路径 |
| -upstream | 8.8.8.8:53,1.1.1.1:53 | 上游 DNS |
| -blacklist-file | 空 | 黑名单文件路径 |
| -blacklist-rcode | REFUSED | 命中黑名单返回码:REFUSED / NXDOMAIN / SERVFAIL |
| -v | false | 启用详细日志模式 |
🧱 黑名单功能
支持 hosts + 通配符格式:
# 注释
ad.doubleclick.net
*.tracking.com
127.0.0.1 malicious-site.io
命中后直接返回指定 RCODE,并附带 EDE 说明。
🔍 缓存机制
-
缓存键: Type|DO|CD|ECS|Domain 组合键,确保不同请求策略的结果物理隔离。
-
TTL 策略:
- ✅ 正向缓存: 取记录中最小 TTL 与配置上限的较小值。
- 🚫 负面缓存: 遵循 RFC 2308,自动计算 SOA 的最小 TTL 进行缓存。
🧩 工作流程
flowchart TD
A[客户端请求] --> B{黑名单匹配}
B -- 命中 --> C[返回拦截]
B -- 未命中 --> D{缓存命中}
D -- 命中 --> E[返回缓存]
D -- 未命中 --> F[Singleflight]
F --> G[并发查询上游]
G --> H[写入缓存]
H --> I[返回结果]
🛡️ 生产建议
- 提高文件描述符限制:ulimit -n 65535
- 使用合法 CA 证书(Android/iOS 必须)
- 关闭 -v 日志提升性能
- 配置 ≥3 个上游 DNS
👨💻 作者
- Author: niuyuling
- Email: aixiao@aixiao.me
- License: MIT
- Repository: https://git.aixiao.me/aixiao/dot
Description
Languages
Go
75.5%
Shell
18.3%
Dockerfile
6.2%