Browsed by
Tag: cloudflare

公共 DoT 服务器

公共 DoT 服务器

初代 DNS 协议采用明文定义、基于 UDP 传递,在复杂的网络环境下,DNS 被污染、被篡改的情况尤其让人头痛。为改善这种情况,采用加密传输 DNS 内容不失为一个稳妥的方式。

目前有两种方式加密传输 DNS:(1)HTTPS,以及 (2)TLS。

HTTPS 方式通过加密的 HTTP 连接传递 DNS 报文, 而 TLS 显然就是通过加密的 TLS 连接传递报文。两种方式对 DNS 本身没有影响,只是采用了加密的传输而已。从效率的角度看,DNS over TLS (DoT)比 DNS over HTTPS (DoH)更好,毕竟 DoH 多了一层 HTTP 协议封装。

目前 Windows 系统默认都不支持 DoT,需要采用第三方的软件(某种程度上又变相引入了不安全因素)。比较好的解决方式是选择支持 DoT 的路由器,国内华为、荣耀等家用路由器不支持 DoT,而华硕、TPLink 等家用路由器支持 DoT。

公共 DNS 服务器一般都支持 DoT 服务,国内采用腾讯和阿里两家的公共 DNS 服务即可,默认的 DoT 服务器如下:

dot.pub      -- 腾讯 DNS 服务
223.5.5.5 -- 阿里 DNS 服务

香港地区(或者海外地区)建议采用 google 和 Cloudflare 的公共 DNS 服务即可,默认 DoT 服务器如下:

1.1.1.1 -- Cloudflare 的 DNS 服务
8.8.8.8 -- Google 的 DNS 服务
公共 DNS 服务器

公共 DNS 服务器

在路由器配置中,通常可以指定 DNS 服务器,如果不单独指定,那默认就是运营商给定的 DNS 服务器。考虑到国情在此,建议指定 DNS 服务器。

国内有很多家服务商能提供公共 DNS 服务,例如腾讯(DNSPod)、阿里等。综合这几年的使用情况看,采用腾讯和Cloudflare 两家的 DNS 服务器作为主备,对于我(坐标:深圳电信)是个比较好的选择。

通常,我设置 Cloudflare 家的 DNS 服务器作为主服务器,腾讯家的 DNS 服务器作为备用服务器。这两家也都支持 IPv6 以及 DoH 等,充分满足需要,下面列示这两家的信息。

Cloudflare:

IPv4: 1.1.1.1
IPv6: 2606:4700:4700::1111
DoH:  https://cloudflare-dns.com/dns-query

腾讯:

IPv4:119.29.29.29
IPv6: 2402:4e00::
DoH:  https://doh.pub/dns-query

如果使用 Firefox 浏览器并采用 DoH,默认就是 Cloudflare 的 DoH,无需额外配置。

Firefox 中的 DoH 配置
DoH in Firefox

Cloudflare 返回的DNS结果

Cloudflare 返回的DNS结果

最近查一个客户遇到的 SIP 呼叫问题,发现在检查 DNS 记录时有问题,没有正确获取 DNS 记录。切换了几个 DNS 服务器测试,只有 Cloudflare DNS 服务器(1.1.1.x 系列) 返回的DNS记录会触发问题。

这并不是说 Cloudflare 的DNS记录有错误,而是我们自己实现的 DNS 库没有考虑到该记录的不同寻常之处。Cloudflare 的返回结果确实有点与众不同。

下图是Google DNS 以及 Ali DNS 返回的DNS结果,请注意其中的 Name 字段的内容(0xC0 0x0C)

Google DNS 结果
Google / Ali DNS 返回结果

很明显,这种DNS结果采用了 compress 方式,通过 offset 来获取真正的Name。图中的 0x0C 实际就是偏移量,指向了包中的另一处地址。Compress 方式最直接的好处就是节省了包大小。

而 Cloudflare 的 DNS 结果如下图所示,直接将域名包含在 Name 中,以 0x03 标注开始,以 0x00 表示字符串结束。不再需要偏移指向其他地址。

Cloudflare 的 DNS 记录
Cloudflare DNS 返回的结果

这种方法的好处是够直接,不再需要跳转获取真实的域名信息。当然坏处是增加了数据包的大小。

我们测试了网络上大部分的 DNS 服务器,目前仅发现 Cloudflare 采取了这种方式,其他服务器都是采用 compress 方式。

站在“人”的体验角度,似乎 Cloudflare 更合理一些。但是要注意,compress 方式更符合计算机的处理,毕竟前面的 Queries 部分已经解析过 Name 了,没必要再解析一次。另一方面,直接 offset 寻址,也远远快于再一次通过判断0x00来解析Name 字符串。

因此我个人认为 Cloudflare 的处理方式,即拖慢了速度,又增加了数据包消耗。当然,以目前计算机的处理能力以及网络速度,这些都是浮云。我们的解决方式也是淡定地接受这个结果,并修改 DNS 库进行适配即可。

在本次查问题中,测试了网上公布的香港 DNS 服务器,全部拒绝了来自大陆 IP 地址的 DNS 请求,真有意思。