先推销一下自己的项目(手动 doge)
搭建一个个人 DoH 服务
Cloudflare 免费计划有每日额度限制,请不要随便公开自己的 DoH 端点。
前言
随便讲一下 DNS 的作用,和主题关系不大
我们访问互联网时,通常会在浏览器里输入一个网址。但计算机真正用来连接网络资源的是 IP 地址,而不是域名。因为 IP 地址不好记,所以才有了 DNS:它负责把 baidu.com 这样的域名转换成对应的 IP 地址。

能硬背 32 位 IPv6 地址的也是个狠人
传统 DNS 通常运行在 UDP 53 上,默认不加密,因此安全性和抗劫持能力都比较差。在早期 HTTP 环境下,DNS 劫持并不少见。为了解决这些问题,后来出现了几种加密 DNS 协议,比如 DoT、DoH 和 DoQ。
DoH 有什么用
DoH 全称是 DNS over HTTPS。简单来说,它会把 DNS 查询封装进 HTTPS 请求里,并通过 SSL/TLS 证书来保证传输过程的安全性。这里引用两段来自 Wiki 的数字身份认证说明:
“若注册者认定一个人的身份,是通过注册者信任的另外一个人来进行的。注册者信任的那个人就是身份认证机构(可以是一个自然人)。把数字身份比喻成一个证件,那么数字证书就是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这个人。”
“身份认证机构是人们注册公钥的机构。注册之后,身份认证机构就向注册者发一数字证书,也就是说在注册者的数字身份证上加签。服务有免费,也有收费。身份认证机构也可以是一个自然人,就如 PGP 和 GPG 系统所倡导的。”
简单来说,因为 DoH 使用 HTTPS 作为传输层,我们可以降低 DNS 查询被监听或篡改的风险。比如某些喜欢往 DNS 结果里“投毒”、把域名解析到 localhost 的情况,DoH 就能在一定程度上缓解。
项目实现的功能 (推销)
这个项目主要实现了下面几个功能:
- 通过
cf-forward-ip实现ECS的手动注入。翻译成人话就是:解析结果会尽量根据用户所在地区进行优化。 - 使用并发请求加速解析,并返回最快的上游结果。
- 为cloudflare,Meta提供了完整的ECH注入
- 带有简单过滤逻辑,可以识别错误的 DNS 返回;返回
localhost的结果也会被过滤。 - 为google解析的内容引用了Sheas Cealing的规则使其可以在国内访问
部署
搭建这个服务需要准备:
- 一个 Cloudflare 账号
- 一个托管到 Cloudflare 的域名
- 一个 GitHub 账号
部署步骤如下:
- Fork 我的项目。
.env 文件里的内容并保存。如果没有特殊需求,保持默认配置即可。
3. 登录 Cloudflare,进入 Workers 和 Pages,点击创建应用程序。
4. 选择连接到 GitHub,并选择刚刚 Fork 的项目。保持默认配置,直接部署。
5. 绑定一个域名。设置的域名或子域名尽量不要出现敏感词汇,否则容易被阻断。
等待部署完成后,就可以开始使用了。
使用
目前我确认 Chrome、Firefox 浏览器和 Windows 11 系统都支持配置 DoH。其他客户端是否支持,建议自行测试。
ECH实现的原理
cloudflare的ECH其实是公开的,而且很离谱的是全部ECH的密钥是同一个,更离谱的是cf关闭ECH的方式是把DNS上HTTPS字段的解析里面的ECH给删掉,所以说如果我们通过构建一个带有正确ECH的DNS解析结果就可以实现通过ECH与网站链接
Meta的情况会特殊一点。Meta本身是支持ECH的,但是由于不明的原因ECH没有公布在DNS中,跟cloudflare那些没有公布ECH的网站类似都是不公开ECH。问题是Meta的ECH是独立的,获取会比较麻烦。我在github的一个帖子中看到一个获取的方法,使用的是retry来实现ECH的获取。简单点说是如果你发送一个错误的ECH给服务器,如果服务器收到了会返回一个retry_config让你的浏览器重试,这个retry里面就包含正确的ECH字段,从而获取到正确的ECH。
然后对上述网站进行dns结果重写并注入ECH就可以使用ECH访问了