DoT:DNS over TLS
它使用TLS协议来传输DNS协议。TLS协议是目前互联网最常用的安全加密协议之一,我们访问HTTPs的安全基础就是基于TLS协议的。相比于之前使用无连接无加密的UDP模式, TLS 本身已经实现了保密性与完整性。
TLS协议的基本思路是证书+加密机制,双管齐下保证安全。证书相当于申请了一个合法的身份证,当客户端向服务器发起连接的时候,双方会相互校验一下身份,服务器把证书给客户端,客户端来校验证书的内容和合法性。
握手协议则是用的公钥加密法:首先,客户端会向服务器端索要并验证公钥,验证后双方会协商生成"对话密钥",类似于两个人独有的摩斯密码,在此之后, 双方就会采用对话密钥进行加密通信。
通俗的理解就是:你要和你的笔友写信,握手协议是你和你的笔友之间商量出来一套加密通信的方式,而证书则是保证拿到你寄出去的信的人是你的笔友本人。
DoH:DNS over HTTPS
使用HTTPs来传输DNS协议。DoH的安全原理与DoT一样,他们之间的区别只在于:DoH有了HTTP格式封装,更加通用。
DoT在专用端口上通过TLS连接DNS服务器,而DoH是基于使用HTTP应用程序层协议,将查询发送到HTTPS端口上的特定HTTP端点,这里造成的外界感知就是端口号的不同,DoT的端口号是853,DoH端口号443。
也许你会问:增加了握手的过程,以及数据增加了加密的步骤,是不是传输速度会变慢?
实际上,使用TLS或HTTPS的确会增加前期协商带来的时间损耗,但是!此处划重点:
通过对客户端侧改造和优化,采用本地缓存,提前预取,连接复用等技术方案,积极优化了整体流程,实现了与原DNS协议相近的时延效果!
其次,是客户端和服务器端生成的对话密钥是对称加密,运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
DoT 的服务器地址:dns.pub 或者 doh.pub
DoH 的地址:https://doh.pub/dns-query 。
DoQ:DNS over QUIC
DNS的隐私保护方面这几年有很多的解决方案,比如DoT, DoH等技术,实现起来基本上都是依赖于TLS,而现在的Quic本身也是基于TLS来实现的,相对于之前的技术方案又有什么区别呢?
简单来讲就是性能,前两种都是基于TCP+TLS的模式,这种模式代价就是上面提到的建立连接复杂,开销较大,同时本身TCP受限于MTU最大的数据传输单元限制,不如UDP传输灵活高效。另外Quic协议提供额外的错误纠正,可使得传输更有效(无需重传,直接通过纠正码进行数据恢复)。
当然DoH这种方式最大的优势除了直接复用了HTTP协议当前的优点外,隐藏性还是很高的,而DNS over Quic往往是独立的端口上进行数据传输,仍旧存在中间被阻塞或者监听(加密数据)的情况。
DNSoverQuic的方式,一般直接在Quic协议上进行DNS数据包传递,而不是借助于Quic+HTTP的模式,开发方面的话Go语言提供Quic-go库,rust语言提供了Quiche都可以用来提供协议的封装。