目录

简介

DNS over HTTPS利用HTTP协议的GET命令发出经由JSON等编码的DNS解析请求。较于传统的DNS协议,此处的HTTP协议通信处于具有加密作用的SSL/TLS协议(两者统称作HTTPS)的保护之下。但是,由于HTTPS本身需要经由多次数据来回传递才能完成协议初始化,其域名解析耗时较原DNS协议会显著增加。[1]DNS over TLS(缩写:DoT)是通过传输层安全协议(TLS)来加密并打包域名系统(DNS)的安全协议。[2]本文基于RFC 8484 - DNS Queries over HTTPS (DoH)介绍DoH协议的详情。

此外,本文还基于Boost的Asio、Beast实现了DoH和DoT的解析器ink19/Boost.dns

详情

DoH和DoT的请求包编码方式就是基于普通的DNS编码,具体可以参考这一篇博文[3]。为了简便,本文使用了c-ares[4],对DNS的请求和回包进行解析。

请求

DoH

DoH的请求基于HTTPS,其将DNS的请求包使用base64编码,放在了dns参数上,如:

GET /dns-query?dns=BAABAAABAAAAAAABBGhvbWUFaW5rMTkCY24AAAEAAQAAKQIAAAAAAAAA HTTP/1.1
Host: doh.pub
User-Agent: Boost.Beast/347
Accept: application/dns-message

其中需要注意的是Acceptapplication/dns-message

DoT

DoT是直接数据流传输,因此不需要使用base64编码,但是为了方便读写,需要在请求包前增加两个字节的请求长度。如:

std::vector<boost::asio::const_buffer> req_buff;
uint16_t send_len = req.size();
send_len = htons(send_len);
req_buff.push_back(asio::buffer(&send_len, sizeof(send_len)));
req_buff.push_back(asio::buffer(req.data(), req.size()));

返回

DoH

DoH的回包放在body中,为二进制。直接读取解析即可。

DoT

DoT的回包和请求包类似,使用二进制,并有两个字节为前导长度。

c-ares的使用

打包

打包使用函数ares_create_query,签名为

#include <ares.h>

int ares_create_query(const char *name,
int dnsclass,
int type,
unsigned short id,
int rd,
unsigned char **buf,
int *buflen,
int max_udp_size);

获取的buf,使用结束后需要使用ares_free_string释放。

dnsclasstype<arpa/nameser.h>中定义;id为16位,用于标记请求id;rd用于标识是否需要递归解析。

解析

解析使用ares_parse_xxxx_reply函数,比如A类型解析的签名为

#include <ares.h>

int ares_parse_a_reply(const unsigned char *abuf, int alen,
struct hostent **host,
struct ares_addrttl *addrttls, int *naddrttls);

其中host需要使用ares_free_hostent进行释放。

使用方法为(注:该函数的使用方法在官方文档中描述的比较模糊,本文是在github中搜索ares_parse_a_reply后,找到了node库使用该函数的方法[5]

struct hostent *hosts;
int ret = ares_parse_a_reply((const unsigned char *)rsp.data(), rsp.size(),
&hosts, NULL, NULL); for (int i = 0; hosts->h_addr_list[i] != NULL; ++i) {
uint32_t ip = ntohl(*(uint32_t *)hosts->h_addr_list[i]))
}
ares_free_hostent(hosts);

  1. DNS over HTTPS - 维基百科,自由的百科全书

  2. DNS over TLS - 维基百科,自由的百科全书

  3. 自己动手实现DNS协议 - 苍青浪 - 博客园

  4. c-ares documentation | c-ares: a modern asynchronous DNS resolver

  5. node/src/node_cares.cc at 496be457b6a2bc5b01ec13644b9c9783976159b2 · kuno/node

