Files
dot/README.md
aixiao f5bf77927d feat(blacklist): 实现基于Trie树的高性能黑名单匹配系统
重构黑名单匹配算法,采用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版本,
以及其他相关依赖库的版本更新。
2026-03-20 14:39:29 +08:00

128 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚀 Go-DoT: 高性能 DNS-over-TLS 缓存代理
[![Go Version](https://img.shields.io/badge/Go-1.22+-00ADD8?style=flat&logo=go)](https://golang.org)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
[![Security](https://img.shields.io/badge/TLS-1.3_Only-green.svg)](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3)
**Go-DoT** 是一个用 Go 语言编写的生产级 **DNS-over-TLS (DoT)** 缓存代理服务器,专注于**隐私保护、极致性能与高可用性**。
---
## ✨ 特性概览
| 功能 | 描述 |
|------|------|
| 🔒 加密传输 | 支持 RFC 7858默认强制 TLS 1.3 |
| ⚡ 高效匹配 | 基于 Trie前缀树实现百万级黑名单匹配复杂度 O(L) |
| 🧠 请求合并 | 使用 Singleflight 防止缓存击穿 |
| 🚀 并发查询 | 并行请求上游 DNS返回最快响应 |
| 📦 智能缓存 | 支持正向缓存 + NXDOMAIN 负缓存LRU |
| 🧹 优雅退出 | 支持 SIGTERM 信号 |
| 🧩 隐私保护 | 默认移除 ECSEDNS Client Subnet |
---
## 🏗️ 快速开始
### 1. 编译构建
需要 Go 1.22 或更高版本:
```bash
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 证书(测试用)
```bash
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=dot.local"
```
### 3. 启动服务
```bash
./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 + 通配符格式:
```text
# 注释
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 进行缓存。
---
## 🧩 工作流程
```mermaid
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