许多支持DoH加密公共DNS在国内基本无法使用。
在此,我们考虑使用CF workers进行转发,搭建个人使用的DoH服务。
2023/02/25更新
先不考虑速度,下面实现的实际上是DNS转发,最终实际上是以CF Worker的IP为基准返回的结果。
我们可以考虑Cloudflare的定制DNS(不是域名cloudflare-dns.com或者1.1.1.1,在国内会被卡)。
Cloudflare控制面板 -> Cloudflare Zero Trust -> Gateway -> DNS Locations
添加当前的ip对应的location,可以获得对应的ipv4/ipv6 DNS服务器以及DoH/DoT地址。
IPv4
172.64.36.1
172.64.36.2
IPv6
2a06:98c1:54::3:828a
DNS over HTTPS
https://xxx.cloudflare-gateway.com/dns-query
DNS over TLS
xxx.cloudflare-gateway.com
前言
DoH与普通DNS的比较
-
普通DNS的传播是基于UDP的,其内容对转发者是透明的,故而消息容易伪造。
具体可参考RFC1035 -
DoH(DNS over HTTPS), 即利用HTTPS协议建立通道传播DNS信息,其内容对转发者是保密的,故而有一定安全性。
具体可参考RFC8484 -
二者比较,仅仅是DNS报文由UDP改为了HTTPS传输。
具体来说,假设DNS报文数据为发送data_query
,接收data_answer
,那么:- 普通DNS的UDP报文就是
data_query
去,data_answer
回 - DoH则有两种方式:
-
使用HTTP GET方法,在参数末尾加上base64后的数据,例如:
https://cloudflare-dns.com/dns-query?dns={base64(data_query)}
- 使用HTTP POST方法,同普通HTTP POST请求一样,直接上传
data_query
- 返回的数据均是
data_answer
-
- 普通DNS的UDP报文就是
实现原理
- 我们知道:
- 像谷歌、Cloudflare这些公共DNS并不是停摆了,只是在某些区域无法使用罢了。
- Cloudflare Workers部署的机器是可以流畅访问这些公共加密DNS的。
- 我们是可以通过Cloudflare Workers提供的域名,或者自己的域名访问Cloudflare Workers的。
- DoH和访问网页类似,都是进行一个HTTPS请求
- Cloudflare Workers免费版每天有 10 万次免费请求,对于个人通常足够。
- 我们只需要使用Cloudflare Workers代理HTTP请求即可。
具体实现
比较简单,源代码可以使用tina-hello/doh-cf-workers。
你可以直接点击ReadMe里面的Deploy with Workers
图标,一步一步来。
或者,也可以:
- 首页:https://workers.cloudflare.com
- 注册,登入,Start building,取一个子域名,Create a Worker。
- 复制 index.js 到左侧代码框,Save and deploy。如果正常,右侧应显示首页。
- 收藏地址框中的 https://xxxx.子域名.workers.dev,以后可直接访问。
其它
- 服务默认使用的是Cloudflare的公共DNS,如有需要,可对
index.js
第8行进行替换。
公共DNS可参考这篇文章 - 如果你有自定义域名托管在Cloudflare,你可以将
如果你想使用的链接是
https://xxx.com/aaaaa/dns-query?dns=xxxxx
在添加路由时,建议匹配xxx.com/aaaaa/dns-query*