公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

1. 前言

DoH(DNS over HTTPS),顾名思义,使用HTTPS协议执行DNS查询,除了最常用的UDP外,还有DoT(DNS over TLS),DNS over HTTP(服务提供商自定义)等方案,对比如下:

协议 标准 描述
DNS over HTTPS RFC8484 使用TLS加密的HTTP/2执行DNS查询
DNS over TLS RFC7858 使用TLS加密的TCP执行DNS查询
DNS over HTTP 服务提供商自定义 使用自定义加密的HTTP/1.1执行DNS查询

移动端的DNS优化已经有很多实践,最常见的是DNS over HTTP,通过加密的HTTP请求规避运营商对DNS的UDP包劫持,从而优化App访问服务器的延迟。但这个方案并没有形成统一的标准,通常需要内嵌DNS服务提供商的SDK,通过访问固定的 BGP或任播IP获取DNS响应。

大概是意识到DNS在移动互联网中的扮演越来越重要的角色,在DoT和DoH的规范相继推出后,许多DNS服务提供商都跟进了部署,国内的阿里云、DNSPod,国外的谷歌、Cloudflare等目前已经推出了免费的DoT和DoH服务。

客户端方面,常用的Chrome、FireFox已经支持了自定义DoH服务器,macOS、iOS也可通过配置文件设置系统范围的默认DoH服务器。

笔者也正好有一个自定义DNS的需求:

  1. 需要针对一些域名的DNS查询仅返回IPv4记录

  2. 使用的某某路由器系统的自定义DNS服务仅支持设置UDP和DoH

  3. UDP模式默认使用53端口,不可修改,UDP包容易遭受干扰

  4. DoH可自定义域名、端口且使用HTTP2作为传输协议,稳定性更强

综上,只有自建DoH服务了,于是就有了下面的折腾,最后测试时发现这个傻瓜路由器系统只支持一些特定的DoH服务商如阿里云DNS、DNSPod等,不支持自建的DoH服务。

2. 部署方案

DoH本质上就是一个HTTP请求,只是目前协议定义要求启用TLS与HTTP/2。最初没有跑通coredns的DoH时,使用了nginx作为前端转发DoH请求到doh-server,然后doh-server使用本地的coredns服务作为上游。

最近再仔细研究了下文档,发现coredns已经支持了DoH服务,可直接对外暴露服务,或者通过nginx转发来复用已经部署好的web服务。

2.1 nginx + doh-server + coredns

https://github.com/m13253/dns-over-https 是一个提供 DNS over HTTP 的服务,需要一个web前端和一个DNS后端,可用的docker镜像地址为:[satishweb/doh-server](https://hub.docker.com/r/satishweb/ doh-server),使用doh-server时,DNS请求流转如下:

HTTP Service -> doh-server -> DNS Server

RFC8484中指定使用/dns-query路径作为默认查询路径,因此只需要将该路径前缀的请求转发到doh-server即可,如下:

nginx配置(已配置好TLS与HTTP2)

server {listen 443 ssl http2 fastopen=256 reuseport;listen [::]:443 ssl http2 fastopen=256 reuseport;server_name doh.wbuntu.com...location /dns-query {proxy_redirect off;proxy_http_version 1.1;proxy_set_header Host $http_host;# show real IPproxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8053;}
}

doh-server

使用hostNetwork模式启动服务,监听8053端口

docker run -d --restart unless-stopped --network host --name doh-server \-e UPSTREAM_DNS_SERVER="udp:127.0.0.1:53" \-e DOH_HTTP_PREFIX="/dns-query" \-e DOH_SERVER_LISTEN="127.0.0.1:8053" \-e DOH_SERVER_TIMEOUT="10" \-e DOH_SERVER_TRIES="3" \-e DOH_SERVER_VERBOSE="true" \satishweb/doh-server

coredns

coredns配置文件如下

➜  ~ tree /etc/coredns/
/etc/coredns/
└── Corefile0 directories, 1 files
➜  cat /etc/coredns/Corefile
.:53 {bind 127.0.0.1forward . 1.1.1.1 1.0.0.1logerrorscache
}

使用hostNetwork模式启动服务,监听53端口

docker run -d --restart unless-stopped --network host --name coredns \-v /etc/coredns:/etc/coredns \coredns/coredns \-conf /etc/coredns/Corefile

服务启动后,我们可以得到一个自定义的DoH服务:https://doh.wbuntu.com/dns-query

2.2 coredns

目前coredns支持作为DoH服务端,不支持连接上游DoH服务器,上游服务器可使用UDP和DoT。

直接对外暴露服务需要使用有效的TLS证书,coredns配置文件及证书位置如下:

➜  ~ tree /etc/coredns/
/etc/coredns/
├── Corefile
├── tls.crt
└── tls.key0 directories, 3 files
➜  cat /etc/coredns/Corefile
https://.:443 {tls /etc/coredns/tls.crt /etc/coredns/tls.keybind 0.0.0.0forward . 1.1.1.1 1.0.0.1logerrorscache
}

