MENU

使用公共 DNS 上网的弊端

2018 年 09 月 02 日 • V2EX,分享

作为资深网民的我们都知道,本地 DNS 是非常重要的,它能决定你到底能不能上网。

由于本地运营商 DNS 常常被大家诟病容易遭到劫持等风险,使得很多人选用公共 DNS 来作为本地上网用的 DNS ,例如 114DNS 、阿里 DNS 等。

但是,喜欢用公共 DNS 的你,知道公共 DNS 在上网时会有什么弊端吗?

智能 DNS 和 CDN 简介

中国国内的互联网环境复杂,跨地区跨运营商之间的网络延迟较大,所以出现有智能 DNS 和 CDN 来解决这个问题。我所在的公司,北京快网就是咱们国内一家老牌的 CDN 服务提供商;CloudXNS 是一款智能 DNS 域名解析产品。

如果互联网站主财大气粗技术牛,在全国各地各运营商乃至全球都专门独立部署了站点,那么他可以通过智能 DNS 分区分运营商分别将域名解析到对应的站点;如果站主不具备这样多点部署的条件,那么他可以通过我们公司完成 CDN 的需求。

这就是智能 DNS 和 CDN 的最初的应用。

没错,就是【加速】。让北京联通的网民能访问到北京联通(或附近同运营商)的站点,广东电信访问到广东电信(或附近同运营商)的站点,从而达到加速的目的。

而智能 DNS 或 CDN 在调度判断网民归属时,是通过网民的本地 DNS 所属 IP 段来的。

所以,今天我要讨论到的公共 DNS 上网的弊端就是:它一定程度上违背了智能 DNS 和 CDN 加速的规则,变得不快了。

本地 DNS 和公共 DNS

网民在访问网站时,其本地 DNS 会去请求网站地址,如果本地 DNS 没有,它会再向上级 DNS 请求查询。

公共 DNS 是由一些企业提供的本地 DNS 服务,通常会给用户提供一个或多个 Anycast IP ,但实际背后有多个集群服务。

当用户上网时,客户端会向这个集群中的 A 地址请求解析,这个 A 地址被称为 DNS 入口;智能 DNS 在判断网民用户来源时,会使用 DNS 集群中的 B 地址与 IP 库进行比对,这个 B 地址被称为 DNS 出口。

所以上网过程中,用户将从 DNS 入口获取解析,NS 服务器会向 DNS 出口分配智能解析。如果用户的 DNS 入口没有请求的解析缓存时,将向上级 DNS 请求查询,最终会请求到 NS 服务器,然后用户才获取到解析结果。

那么当用户的 DNS 入口和 DNS 出口和用户的实际网络不一致时,就可能导致智能 DNS 提供的解析结果并不是最优的。

测试示例

北京XX网站www.fas**.com.cn使用了牛盾云安全作了页面加速和安全防护,正常情况下使用运营商 DNS 在全国各地的解析情况如下图所示:

请输入图片描述

这是通过智能 DNS 和 CDN 双剑合璧的最优解析结果。

例如我的所在地是湖北武汉,当使用本地运营商 DNS 并存在缓存时,ping www.fas.com.cn时延如下:

请输入图片描述

而我在本地模拟ping浙江台州的牛盾节点122.226.182.43,会看到时延稍微长一些:

请输入图片描述

那么公共 DNS 的出入口会不会跟实际网络不一致呢?

公共 DNS 的入口

以阿里 DNS 223.5.5.5 为例。

我在本地对阿里 DNS 的做了一个路由跟踪:

请输入图片描述

可以发现,阿里 DNS 的入口在浙江杭州,而我本地网络是湖北电信。

公共 DNS 的出口

刚刚和北京同事进行远程会议时提到这个议题,正好他的 PC 配置的是阿里公共 DNS ,我们让他访问 CloudXNS 运维工具 - 本地DNS优化诊断获取其出口 DNS ,得到的反馈如下:

请输入图片描述

本地网络北京联通,出口 DNS 竟是广东电信,这远远比我前述举例的湖北电信和浙江电信的差距大得多。

解析影响验证

