我们在地址 1.1.1.1 和 1.0.0.1 处遇到了来自 Cloudflare 的服务,或者“公共 DNS 架已到达!”

我们在地址 1.1.1.1 和 1.0.0.1 处遇到了来自 Cloudflare 的服务,或者“公共 DNS 架已到达!”

云耀公司 提交 公共 DNS 地址:

  • 1.1.1.1
  • 1.0.0.1
  • 2606:4700:4700 :: 1111
  • 2606:4700:4700 :: 1001

据说该政策是“隐私第一”,以便用户可以放心地了解其请求的内容。

该服务的有趣之处在于,除了通常的 DNS 之外,它还提供了使用技术的能力 DNS-过TLS и 通过HTTPS的DNS,这将极大地防止提供商沿着请求路径窃听您的请求 - 并收集统计数据、监控、管理广告。 Cloudflare 声称,宣布的日期(1 年 2018 月 04 日,或美国符号中的 01/XNUMX)并非偶然选择的:一年中的哪一天会出现“四个单位”?

由于 Habr 的受众精通技术,所以传统的部分“为什么需要 DNS?” 我会把它放在文章的最后,但在这里我会说一些更实际有用的东西:

如何使用新服务?

最简单的事情是在您的 DNS 客户端中指定上述 DNS 服务器地址(或在您使用的本地 DNS 服务器的设置中指定为上游)。 替换通常的值是否有意义 谷歌域名系统 (8.8.8.8 等),或稍微不太常见 Yandex 公共 DNS 服务器 (77.88.8.8 和其他类似的)到 Cloudflare 的服务器 - 他们会为您决定,但适合初学者 时间表 响应速度,据此,Cloudflare 比所有竞争对手都快(我要澄清一下:测量是由第三方服务进行的,当然,到特定客户端的速度可能会有所不同)。

我们在地址 1.1.1.1 和 1.0.0.1 处遇到了来自 Cloudflare 的服务,或者“公共 DNS 架已到达!”

使用新模式会更有趣,其中请求通过加密连接发送到服务器(事实上,响应是通过它返回的),即提到的 DNS-over-TLS 和 DNS-over-HTTPS。 不幸的是,它们不支持“开箱即用”(作者认为这“还”),但在您的软件(甚至在您的硬件)中组织它们的工作并不困难:

基于 HTTP 的 DNS (DoH)

顾名思义,通信是通过 HTTPS 通道进行的,这意味着

  1. 着陆点(端点)的存在 - 它位于该地址 https://cloudflare-dns.com/dns-query
  2. 可以发送请求并接收响应的客户端。

请求可以采用以下定义的 DNS 线格式: RFC1035 (使用 POST 和 GET HTTP 方法发送),或以 JSON 格式(使用 GET HTTP 方法发送)。 对于我个人来说,通过 HTTP 请求发出 DNS 请求的想法似乎出乎意料,但其中有一个合理的颗粒:这样的请求会经过许多流量过滤系统,解析响应非常简单,生成请求甚至更容易。 通常的库和协议负责安全性。

直接从文档请求示例:

DNS Wireformat 格式的 GET 请求

