我们很难记住所有人的电话号码,大部分时候我们都需要通讯录帮助我们把一个人的姓名和号码联系起来。而 DNS 服务器干的事情和通讯录差不多,帮助我们把网址转换成 IP,让程序知道他们需要链接的服务器具体在哪里(或是服务器不存在)。
随着互联网技术的日新月异,大家上网的时候遇到下面的情况的概率却一点都没变少:
- 从官网下载内容的时候,下载的地址是一串 IP 而不是官网地址,而且下载下来的内容有的时候不是最新的。
- 打开一个网站以后,网站内有部分广告质量明显不如其他的广告,或者明显遮挡了网页中的内容
- 输错网站打开一个全是广告的页面
- 网站内的广告画风和整个网站完全不搭
- 经常性地遇到有些页面打不开(无法解析这个网址),但是过了一会儿又好了。
这些问题很多时候都是和你家的 DNS 设置有关系。
为什么会发生这些问题
只要你接入了互联网,互联网服务提供商(也被称为 ISP,以下简称: 运营商)都会下发两个 DNS 给你,这个就是运营商 DNS。
每个运营商在几乎在每个城市都会部署自己的独立的 DNS 服务器,这也是为什么同一个运营商在不同城市分发下来的 DNS 服务器的地址也都不一样。加上运营商是最了解 内容分发网络(也就是我们经常说的 CDN,CDN 主要起到两大作用,第一个是能让用户用最快的速度访问到用户想要访问的内容,第二点是能减少主服务器的所需要的带宽和维护成本)的位置和自家网络的情况,所以运营商 DNS 返回的结果应该是:最准确的、最合适的,响应时间短的以及 CDN 解析结果最准确的,简单来说就是:你能快速访问到位于你附近的有你想要访问到内容的服务器。
利用公共 DNS 服务来解决这个问题
解决上述这个问题的最快的办法就是使用公共 DNS 服务。
公共 DNS 服务器一般是由大公司搭建的,或者非盈利组织搭建的。公共 DNS 的本质上就是把你的查询请求转发给上游更权威的 DNS,所以一般这些公司或者组织提供的公共 DNS 服务器提供都是更安全、更准确的结果。
当然由于资金限制,公共 DNS 服务器不会每个城市都有一个。自然就会遇到使用公共 DNS 服务解析到的 IP 不是最快的情况。下图展示了相同网址使用运营商 DNS 解析到的结果和使用阿里云公共 DNS 解析到的两种延迟完全不同的结果( time-ios.apple.com 是一个通过 CDN 优化了网站):
小知识:怎么快速知道我到某个服务器之间的延迟?🤔
使用 ping 指令
ping 是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)
ping 会直接附带在任何的操作系统的内置终端(或者命令提示符)中,使用时,用户只需要使用 ping +网址/IP 地址
(如 ping 17.253.84.251
)并敲击回车即可得到结果。
因此,我们在挑选公共 DNS 的时候,要注意以下方面:
- 在线率:也被叫做 SLA 或者可靠性,DNS 服务器作为将网址和 IP 联系起来的唯一手段,如果在线率不够高,那么时不时就会遇到的无法解析网址的情况,大大降低网上冲浪的乐趣和连贯性。
- 响应速度:在访问一个新的网站时,DNS 对这个网站的响应速度会直接影响到当前网站的直观加载速度。
- 准确性: 即使不考虑 DNS 污染和投毒,DNS 对网站访问的结果是否准确是非常重要的。
- CDN 友好性:也被叫做 ECS 或是 EDNS,ECS 有助于帮助你获取最准确的 CDN 解析结果,这个也是我在挑选公共 DNS 最为看重的一点。
- DNS 出口位置: 在没有 ECS 的情况下,CDN 的权威 DNS 会根据公共 DNS 使用的请求 IP(也就是 DNS 出口)来判定你的运营商、你所在的位置,从而返回距离你最近的节点 IP。在有 ECS 的情况下,返回结果的所需要的时间会更低,CDN 判断会更准确。
受限于篇幅限制,下图只介绍符合 RFC 规范的(排除 IBM Quad9 DNS),拥有多个响应地点的(排除 360 公共 DNS)大型的,准确性也相对较好的(不会刻意投毒的),更重要的是 CDN 友好型的 公共 DNS 服务。延迟则由各个地方各个运营商决定,请自行测试。
利用安全的公共 DNS 服务解决这个问题
这是因为我们的 DNS 流量没有经过加密,就和曾经的 http 协议一样,运营商或是第三方还是能够清楚的知道:我们发起了一个 DNS 请求,我们想要知道 xxx 网站的地址。下图展示了一个 DNS 请求发起的过程,可以很清楚的看到,我请求了什么网址(用十六进制码显示,右侧是转义以后的结果)
如果我们给我们的 DNS 流量加个密,就和 https 流量一样,那么运营商不就不知道我们我们的 DNS 请求了吗。这就是 DNS over HTTPS (下文简称 DoH )和 DNS over TLS (下文简称 DoT )技术要做的事。他们分别利用 HTTPS (超文本传输安全协议)和 TLS(传输层安全协议)这两种行业通用的安全协议,将我们的 DNS 请求发往 DNS 服务器。运营商或是第三方在整个传输过程中,只能知道发起者和目的地,除此以外别的什么都知道,甚至都不知道你发起了 DNS 请求。同时 HTTPS 和 TLS 都会使用网络数字证书确保对面的身份,这样传输的过程中无论是任何第三方都不能修改 DNS 的请求内容和最后的结果。保证你请求的结果就是你最后想要的。
DoH 和 DoT 不仅能为经常被运营商和第三方劫持 DNS 的人群提供安全可靠的 DNS 解析结果,还能给极为看重隐私人群补上上网隐私保护流程中的最后一块短板。
下图是目前支持 DoH 或者 DoT 的 DNS 服务器列表
我应该怎么使用 DoH 和 DoT 技术
对于 iOS 设备
大家可以前往 App Store 中下载 Cloudflare App(也被称为 1.1.1.1),下载以后,打开应用,直接打开开关即可享用到来自 Cloudflare 提供的 DoH 服务。
Adguard iOS 版的用户可以手动选择 DNS 服务器(需要高级订阅),前往 Adguard iOS 版本的设置,选择 DNS,再选择合适的 DNS 服务器即可
,当然你也可以选择手动输入自定义的 DNS 服务器(DoH 和 DoT 均支持)使用这项功能。
对于 Android
Android 9 以及以上的版本,你可以前往无线和网络,选择指定加密 DNS 服务(部分设备上可能被命名为:私人 DNS)
,输入 DNS over TLS 的地址即可。
对于 Android 9 以下的版本,或者没有指定加密 DNS 服务,你可以前往各大应用市场下载 Intra 应用,进行配置。前往 Intra 的设置,选择 DNS over HTTPS 服务器,输入或者选择 DNS over HTTPS 服务器
即可。
当然,如果你是 Adguard Android 版的用户,你可以前往 Adguard Android 版本的设置,选择 DNS,再选择合适的 DNS 服务器即可
,和 iOS 版本一样你也可以选择手动输入自定义的 DNS 服务器,使用更适合自己的 DNS 服务器。
对于 macOS & Windows
对于完全不熟悉终端命令的用户来说,现在想在 macOS 或者 Windows 上得到安全可靠的解析,那么 Firefox 浏览器是目前唯一的选择,前往 Firefox 的设置,常规-网络设置-设置,选择启用基于 HTTPS 的 DNS
,这样就打开了 Firefox 上的 DoH 服务了。
当然,用户基数更大的 Chrome 在未来也会在实验性设置里提供对应的选项(本文写作时 Chrome 正式版本为 77,从 78 版本开始将在实验性设置里提供对应的选项,78 正式版本将在 10 月 22 日推送)。
打开你的 Chrome,在地址栏中输入 chrome://flags/#dns-over-https,回车,在右侧下拉箭头中选择 Enable。
这样就打开了 Chrome 78 上的 DoH 服务了。如果你自己有的代码基础,也可以选择 DNScrypt 作为本地的 DNS 客户端,提供安全可靠的 DNS 解析。当然你对代码有更深入的了解,想要给全家或是全公司提供安全的 DNS,那么红鱼的这份文档就特别适合你。当然,希望在未来这两大操作系统能加入对应的设置,给我们提供额外的安全的选择。
以上就是这篇文章的所有内容了,希望能够让你能够了解到目前的 DNS 的发展情况,并帮助到因为 DNS 被劫持或是默认 DNS 不那么好用,备受苦恼的你。
> 下载少数派 客户端、关注 少数派公众号 ,找到数字时代更好的上网方式 🏄♀️
> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