该同事分别用阿里和运营商 DNS 对网易域名做了测试对比。

使用阿里 DNS 测试结果:

请输入图片描述

使用运营商 DNS测试结果:

请输入图片描述

使用运营商 DNS 时,ping值快得多。

当我们使用公共 DNS 上网时可能会因为该 DNS 的出口与本地实际网络所属区域和运营商不一致而导致调度不准,进而影响连接速度可能变慢。

如果是支持 Edns-Client-Subnet 的公共 DNS,还会存在我说的问题吗?

什么是 Edns-Client-Subnet ?

Edns-Client-Subnet,简称 ECS,是由 Google 提交的一份 DNS 扩展协议,主要作用是允许 DNS resolver 传递用户的 IP 地址给权威 DNS 服务器。

关于 ECS 的 RFC 草案提出了很多年,直到 2016 年 5 月才被纳入正式 RFC 7871

过去我曾在 CloudXNS 官方文章 《【CloudXNS 教您几招】如何让多 ip 域名配置游刃有余?[1]》中侧面提到过关于 ECS 的概念及测试示例,感兴趣的小伙伴可以先去看看。

ECS 支持现状

过去 ECS 一直作为一个 RFC 草案存在,真正成为规范至今也仅仅一年。

如果要让域名的来访用户真正能访问到正确的区域和运营商站点,不仅仅用户使用的本地 DNS 要支持 ECS,同时域名使用的权威 DNS 也要支持。

而事实上,ECS 的普及程度并不高。目前市场上支持 ECS 的权威 DNS 不多,支持 ECS 的递归 DNS 更是少之又少。像在中国,就并没有哪个运营商的本地 DNS 支持。

同时,更多的网站主并不很了解 DNS 相关业务知识。大多数站主随便找个注册商购买了一个域名然后填写几条记录并完事,懂得多点的知道找个智能 DNS 做分区解析。仅此而已。

那么,假设域名使用了支持 ECS 的智能 DNS 和 CDN,访问的用户也使用支持 ECS 的公共 DNS,这中间还会不会有什么问题呢?

ECS 的弊端

访问网站时的解析时间将可能增加

我们知道,DNS 是有逐级缓存的。我们常常访问的网站大多可以直接从本地 DNS 缓存中读取解析结果,只有当我们是整个区域及运营商中访问某个冷门站点的第一个用户,才会最终到权威 DNS 上去查询站点的解析结果。这时候解析时间会远高于访问热门站点。(不懂的话,再去温习一下《从理论到实践,全方位认识DNS(理论篇)》

如果 DNS 查询请求使用包含 ECS 信息(比如 192.168.1.0/24 ),那么 DNS 响应会返回一个 /0,即为每个人缓存。这代表每个子网的缓存结果都是独立的,如果你的子网中过去从未有人使用支持 EDNS 的本地 DNS 访问过某个网站,这意味着你将从头走一遍域名解析。

ECS 可能也并不能解决网络归属问题

RFC 7871 中有提到,当增加 ECS 信息后将可能带来生日攻击(章节 11.2)。为了解决这个问题,当响应包中的 ECS 选项不够完整时,则应该被丢弃该 ECS 回复,即使请求中有 ECS 信息。

那么一旦这种例外的情况在用户的一般使用中出现,这个 DNS 便依然解决不了用户网络归属的问题。

结语

事实上,网络延迟和 DNS 解析是网站访问中很重要但可能并不会明显拖慢速度的环节。我们仍可以综合考虑访问速度和安全等多方面来选择使用本地递归 DNS:净网大使选个优质的公共 DNS,懒癌患者就自动获取 DNS,某 DNS 的钟情粉丝就继续抱住你那家那位去吧。

优化工具

要是你是个仅仅只追求速度的 Windows PC 用户,CloudXNS 提供的“一键优化 DNS 设置”(点击下载)工具可以一用。

引用&转载

Ephen Blogx1
Ephen Blogx2

最后编辑于: 2019 年 07 月 29 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

已有 1 条评论
  1. 不死鸟

    该换图了。新浪目前还能用的就是 tva1-4