DNS 基础 Posted by xmpace on 2019-09-15

递归查询和迭代查询

DNS 的递归查询和迭代查询模式,并不是说 DNS 可以在这两种查询之间随意选择,而是指在不同的场景下,DNS 查询有适应其场景的查询模式。

如图,用户电脑对某域名发起 DNS 查询时,首先会向 递归域名服务器 发起查询,这个查询是递归查询,用户电脑发起查询后,并不会管 DNS 的具体解析流程,它只管向 递归域名服务器 要最终的 IP 结果。这个 递归域名服务器 一般是宽带运营商分配的 DNS 服务器。

递归域名服务器 收到请求后,它并不能马上给出结果,它需要通过各级域名服务器查询才能知道结果,它做的一系列查询叫迭代查询,递归域名服务器 会负责一步步将域名解析出来,最后返回一个 IP 给用户电脑。

现在,路由器成了家庭上网必备设备,因此,DNS 解析可能会经过家庭路由器,家庭路由器发起的 DNS 查询也是递归查询。

但如果你在路由器上安装一个 DNS 解析服务,将它变为一个 DNS 服务器的话,那路由器发起的 DNS 查询就是迭代查询了。此时用户电脑向路由器发起的 DNS 查询是递归查询。

发起的 DNS 查询是递归查询还是迭代查询,是由 DNS 请求包中的标志位指定的,域名服务器根据收到的请求包中的标志位做不同的处理。比如 递归域名服务器 收到递归查询,那它就要向各级 DNS 继续请求,直到拿到结果再返回给客户端。而 根域名服务器 收到迭代查询,它发现自己这里并没有所请求的域名解析结果,所以仅仅返回一个 NS 记录指示请求者向其它的域名服务器继续查询,自己任务就完成了。

解析过程

现在我们以 递归域名服务器 的视角来看一个示例域名的解析过程。

递归域名服务器 首先向 根域名服务器 发起请求,要发请求,首先得有 根域名服务器 的 IP 地址,IP 地址怎么来呢?根域名服务器 的 IP 地址是内置在 DNS 软件里的。

(在 DNS 解析的过程中,一般有多个服务器可选择时会随机选择一个。以此来达到负载均衡的目的。)

根域名服务器 并不知道 www.name.com 的域名 IP 地址是多少,但它知道 .com 域名都是 顶级域名服务器 负责的,于是返回 NS 记录指向 顶级域名服务器,指示 递归域名服务器顶级域名服务器 继续查询。

其实 NS 记录返回的也是域名,比如返回 NS 记录 c.gtld-servers.net 的意思是你要找的域名由 c.gtld-servers.net 负责,你去找它。但 NS 记录仅仅返回个域名,我去哪找这个 NS 的 IP 呢?毕竟在因特网上,有 IP 才能访问啊。

有两种方法,一种是返回 NS 域名的时候,顺便把它的 IP 也告诉你,这里就是这种情况,见下图。还有一种,只告诉你域名,不告诉你 IP,需要你自己再从头去解析这个 NS 域名的 IP,这种情况一会儿讲到。

IP 在 Additional Records 字段中一块返回了

递归域名服务器 选择一台 顶级域名服务器 继续发起请求,顶级域名服务器 也无法给出最终结果,于是返回 权威域名服务器 的 NS 记录,但是这里注意,顶级域名服务器 只返回了 权威域名服务器 的域名,并没有 IP 地址(上面说到的第二种情况)。

因此,为了查询这些 权威域名服务器 的 IP 地址,递归域名服务器 还得从头再把上面的过程来一遍。

有了 权威域名服务器 的 IP,就可以继续查询了,如果该域名配置较简单,这一步一般就可以拿到域名最终的 IP 地址了。

Glue 记录

上面的例子中,在向 顶级域名服务器 查询时,返回了 权威域名服务器 的 NS 记录,但没有返回 IP,需要 递归域名服务器 自己去从头解析一遍找 权威域名服务器 的 IP,这样做并不总是行得通的。

