【译】卡通图解DNS,你的信息怎么被泄露的?

【译】卡通图解DNS,你的信息怎么被泄露的?

HTTP简要课程

当一个人解释浏览器如何下载一个网页的时候,他们常常会这么说:

  1. 你的浏览器向服务器发送一个GET请求。
  2. 服务器返回一个包含HTML的文件响应。



这个系统就叫HTTP。

但是这个图有点过于简化了。你的浏览器不直接与服务器通信。可能是由于他们往往相离甚远。

一般,服务器可能距你几千英里以外。这之间可能没有直连你电脑和服务器的线路。



所以这个请求从浏览器到服务端,会经过许多人的手。响应返回回来的时候也会如此。

我把这个比喻为同学们在课堂上传递纸条。纸条的外面会写要传给谁,然后写的人把它交给附近的人,然后拿到纸条的这个人又把纸条传给他附近的人——这些人不一定是最终的接收方,而是这个传递路线上的经手者。



这里的问题在于,这条路径上的所有人都可以打开这个纸条然后读里面的内容。而且你事先无法知道这个纸条会经过哪些人手中。

可能其中的某人会做一些坏事...

比如把里面的内容公之于众



或者改变里面的内容



为了防止这些问题,一个新的、安全的HTTP版本出现了,叫做HTTPS。什么是HTTPS?就好比在每张纸条外面加了个锁。



浏览器和服务端都知道怎么处理这把锁,但是中间的那些人并不知道。

有了这个,即使信息被多人传递,只有你和网站能够看到信息的内容。

这解决了很多的安全问题。但是仍然有很多在浏览器和服务端之间传递信息是没有被加密的。这意味着中间的人仍然能够发现你在做什么。

一个数据会被暴露的地方是在与服务端建立连接的时候。当你发送初始信息给服务端的时候,你也发送了服务器名字(某些领域叫Server Name Indication)。这使得在一台机器上运行多个网站成为可能,因为通过这个名字它知道你请求的是哪一个。这个初始请求是建立加密连接的一环,但是这个初始请求它本身是不加密的。

另外一个信息暴露的地方是在DNS。所以,什么是DNS?

DNS:域名系统

在上面传纸条的比喻中,我说了接收方的名字会被写在纸条的外面,这在HTTP请求中也是如此...这个名字用来表明这个纸条要去哪。

但事实上你无法使用名字告诉他们纸条要去哪。这之前的路由都不知道你说的是谁。然而,你需要告诉他们的是IP地址。这中间的路由才知道你要把消息发往哪。



这里就有一个问题。如果你是网站的运营方,你不会想你的用户去记住你的IP地址。你会想给你的网站取一个上口的名字...好记的名字。

这就是为什么我们需要域名系统(DNS)。你的浏览器使用DNS把网站名字转换成IP地址。这个过程——把域名转成IP地址——叫做域名解析。



然后浏览器怎么知道如何去做这件事呢?

一个选项是你可以有一个很长的列表,像浏览器中的电话簿。但是当一个新的网站上线,或者迁移到新的服务器去,很难使你的列表保持更新。

所以与其用一个列表保存所有的域名,我们有许多互相关联的更小的列表。这使得他们能被单独地管理。



为了得到域名对应的IP地址,你需要找到包含这个域名的列表。这个过程就像寻宝游戏一样。

对于维基百科的英文版本网站en.wikipedia.org的寻宝是怎么样的?

我们把这个域名分成几部分:



有了这三部分,我们可以找到包含这个IP地址的列表。然而,我们在找寻的过程中需要一些帮助。这个帮我们找寻到宝藏(IP地址)的东西叫解析器(resolver)

首先,解析器会请求根DNS。它知道一些不同的根域名服务器,所以它会给其中的一个发送请求。解析器询问根DNS可以去哪找到更多关于.org顶级域名下的地址信息。

这个根DNS会给出一个知道.org下相关地址信息的服务器地址。



解析器会告诉告诉操作系统en.wikipedia.org的IP地址。

这个过程叫做递归解析(recursive resolution),因为你从一个服务器得到一个ip地址后,你需要回去向这个ip地址的服务器发起另一个相似的请求。

我说过我们需要一个解析器帮我们完成这一系列请求。但是浏览器是如何找到这个解析器的呢?一般,浏览器会委托操作系统去获得一个解析器。



那么操作系统是如何知道该采用哪个解析器呢?这里有两种方式。

你可以配置你的计算机去使用一个你信任的解析器。但是基本没多少人这么做。

人们大多使用默认配置。默认地,操作系统会使用当前网络提供的解析器。当计算器连接到网络并获得IP地址后,网络也会推荐一个解析器供使用。



这意味着你使用的解析器一天之内会变更好几次。如果你下午决定去一家咖啡店上网,那么你可能使用了一个与上午在家不同的解析器。当然如果你配置了你信任的解析器也是一样的,因为在dns协议里没有安全可言。

DNS是怎么被利用的

所以这个系统(DNS System)是如何让用户陷入一个弱势地位呢?

通常解析器会告诉DNS服务器你在查询的域名是什么。然而这个请求有时会包含你的整个IP地址。就算不是完整的IP地址,越多越多的请求会带上你的大部分IP地址,这能和其他的信息结合起来察觉出你的身份。



这意味着你询问过的每一个服务器都能知道你访问的网站是什么。不仅如此,还意味着你与服务器之间的所有中间节点也能看到你的请求。

这里有两种对用户的数据造成威胁的方式。主要是跟踪(tracking)和欺骗(spoofing)

跟踪(tracking)

就像我上面说的,很容易通过IP地址得知是谁在访问这个网站。这意味着DNS服务器和路径上的中间人——叫做on-path routers——能够建立一份你的画像。他们可以记录你访问的所有网站。

这些数据是十分有价值的。很多人和公司会花很多钱来知道你浏览了些什么。



于是你的数据就被收集和贩卖了。因为网络给你的解析器可能根本靠不住。

即使你信任你的网络推荐的解析器。那也仅限于你在家的时候。如我前面提到的,当你去咖啡店或酒店等的时候,你可能使用了一个不同的解析器。谁知道它会怎么处理你的数据。

在没有得到你同意的情况下收集和贩卖你的数据,这个系统还有一种更危险的利用方式。

欺骗(Spoofing)

说到欺骗,指的是你到DNS服务器之前的某人改变了返回的结果。欺骗者可能会告诉你你访问网站的假地址。这会阻止你访问真的网站同时引导你进入了诈骗网站。



比如,你实体超市进行购物。你想要在某宝某东查询某件商品的价格,看是否能在网上更便宜的买到。

但如果你连接的是超市的Wifi,你可能就用了他们的解析器。这个解析器可能劫持了你的电商的请求,然后欺骗你说网站不可访问。

此篇只翻译了文章中的教程部分,若想进一步了解Mozilla提出的安全解决方案Trusted Recursive Resolver (TRR) and DNS over HTTPS (DoH),请查看原文
原文链接:A cartoon intro to DNS over HTTPS
发布于 2018-10-18

文章被以下专栏收录