使用hostNetwork模式启动服务,监听443端口

docker run -d --restart unless-stopped --network host --name coredns \-v /etc/coredns:/etc/coredns \coredns/coredns \-conf /etc/coredns/Corefile

服务启动后,我们可以得到一个自定义的DoH服务:https://doh.wbuntu.com/dns-query

2.3 nginx + coredns

直接暴露coredns服务到公网需要占用端口,coredns在未配置TLS证书时,可使用nginx作为前端来复用web服务,如下:

nginx配置(已配置好TLS与HTTP2)

server {listen 443 ssl http2 fastopen=256 reuseport;listen [::]:443 ssl http2 fastopen=256 reuseport;server_name doh.wbuntu.com...location /dns-query {proxy_redirect off;proxy_http_version 1.1;proxy_set_header Host $http_host;# show real IPproxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8053;}
}

coredns

coredns配置文件如下

➜  ~ tree /etc/coredns/
/etc/coredns/
└── Corefile0 directories, 1 files
➜  cat /etc/coredns/Corefile
https://.:8053 {bind 127.0.0.1forward . 1.1.1.1 1.0.0.1logerrorscache
}

使用hostNetwork模式启动服务,监听8053端口

docker run -d --restart unless-stopped --network host --name coredns \-v /etc/coredns:/etc/coredns \coredns/coredns \-conf /etc/coredns/Corefile

服务启动后,我们可以得到一个自定义的DoH服务:https://doh.wbuntu.com/dns-query

3. 测试

使用谷歌浏览器配置DoH服务:Settings -> Secutiry and Privacy -> Secutiry -> Advanced -> Use secure DNS

使用Go代码测试:github.com/mikumaycry/example/blob/main/2021/doh/main.go

package mainimport ("encoding/base64""fmt""github.com/miekg/dns""io/ioutil""net/http""os"
)func main() {query := dns.Msg{}query.SetQuestion("www.google.com.", dns.TypeA)msg, _ := query.Pack()b64 := base64.RawURLEncoding.EncodeToString(msg)resp, err := http.Get("https://doh.wbuntu.com/dns-query?dns=" + b64)if err != nil {fmt.Printf("Send query error, err:%v\n", err)os.Exit(1)}defer resp.Body.Close()bodyBytes, _ := ioutil.ReadAll(resp.Body)response := dns.Msg{}response.Unpack(bodyBytes)fmt.Printf("Dns answer is :%v\n", response.String())
}

本文转载自:「 Wbuntu 的博客」,原文:https://wbuntu.com/deploy-a-doh-service/ ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

你可能还喜欢

点击下方图片即可阅读

如何优雅的用 Nginx 在公网上快速搭建一个加密数据通道


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

