DNS 是一个古老的协议,在互联网诞生之初的纯真年代便已出现,自然也有有古老协议的通病:不设防,或者说不安全。为了解决明文传输的问题,加密 DNS 的方案有很多,DoH 是其中之一,DoH 全称是 DNS Queries over HTTPS,其协议设计参考 RFC8484 。
在正常国家应该不太需要考虑自己部署 DoH 服务,但是中国大陆存在的 DNS 污染以及对国外公共 DoH 服务器的阻断导致了本文描述的这个需求。我的使用场景主要是作为 Adguard Home 的上游 DNS,提供无污染的/加密的境外服务域名解析。本文采用的技术方案是 coredns,下面简述步骤。
-
需要一台境外服务器,一个域名[^1],建议使用 acme.sh 项目申请 https 证书
-
coredns 官网下载二进制文件,配置文件如下,注意该配置文件只启用了 DoH 服务。
https://.:443 { tls ./acme/fullchain.pem ./acme/key.pem ./acme/ca.pem whoami forward . tls://1.1.1.1 log errors }
-
使用 DoH 测试工具 https://github.com/curl/doh 进行测试
当然你也可以采用 docker 方式部署。
参考链接
- coredns 官方网站 https://coredns.io/
- coredns 官方仓库 https://github.com/coredns/coredns
- https://j1ang.top/2021/09/24/deploy-DoH-service-to-protect-browsing-privacy.html
- 使用 CoreDNS 反向代理 CloudFlare DoH https://blog.kallydev.com/posts/use-coredns-to-reverse-proxy-cloudflare-doh
- DoH 测试工具 https://github.com/curl/doh
脚注
- [^1] Cloudflare 的 DoH 地址是 https://1.1.1.1 ,自然是可能给 IP 颁发 https 证书的,只是更罕见,限制更多。至少 Let’s Encrypt 不允许。