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