如何快速的自建 DoH ( DNS over HTTPS) 服务相关推荐

  1. 如何为Win10开启DoH(DNS over HTTPS)

    Win11 Win11已原生支持DoH,参考这篇:启用Win11原生支持的DoH(DNS over HTTPS) 本文Win10的使用cloudflared实现,其他的工具比如smartdns也可以, ...

  2. [Linux] centos 6.5 httpd 自建CA 认证 实现 https 服务

    httpd 自建CA 认证 实现 https 服务 需要的软件: httpd mod_ssl openssl 本文将CA证书服务器和 httpd服务器放到一台物理机器上实现的, 可以作为学习的参考. ...

  3. centos 6.5 httpd 自建CA 认证 实现 https 服务

    httpd 自建CA 认证 实现 https 服务 需要的软件: httpd mod_ssl openssl 本文将CA证书服务器和 httpd服务器放到一台物理机器上实现的, 可以作为学习的参考. ...

  4. 启用Win11原生支持的DoH(DNS over HTTPS)和配置自定义的DoH服务

    更新 22.1.23:发现有的dns配置没有首选的dns加密,好像是用无线的时候就会没有,不影响,看情况2就行 为了方便,直接给出一些模板(国内可用的) netsh dns add encryptio ...

  5. 阿里云公共DNS安全传输服务介绍(DoH/DoT)

    概述 阿里公共DNS致力于为广大的互联网用户提供快速.稳定和安全的DNS解析.然而传统的DNS查询和应答采用UDP和TCP明文传输,存在网络监听.DNS劫持.中间设备干扰的风险: 网络监听风险:即便用 ...

  6. 微软不再为 DNS over HTTPS (DoH) 提供 Google PublicDNS 和 Cloudflare DNS 服务提供商

    如果你尝试在 Microsoft Edge 浏览器设置中自行选择 DNS 服务提供商,那么现在微软不再为 DNS over HTTPS (DoH) 提供 Google PublicDNS 和 Clou ...

  7. DNS:快速搭建公司内网DNS解析服务器

    背景 是这样的,公司办公室有小机房,研发测试开发环境在这,但是CTO吧,觉得测试环境通过ip访问太复杂,难记,通过黄页打开觉得太low,虽然办公室出口也有公网ip,直接可以解析进来,但是又觉得公网访问 ...

  8. DNS over HTTPs分析和威胁检测

    DNS over HTTPs分析和威胁检测 DNS over HTTPs分析和威胁检测 概述 特性 应用实现 公共DNS支持 利用DNS over HTTPS的恶意软件及活动 检测方法 情报收集和提取 ...

  9. 信安实践——自建CA证书搭建https服务器

    https://www.cnblogs.com/libaoquan/p/7965873.html 1.理论知识 https简介 HTTPS(全称:Hyper Text Transfer Protoco ...

最新文章

  1. Spring Cloud和Dubbo的区别
  2. 快速判断list是否为空
  3. html怎么实现多语言图片切换,JavaScript实现--中英语言切换功能
  4. 3150 Pibonacci数 - Wikioi
  5. net的retrofit--WebApiClient库
  6. vue 各组件 使用 Demo
  7. LeetCode 第 29 场双周赛(890/2259,前39.4%)
  8. 全国计算机网络教学研讨会,历届全国高校计算机网络教学研讨会
  9. Android 内存泄漏问题多多,怎么优化?
  10. Java Web的分页工具类
  11. C++学习网站——www.cplusplus.com
  12. 省选专练[USACO18JAN]Stamp Painting
  13. 附件 计算机 丢失,帮你找回Win7开始菜单附件丢失的工具
  14. 电机与电力拖动系统的仿真技术matlab/simulink(1)
  15. leggedrobotics free gait 足式机器人自由步态 苏黎世机器人系统实验室
  16. springboot 实现长链接转短链接
  17. python 基于PHP在线音乐网站
  18. 微信支付 SDK 惊现重大漏洞:黑客可 0 元购买任意商品
  19. VLAN的原理及配置
  20. 无可比拟的视觉环绕感 电子竞技游戏显示器就该选这样的带鱼屏

热门文章

  1. 大数据开发之安装mysql
  2. 基于(ztmap)BIM的数字孪生建造智慧机房管理后台展示系统
  3. Python----凯撒密码、将字符转换成ASCLL函数、将ASCLL码转换成字符函数
  4. BMP390高精度压力传感器数据读取与处理(基于STM32)
  5. 计算机页面错误代码,电脑Windows常见错误代码解析
  6. SAP UI5 Cross Application Navigation (跨应用间跳转)的本地模拟实现试读版
  7. 华为P40的软文营销文案
  8. HTML5情人节礼物2(女友3D相册)
  9. 网易云音乐打卡2.0(一天300首)10级指日可待
  10. 一个脚本打比赛之SMP WEIBO 2016