TheGreatAzizi/Secure-DNS-over-HTTPS-Cloudflare-Worker
GitHub: TheGreatAzizi/Secure-DNS-over-HTTPS-Cloudflare-Worker
部署于 Cloudflare Workers 的自建 DNS over HTTPS 解析器,通过并行竞速上游 resolver 提供快速、加密的 DNS 查询服务,帮助用户绕过 DNS 污染与运营商监控。
Stars: 168 | Forks: 22
# 🛡️ 安全 DNS over HTTPS (DoH) V2.2.0
### **一个具备全池模式、解析器配置、更安全验证和并行竞速的 Cloudflare Worker DoH 解析器**
[](https://workers.cloudflare.com)
[](https://github.com/TheGreatAzizi/Secure-DNS-over-HTTPS-Cloudflare-Worker)
[](https://x.com/the_azzi)
[](https://github.com/TheGreatAzizi/Secure-DNS-over-HTTPS-Cloudflare-Worker)
[](./README-Zh.md)
[](./README-Fa.md)

一个高性能的 Cloudflare Worker,提供一个带有内置多语言仪表板的**自定义 DNS-over-HTTPS endpoint**。版本 **2.2.0** 保留了原有的视觉设计,同时升级了后端,包括更安全的请求验证、有界的内存使用、upstream 超时、resolver 评分,以及一个新的**默认全池模式**。
**演示:** [dns.theazizi.ir](https://dns.theazizi.ir)
**默认 Endpoint:** `https://dns.theazizi.ir/dns-query`
## ✨ V2.2.0 的新功能
本 README 是针对 Worker **版本 2.2.0** 更新的。
关键的后端更改:
- `DEFAULT_PROFILE: 'all'`
- `/dns-query` 默认使用完整的 resolver 池
- 可选的配置:`default`、`security`、`family`、`adblock`、`dns64`
- 安全的 GET base64url 解码
- Method/content-type/body-size 验证
- DNS 数据包验证:要求必须且仅有一个 DNS question
- 使用 `AbortController` 为每个 upstream 设置超时
- `RACE_COUNT: 4`
- 有界的内存内 cache 和 throttle 映射
- SHA-256 cache 键
- 针对从 host 派生的 endpoint,进行更安全的 HTML 转义
- 使用 Clipboard API 回退的更简洁的 UI JS
- 更准确的隐私/安全措辞
## ⚠ 重要通知
### 1. Cloudflare Worker 子域可能会被过滤
默认的 Cloudflare Worker 域名(`*.workers.dev`)在某些网络环境中可能会被过滤或不可靠。为获得最佳效果,请将 Worker 绑定到一个**自定义域名**,例如:
```
dns.yourdomain.com
```
在 Cloudflare DNS 中,确保该域名已启用橙色云朵图标进行 **Proxied**。
### 2. 仅提供 DNS 服务,不是 VPN
此服务在客户端和您的 Worker endpoint 之间**加密 DNS 查询**。它**不会**更改您的公网 IP 地址,也**不会**隐藏您连接到的目标 IP。
要进行完整的流量隧道传输或 IP 掩码,请将其与 VPN、proxy、v2rayN、Hiddify、Nekoray、Clash 或其他隧道传输工具结合使用。
### 3. 能绕过与不能绕过的限制
此服务可以帮助解决 DNS 污染、DNS 劫持、ISP DNS 操纵以及 DNS 层面的屏蔽。
它不保证能绕过 IP 屏蔽、SNI 过滤、TLS/HTTPS 屏蔽、QUIC 屏蔽、DPI 或网络级别的限速。
## 🚀 架构:并行竞速引擎
传统的 DoH 服务通常依赖于单个 resolver。如果该提供商速度慢、被屏蔽或不可靠,整个服务就会变慢。此 Worker 使用了竞速引擎:
- **Resolver 竞速:** 对于每次 DNS 查询,Worker 会选择评分最高的 upstream resolver。
- **并发请求:** 它会同时对多个 upstream 发起竞速请求。
- **最快有效响应获胜:** 第一个有效的 DNS 响应将被返回给用户。
- **自愈评分:** 成功的 resolver 会增加评分。失败或超时的 resolver 会扣除评分。
- **超时保护:** 响应缓慢的 upstream 会通过 `AbortController` 被中止。
- **安全 Cache:** 频繁请求的记录可以从有界的内存 cache 中提供。
重要常量:
```
DEFAULT_PROFILE: 'all'
CACHE_TTL_SECONDS: 300
MAX_CACHE_ENTRIES: 5000
MAX_THROTTLE_ENTRIES: 20000
MAX_DNS_MESSAGE_BYTES: 4096
RATE_LIMIT_MAX_REQUESTS: 250
UPSTREAM_TIMEOUT_MS: 1800
RACE_COUNT: 4
```
## 🌐 Endpoint 和配置
### 默认的全池 Endpoint
```
https://dns.theazizi.ir/dns-query
```
默认 endpoint 使用:
```
DEFAULT_PROFILE: 'all'
```
这意味着 `/dns-query` 使用完整的 resolver 池,而无需 query 参数。
### 可选的配置 Endpoint
```
https://dns.theazizi.ir/dns-query?profile=default
https://dns.theazizi.ir/dns-query?profile=security
https://dns.theazizi.ir/dns-query?profile=family
https://dns.theazizi.ir/dns-query?profile=adblock
https://dns.theazizi.ir/dns-query?profile=dns64
```
| 配置 | 用途 |
|---|---|
| `all` | 完整的混合 resolver 池。这是默认模式。 |
| `default` | 平衡的公共 resolver,不混合 family/adblock/DNS64 策略。 |
| `security` | 专注于安全的 resolver,具备恶意软件/威胁过滤功能。 |
| `family` | 适合家庭安全过滤的 resolver。 |
| `adblock` | 可屏蔽广告/追踪器的 resolver。 |
| `dns64` | 适用于仅使用 IPv6/NAT64 网络的 DNS64 resolver。 |
## 📋 功能
- **✅ Cloudflare Worker 原生:** 完全运行在 Cloudflare Workers 上。
- **✅ 完整的 Resolver 池:** 包含大量的 DoH upstream。
- **✅ 默认常规查询:** `/dns-query` 默认使用完整的 resolver 池。
- **✅ 可选的分离配置:** 需要时可选择特定策略的 resolver 组。
- **✅ GET 和 POST DoH:** 支持标准的 DoH 请求方法。
- **✅ 更安全的 GET base64url 处理:** 拒绝无效的 GET query 数据。
- **✅ DNS 查询验证:** 验证消息大小、查询/响应标志位、QDCOUNT 和 question 格式。
- **✅ Upstream 验证:** 验证 DNS 响应 ID 和响应标志位。
- **✅ Resolver 评分:** 奖励健康的 resolver,并惩罚失败或超时的 resolver。
- **✅ 有界的 Cache 和 Throttle 映射:** 降低内存增长风险。
- **✅ 速率限制:** 基本的每 IP 250 个请求/分钟的限制。
- **✅ 多语言仪表板:** 支持英文、波斯文和中文界面。
- **✅ 健康检查 Endpoint:** `/health` 返回 resolver 评分和 runtime 状态。
## 📖 部署
1. 创建一个新的 Cloudflare Worker。
2. 粘贴 `worker.js` 代码。
3. 部署 Worker。
4. 从 `Settings -> Domains & Routes` 添加自定义域名。
5. 在 Cloudflare DNS 中,确保该域名已 **Proxied**。
6. 使用您的 DoH endpoint:
```
https://dns.yourdomain.com/dns-query
```
## 🔧 设置指南
### Chrome / Edge / Brave
1. 前往 `Settings -> Privacy and security -> Security`。
2. 启用 **Use Secure DNS**。
3. 选择 **Custom**。
4. 粘贴您的 endpoint:
```
https://dns.yourdomain.com/dns-query
```
如果浏览器提示提供商无效,请使用 DoH GET 请求测试 endpoint。即使 Worker 本身运行正常,某些网络或浏览器验证流程也可能会失败。
### Firefox
1. 打开 `Settings -> Privacy & Security`。
2. 找到 **DNS over HTTPS**。
3. 选择 **Max Protection** 或 **Custom**。
4. 粘贴您的 DoH endpoint。
### Android / iOS
Android 原生 Private DNS 需要 **DoT**,而不是完整的 DoH URL。对于此 Worker,请使用支持自定义 DoH 的客户端:
- Intra
- RethinkDNS
- Firefox Mobile
- Brave Mobile
### Windows
Windows 原生 DNS 设置通常不接受像此 Worker endpoint 一样的完整 DoH URL。推荐的选项:
- 浏览器级别的 Secure DNS
- YogaDNS
- dnscrypt-proxy
- v2rayN/Xray DNS 配置
- 任何支持自定义 DoH URL 的客户端
## 🧪 快速测试
一个健康的 DoH GET 请求应该返回:
```
HTTP 200
Content-Type: application/dns-message
```
响应可能会包含以下标头:
```
x-cache: HIT / MISS
x-profile: all
x-winner:
x-winner-lat:
```
## 🧩 关于 YouTube 及类似服务的说明
YouTube 依赖于多个域名,例如:
```
youtube.com
www.youtube.com
youtubei.googleapis.com
youtube.googleapis.com
googlevideo.com
ytimg.com
i.ytimg.com
ggpht.com
```
如果 DNS 查询解析正确,但网站仍然无法加载,说明网络可能屏蔽的不止是 DNS。在这种情况下,请使用基于 proxy/VPN/TUN 的客户端以进行完整的流量隧道传输。
## 👤 致谢与链接
开发者:**TheGreatAzizi**
Twitter/X: [@the_azzi](https://x.com/the_azzi)
标签:DNS, DNS over HTTPS, Docker 部署, Serverless, 数据可视化, 程序员工具, 网络基础设施, 网络安全, 网络运维, 自定义脚本, 隐私保护