要讲DoT和DoH,不可避免的我们要重温一下DNS协议的历史。

DNS协议在1987年甚至更早的时候就被规范好,那个年代互联网安全还不是严重的威胁,DNS协议使用非可靠的UDP和TCP协议。

UDP是一个无状态的传输协议,尽管在传递数据时非常快,但它是无法避免攻击的。此外,在数据传递时,因为网络状态差的时候,很容易发生丢包的情况。此外,UDP是明文在网络上传输。

TCP相对于UDP安全性是略高。它的可靠体现在TCP在传递数据之前,会通过三次握手来建立连接。

然而TCP就是完美的解决方案吗?并不尽然。

正是因为TCP的三次握手机制,导致TCP很容易被利用来实现DOS等攻击时至今日,互联网的安全环境已经截然不同。假设用户被某个攻击者盯上,我们来看原来的使用UDP和TCP协议可能存在什么样的安全隐患:

1)无法验证对端的身份

当浏览器接收到一个DNS的响应时,它无法确认这个响应是否来自它信任的DNS服务商。在DNS服务商答复之前,攻击者可能抢先主动发送一个虚假的DNS响应,让用户采用他提供的IP地址作为解析结果,而忽略正规服务商的响应结果。

2)无法确保数据的安全

DNS报文以明文的方式在网络中传输,是一件危险的事情。攻击者能看到你访问的是哪个网站,也能看到DNS服务商给你答复的内容。如果攻击者篡改了回复给用户的响应报文,比如将响应中的IP地址替换成了恶意地址,被攻击的用户并不知情的。

假设攻击者利用上述安全隐患对用户的DNS攻击成功,他就可能把你想访问的银行的网址转移到自己的恶意地址上。比如说小明在想访问工商银行的网站“www.icbc.com.cn",正常情况下,浏览器收到DNS服务商解析后的合法IP地址,网页请求会被发送到工商银行的服务器上;然而攻击者的存在导致浏览器拿到了错误的IP地址,网页请求被发送到了恶意服务器上。攻击者只需要在恶意服务器上山寨一个肉眼无法分辨出来的银行页面,在用户操作的时候就能非法盗取用户的银行账号信息,而这一切用户完全感知不到。

为了解决此类的问题,人们想出了很多的办法改进或扩展DNS协议。比如说让DNS协议中携带的网址大小写变得随机,这样攻击者就难以准确猜测到正确的网址,比如说在报文里面添加校验验证报文的来源或报文数据是否被篡改过等。

目前看来最为安全有效的方式,是DoT/DoH方案。

DoT全称是DNS over TLS,它使用TLS协议来传输DNS协议。TLS协议是目前互联网最常用的安全加密协议之一,我们访问HTTPs的安全基础就是基于TLS协议的。相比于之前使用无连接无加密的UDP模式, TLS 本身已经实现了保密性与完整性。

那么 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 。

PC端教程:

如果您使用的是Chrome浏览器(83及以上),只需要在Chrome浏览器的设置项中设置好DNS访问安全选项即可。操作步骤如下:

进入到Chrome浏览器设置页面,在设置搜索框中搜索DNS。
1:点击搜索结果中的“安全”,往下拉,就能看到DNS安全设置。
2:输入DNS安全服务提供商地址:
https://doh.pub/dns-query

微信图片_20200728101230.png

如果你使用的是Chrome浏览器(78-82),那么首先你需要
1:点击:chrome://flags/#dns-over-https
2:将Secure DNS lookups这里的Default修改为Enabled。

02.png

3:进入网络设置-更改适配器选项-右键-选择ipv4-点击属性
4:点击高级-选择dns-在弹出“DNS服务器”下方框中输入:162.14.21.56或者162.14.21.178(正式上线后会更改,请同步关注)

03.png

使用FireFox也可轻松设置,与Chrome步骤类似。进入到设置页面,搜索“dns”,点击“网络设置”,下拉后勾选“DNS over HTTPS“,输入DNS安全服务商地址https://doh.pub/dns-query即可

04.png