上面的解析过程,顶级域名服务器 如果只返回 NS 记录 a9-67.akam.net,而不返回 a9-67.akam.net 的 IP,那 递归域名服务器 又得解析 a9-67.akam.net 的 IP,最终又会回到 顶级域名服务器 查询 a9-67.akam.net 的域名,而 顶级域名服务器 又会返回 NS 记录 a9-67.akam.net,形成一个死循环。

为了破除死循环,就必须在返回 NS 记录时,将 NS 的 IP 一同返回,这种记录就叫 Glue 记录。

权威域名服务器

全球的 .com 域名都是由 VeriSign 公司管理的,但 VeriSign 公司并不直接对公众提供 .com 域名注册服务,而是将域名注册服务外包给了一些代理公司。

打个比方,VeriSign 是总代理,只要你资质足够,你就可以成为一级代理,一级代理公司有很多,如阿里云,腾讯云,CloudFlare 等等,总代理不对外零售,它只负责给一级代理批发域名,由一级代理对外零售。

所有的域名代理公司,都有自己的解析服务。如果你在阿里云注册域名,那么你的域名默认的 权威域名服务器 就是阿里的域名服务器。你也可以更换你域名的 权威域名服务器 到其它家,比如换到 CloudFlare,这些都可以在域名注册商阿里云上面设置。

如果你公司比较大,想搭建自己的 权威域名服务器,也是可以的。理论上,也应该在域名注册商那设置,并且应该设置 Glue 记录,但截至目前为止(2019年9月17日),阿里云还不支持该功能,如果需要此功能,可以使用 CloudFlare。

DNS 查询步骤比想象多

如前所述,如果返回的 NS 记录只有域名没有 IP,那么 递归域名服务器 还得从头再解析一遍 NS 的 IP,这就多了一遍解析了。

还有个 CNAME 记录也会导致额外的解析,CNAME 记录意思是给域名起别名,主要是为了方便维护域名。

比如 www.qq.com 首先会解析出来一个 CNAME 记录指向 public.sparta.mig.tencent-cloud.net,然后需要再解析一遍 public.sparta.mig.tencent-cloud.net 才能拿到 IP 地址。

DNS 缓存

虽然 DNS 查询步骤很多,但你也不必担心它的性能,因为上面说到的每一步查询,都有缓存。

在 DNS 响应记录中会有 TTL 字段,指示这次查询结果缓存多少秒。

因此除非缓存 miss 多次,否则,正常查询还是很快的。

正因为多级缓存的存在,因此域名失效的时间常常不准确,可能会比预期失效时间更长。

HTTP DNS

由此 DNS 响应是明文传输的,极易被篡改,于是,黑产横行,DNS 解析被各种劫持,黑产劫持了 DNS 解析,就可以把流量引到它的服务器了。虽然它不一定在这个服务器上监听账号密码,但是它可以篡改你的 HTTP 请求,比如给你的网页里插入一段 JS 广告代码之类的。这些还算好,有些劫持者,技术不过关,能直接改得你的网页白屏。

所以为了防劫持,就有了 HTTP DNS,用 HTTP 协议来解析域名,比如腾讯的 HTTP DNS,http://119.29.29.29/d?dn=www.dnspod.cn 返回 183.60.57.155

相当于直接抛弃 DNS 那一套协议了。

按地理位置路由

当域名解析到 权威域名服务器 这一步时,权威域名服务器 可以根据请求者(一般是 递归域名服务器)的 IP 返回不同的结果,比如,湖南的用户,就返回湖南的服务器 IP,北京的用户,就返回北京的服务器 IP。

这就是所谓的智能 DNS,根据用户不同线路,返回不同的 IP。CDN 就是这个原理,所以,总能将用户路由到距离他最近的静态缓存服务器。