DoH(DNS on HTTPS)和DoT(DNS on TLS)协议详解的更多相关文章

  1. DNS协议详解

    DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...

  2. HTTP&HTTPS协议详解之HTTP篇

    一.HTTP简介 01.什么是HTTP HTTP(HyperText Transfer Protocol ,超文本传输协议),是一个基于请求与响应的,无状态的,应用层的协议,常基于TCP/IP协议传输 ...

  3. 第六章 应用层(DNS和http协议详解)

    序言 这是计算机网络基础的最后一篇博文了,大体的从物理层到最上层的应用层做了一个大概的了解,花了也有快1个月的时间了,在本章结尾会给你们我学习该课程的视频资料,我希望能帮到所有想学习想提高自己技术的同 ...

  4. ssl和https协议详解

    转自:https://cuiyongxiu.com/201102/24157.html ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输 ...

  5. https协议详解

    HTTPS协议建立过程 1) 客户端首次发送请求时,由于客户端(浏览器等)对一些加解密算法的支持程度不一样,但是在TLS传输中必须使用相同的加解密算法,所以在TLS握手的阶段,客户端告诉服务器端自己支 ...

  6. 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)

    不多说,直接上干货! https://github.com/ 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可以关注我的个人博客:    http ...

  7. RTSP、HTTP、HTTPS、SDP四种协议详解

    我们将主要讲解RTSP,HTTP,HTTPS, SDP四种协议.  一:RTSP协议简介 实时流协议RTSP是一个应用层协议,用于控制具有实时特性的数据(例如多媒体流)的传送. RTSP协议一般与RT ...

  8. HTTPS协议详解(一):HTTPS基础知识

    HTTPS基础知识:HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息. ...

  9. HTTPS协议详解(三):PKI 体系

    转自:https://blog.csdn.net/hherima/article/details/52469488 1.RSA身份验证的隐患    身份验证和密钥协商是TLS的基础功能,要求的前提是合 ...

  10. [转] 详解http和https的作用与区别

    PS: https就是http和TCP之间有一层SSL层,这一层的实际作用是防止钓鱼和加密.防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名.另外是加密,加密需要一个密钥交换算法, ...

随机推荐

  1. 配置 Windows Boot Manager

    配置 Windows Boot Manager 通常需要使用 bcdedit 命令,这是一个命令行工具,用于管理 Boot Configuration Data (BCD) 存储.BCD 存储包含了启 ...

  2. 页面多次跳转加载时,window.onscroll方法失效问题解决

    1. vue mounted 方法中,写有滚动监听方法,为A页面 window.scroll = function () { .... } 从A页面跳转到B页面,再从B页面跳转回A页面, window ...

  3. .NET 9 中 LINQ 新增的功能

    LINQ介绍 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称.数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持.此外,需要针对每种 ...

  4. RxJS 系列 – 大杂烩

    前言 RxJS 有太多方法了, 想看完整的可以去看 REFERENCE – API List, 这篇介绍一些非 operator 的常用方法. NEVER NEVER.subscribe({ comp ...

  5. JavaScript Library – Swiper

    前言 官网已经有很好的教程了, 这篇只是记入一些我用过的东西和冷门知识. 参考 官网安装 官网 Demo 安装 yarn add swiper JS import Swiper from 'swipe ...

  6. Parquet.Net: 将 Apache Parquet 移植到 .NET

    Parquet.Net 是一个用于读取和写入 Apache Parquet 文件的纯 .NET 库,使用MIT协议开源,github仓库:https://github.com/aloneguid/pa ...

  7. Android dtbo(3) 编译和验证

    您可以使用设备树编译器 (DTC) 编译设备树源文件.不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果. 1. 通过DTC进行编译 构建主 DT .dts ...

  8. 对于ChannelNet的一点理解

    主要是为了个人理解,做个笔记 1.Pytorch代码 2.论文出处 3.详细介绍 这篇论文在2018年发出来,而ShuffleNet是从2017年由旷视发出来.起初了解shufflenet的提出,主要 ...

  9. PCI-5565反射内存卡

    PCI-5565反射内存卡是一种用于实时网络的硬件设备.它基于反射内存网的原理,通过光纤连接多台计算机,形成网络节点,并且每个节点上的网络内存卡存储着其他节点的共享数据拷贝.该反射内存卡可以插在多种总 ...

  10. KubeSphere 社区双周报 | 4.8 深圳站 Meetup 火热报名中 | 2023.3.17-3.30

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...