$ curl -v "https://cloudflare-dns.com/dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" | hexdump
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7f968700a400)
GET /dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB HTTP/2
Host: cloudflare-dns.com
User-Agent: curl/7.54.0
Accept: */*

* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
HTTP/2 200
date: Fri, 23 Mar 2018 05:14:02 GMT
content-type: application/dns-udpwireformat
content-length: 49
cache-control: max-age=0
set-cookie: __cfduid=dd1fb65f0185fadf50bbb6cd14ecbc5b01521782042; expires=Sat, 23-Mar-19 05:14:02 GMT; path=/; domain=.cloudflare.com; HttpOnly
server: cloudflare-nginx
cf-ray: 3ffe69838a418c4c-SFO-DOG

{ [49 bytes data]
100    49  100    49    0     0    493      0 --:--:-- --:--:-- --:--:--   494
* Connection #0 to host cloudflare-dns.com left intact
0000000 ab cd 81 80 00 01 00 01 00 00 00 00 03 77 77 77
0000010 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
0000020 01 c0 0c 00 01 00 01 00 00 0a 8b 00 04 5d b8 d8
0000030 22
0000031

DNS Wireformat 格式的 POST 请求

$ echo -n 'q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB' | base64 -D | curl -H 'Content-Type: application/dns-udpwireformat' --data-binary @- https://cloudflare-dns.com/dns-query -o - | hexdump

{ [49 bytes data]
100    49  100    49    0     0    493      0 --:--:-- --:--:-- --:--:--   494
* Connection #0 to host cloudflare-dns.com left intact
0000000 ab cd 81 80 00 01 00 01 00 00 00 00 03 77 77 77
0000010 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
0000020 01 c0 0c 00 01 00 01 00 00 0a 8b 00 04 5d b8 d8
0000030 22
0000031

相同但使用 JSON

$ curl 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=example.com&type=AAAA'

{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": true,
  "CD": false,
  "Question": [
    {
      "name": "example.com.",
      "type": 1
    }
  ],
  "Answer": [
    {
      "name": "example.com.",
      "type": 1,
      "TTL": 1069,
      "data": "93.184.216.34"
    }
  ]
}

显然,很少有(如果至少有一个)家庭路由器可以通过这种方式使用 DNS,但这并不意味着明天不会出现支持 - 并且有趣的是,在这里我们可以在我们的应用程序中完全实现使用 DNS(正如已经 将使 Mozilla,仅在 Cloudflare 服务器上)。

基于 TLS 的 DNS

默认情况下,DNS 查询不加密传输。 DNS over TLS 是一种通过安全连接发送它们的方法。 Cloudflare 按照规定在标准端口 853 上支持 DNS over TLS RFC7858。 这使用为主机 cloudflare-dns.com 颁发的证书,支持 TLS 1.2 和 TLS 1.3。

建立连接并按照协议工作的过程如下:

  • 在建立 DNS 连接之前,客户端会存储 cloudflare-dns.com 的 TLS 证书(称为 SPKI)的 base64 编码的 SHA256 哈希值
  • DNS 客户端与 cloudflare-dns.com:853 建立 TCP 连接
  • DNS客户端发起TLS握手过程
  • 在 TLS 握手过程中,cloudflare-dns.com 主机会提供其 TLS 证书。
  • 一旦建立了 TLS 连接,DNS 客户端就可以通过安全通道发送 DNS 查询,从而防止请求和响应被窃听和伪造。
  • 通过 TLS 连接发送的所有 DNS 查询必须符合 通过 TCP 发送 DNS.

通过 DNS over TLS 的请求示例:

$ kdig -d @1.1.1.1 +tls-ca +tls-host=cloudflare-dns.com  example.com
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(1.1.1.1), port(853), protocol(TCP)
;; DEBUG: TLS, imported 170 system certificates
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG:  #1, C=US,ST=CA,L=San Francisco,O=Cloudflare, Inc.,CN=*.cloudflare-dns.com
;; DEBUG:      SHA-256 PIN: yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=
;; DEBUG:  #2, C=US,O=DigiCert Inc,CN=DigiCert ECC Secure Server CA
;; DEBUG:      SHA-256 PIN: PZXN3lRAy+8tBKk2Ox6F7jIlnzr2Yzmwqc3JnyfXoCw=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, The certificate is trusted.
;; TLS session (TLS1.2)-(ECDHE-ECDSA-SECP256R1)-(AES-256-GCM)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 58548
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1

;; EDNS PSEUDOSECTION:
;; Version: 0; flags: ; UDP size: 1536 B; ext-rcode: NOERROR
;; PADDING: 408 B

;; QUESTION SECTION:
;; example.com.             IN  A

;; ANSWER SECTION:
example.com.            2347    IN  A   93.184.216.34

;; Received 468 B
;; Time 2018-03-31 15:20:57 PDT
;; From 1.1.1.1@853(TCP) in 12.6 ms

此选项似乎最适合满足本地网络或单个用户需求的本地 DNS 服务器。 确实,标准的支持不是很好,但是 - 让我们希望吧!

用两个词解释对话内容

DNS 缩写代表域名服务(所以说“DNS 服务”有点多余,该缩写已经包含“服务”一词),用于解决一个简单的任务 - 了解特定主机名具有的 IP 地址。 每当有人点击链接或在浏览器地址栏中输入地址(例如“https://habrahabr.ru/post/346430/”),一个人的计算机正在尝试找出哪个服务器发送请求以接收页面内容。 对于 habrahabr.ru,DNS 的响应将包含 Web 服务器的 IP 地址的指示:178.248.237.68,然后浏览器将尝试联系具有指定 IP 地址的服务器。

反过来,DNS 服务器在收到请求“名为 habrahabr.ru 的主机的 IP 地址是什么?”后,会确定它是否知道有关指定主机的任何信息。 如果没有,它会向世界上的其他 DNS 服务器发出请求,并逐步尝试找出所提出问题的答案。 因此,在找到最终答案后,找到的数据会发送到仍在等待的客户端,并且存储在 DNS 服务器本身的缓存中,这将使您下次更快地回答类似的问题。

一个常见的问题是,首先,DNS 查询数据以明文形式传输(这使得有权访问流量的任何人都能够隔离 DNS 查询和他们收到的响应,然后根据自己的目的对其进行解析;这使得能够为 DNS 客户端准确定位广告,这是相当多的!)。 其次,一些 ISP(我们不会指责,但不是最小的)倾向于显示广告而不是一个或另一个请求的页面(实现方式非常简单:而不是 habranabr.ru 查询的指定 IP 地址)主机名,随机人因此,返回提供商的网络服务器的地址,其中提供包含广告的页面)。 第三,有些互联网接入提供商实施了一种机制,通过将有关被阻止 Web 资源的 IP 地址的正确 DNS 响应替换为包含存根页面的服务器的 IP 地址来满足阻止单个站点的要求(因此,访问此类站点明显更复杂),或者发送到执行过滤的代理服务器的地址。

您可能应该在此处放一张网站​​上的图片 http://1.1.1.1/,用于描述与服务的连接。 作者似乎对其 DNS 的质量非常有信心(但是,很难对 Cloudflare 抱有任何其他期望):

我们在地址 1.1.1.1 和 1.0.0.1 处遇到了来自 Cloudflare 的服务,或者“公共 DNS 架已到达!”

人们可以充分理解该服务的创建者 Cloudflare:他们通过维护和开发世界上最受欢迎的 CDN 网络之一(其功能不仅包括分发内容,还包括托管 DNS 区域)来谋生,而且,由于那些人的愿望, 谁不精通,教那些 他们不认识谁, 对此 去哪儿 在全球网络中,经常会遭受服务器地址被封锁的困扰 我们不会说是谁 - 因此,对于公司来说,拥有一个不受“喊叫、口哨和涂鸦”影响的 DNS 意味着对其业务的损害较小。 技术优势(虽然微不足道,但很好:特别是对于免费 DNS Cloudflare 的客户来说,可以即时更新公司 DNS 服务器上托管资源的 DNS 记录)使得使用帖子中描述的服务变得更加有趣。

只有注册用户才能参与调查。 登录拜托

您会使用新服务吗?

  • 是的,只需在操作系统和/或路由器上指定即可

  • 是的,我将使用新协议(DNS over HTTPs 和 DNS over TLS)

  • 不,我有足够的当前服务器(这是公共提供商:Google、Yandex 等)

  • 不,我什至不知道我现在在用什么

  • 我使用递归 DNS 和通往它们的 SSL 隧道

693 位用户投票。 191 位用户弃权。

来源: habr.com

添加评论