DNS 协议

要讲 DoT 和 DoH,不可避免的我们要重温一下 DNS 协议的历史。

DNS 的历史与安全问题

DNS 协议在 1987 年甚至更早的时候就被规范好,那个年代互联网安全还不是严重的威胁,DNS 协议使用非可靠的 UDP 和 TCP 协议。

UDP 的问题

UDP 是一个无状态的传输协议,尽管在传递数据时非常快,但它是无法避免攻击的。此外,在数据传递时,因为网络状态差的时候,很容易发生丢包的情况。此外,UDP 是明文在网络上传输。

TCP 的问题

TCP 相对于 UDP 安全性是略高。它的可靠体现在 TCP 在传递数据之前,会通过三次握手来建立连接。

然而 TCP 就是完美的解决方案吗?并不尽然。正是因为 TCP 的三次握手机制,导致 TCP 很容易被利用来实现 DOS 等攻击。

DNS 协议的安全隐患

时至今日,互联网的安全环境已经截然不同。假设用户被某个攻击者盯上,我们来看原来的使用 UDP 和 TCP 协议可能存在什么样的安全隐患:

隐患一:无法验证对端的身份

当浏览器接收到一个 DNS 的响应时,它无法确认这个响应是否来自它信任的 DNS 服务商。在 DNS 服务商答复之前,攻击者可能抢先主动发送一个虚假的 DNS 响应,让用户采用他提供的 IP 地址作为解析结果,而忽略正规服务商的响应结果。

隐患二:无法确保数据的安全

DNS 报文以明文的方式在网络中传输,是一件危险的事情。攻击者能看到你访问的是哪个网站,也能看到 DNS 服务商给你答复的内容。如果攻击者篡改了回复给用户的响应报文,比如将响应中的 IP 地址替换成了恶意地址,被攻击的用户并不知情的。

真实危害案例

假设攻击者利用上述安全隐患对用户的 DNS 攻击成功,他就可能把你想访问的银行的网址转移到自己的恶意地址上。比如说小明在想访问工商银行的网站 www.icbc.com.cn,正常情况下,浏览器收到 DNS 服务商解析后的合法 IP 地址,网页请求会被发送到工商银行的服务器上;然而攻击者的存在导致浏览器拿到了错误的 IP 地址,网页请求被发送到了恶意服务器上。攻击者只需要在恶意服务器上山寨一个肉眼无法分辨出来的银行页面,在用户操作的时候就能非法盗取用户的银行账号信息,而这一切用户完全感知不到。

DNS 协议的改进方案

为了解决此类的问题,人们想出了很多的办法改进或扩展 DNS 协议。比如说让 DNS 协议中携带的网址大小写变得随机,这样攻击者就难以准确猜测到正确的网址,比如说在报文里面添加校验验证报文的来源或报文数据是否被篡改过等。

目前看来最为安全有效的方式,是 DoT/DoH 方案

DoT / DoH 详解

DoT (DNS over TLS) 简介

DoT 全称是 DNS over TLS,它使用 TLS 协议来传输 DNS 协议。TLS 协议是目前互联网最常用的安全加密协议之一,我们访问 HTTPs 的安全基础就是基于 TLS 协议的。相比于之前使用无连接无加密的 UDP 模式,TLS 本身已经实现了保密性与完整性。

TLS 协议的安全机制

证书与加密机制

TLS 协议的基本思路是证书+加密机制,双管齐下保证安全。证书相当于申请了一个合法的身份证,当客户端向服务器发起连接的时候,双方会相互校验一下身份,服务器把证书给客户端,客户端来校验证书的内容和合法性。

握手协议

握手协议则是用的公钥加密法:首先,客户端会向服务器端索要并验证公钥,验证后双方会协商生成”对话密钥”,类似于两个人独有的摩斯密码,在此之后,双方就会采用对话密钥进行加密通信。

通俗理解

你要和你的笔友写信,握手协议是你和你的笔友之间商量出来一套加密通信的方式,而证书则是保证拿到你寄出去的信的人是你的笔友本人。

DoH (DNS over HTTPs) 简介

DoH 全称是 DNS over HTTPs,它使用 HTTPs 来传输 DNS 协议。DoH 的安全原理与 DoT 一样,他们之间的区别只在于:DoH 有了 HTTP 格式封装,更加通用。

DoT vs DoH

  • DoT 在专用端口上通过 TLS 连接 DNS 服务器,端口号是 853
  • DoH 是基于使用 HTTP 应用程序层协议,将查询发送到 HTTPS 端口上的特定 HTTP 端点,端口号是 443

性能考量

也许你会问:增加了握手的过程,以及数据增加了加密的步骤,是不是传输速度会变慢?实际上,使用 TLS 或 HTTPS 的确会增加前期协商带来的时间损耗。但从长期来看,带来的安全收益是值得的。

提供 DoT/DoH 的厂商

阿里公共 DNS

1
2
3
4
5
6
7
8
IPv4: 223.5.5.5 / 223.6.6.6
IPv6: 2400:3200::1 / 2400:3200:baba::1

DoH: https://223.5.5.5/dns-query
https://223.6.6.6/dns-query
https://dns.alidns.com/dns-query

DoT: dns.alidns.com / 223.5.5.5 / 223.6.6.6

腾讯公共 DNS (DNSPod)

1
2
3
4
5
6
7
8
9
IPv4: 119.29.29.29
IPv6: 2402:4e00::

DoH: https://doh.pub/dns-query
https://1.12.12.12/dns-query
https://120.53.53.53/dns-query
https://sm2.doh.pub/dns-query (国密)

DoT: dot.pub / 1.12.12.12 / 120.53.53.53

百度公共 DNS

1
2
IPv4: 180.76.76.76
IPv6: 2400:da00::6666

360 公共 DNS

1
2
3
4
5
6
电信/铁通/移动 IPv4: 101.226.4.6 / 218.30.118.6
联通 IPv4: 123.125.81.6 / 140.207.198.6

DoH: https://doh.360.cn/dns-query

DoT: dot.360.cn

CNNIC DNS

1
2
IPv4: 1.2.4.8 / 210.2.4.8
IPv6: 2001:dc7:1000::1

台湾 Quad 101 (TWNIC)

1
2
3
4
IPv4: 101.101.101.101 / 101.102.103.104
IPv6: 2001:de4::101 / 2001:de4::102

DoH: https://dns.twnic.tw/dns-query

Google 公共 DNS

1
2
3
4
5
6
7
8
IPv4: 8.8.8.8 / 8.8.4.4
IPv6: 2001:4860:4860::8888 / 2001:4860:4860::8844

DoH: https://dns.google/dns-query
https://8.8.8.8/dns-query
https://8.8.4.4/dns-query

DoT: dns.google / 8.8.8.8 / 8.8.4.4

Cloudflare 公共 DNS

1
2
3
4
5
6
7
8
9
IPv4: 1.1.1.1 / 1.0.0.1
IPv6: 2606:4700:4700::1111 / 2606:4700:4700::1001

DoH: https://1.1.1.1/dns-query
https://1.0.0.1/dns-query
https://cloudflare-dns.com/dns-query

DoT: 1.1.1.1 / 1.0.0.1 / 1dot1dot1dot1.cloudflare-dns.com
cloudflare-dns.com / one.one.one.one

DNS.SB 公共 DNS

1
2
3
4
5
6
7
8
9
10
IPv4: 185.222.222.222 / 45.11.45.11
IPv6: 2a09:: / 2a11::

DoH: https://doh.sb/dns-query
https://doh.dns.sb/dns-query
https://45.11.45.11/dns-query
https://185.222.222.222/dns-query
https://hk-hkg.doh.sb/dns-query (香港节点,更多分节点见官网)

DoT: dot.sb / 185.222.222.222 / 45.11.45.11

AdGuard 公共 DNS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
过滤广告:
IPv4: 94.140.14.14 / 94.140.15.15

无过滤:
IPv4: 94.140.14.140 / 94.140.14.141

家庭保护(过滤广告与成人内容):
IPv4: 94.140.14.15 / 94.140.15.16

DoH:
过滤广告: https://dns.adguard.com/dns-query
家庭保护: https://dns-family.adguard.com/dns-query
无过滤: https://dns-unfiltered.adguard.com/dns-query

DoT:
过滤广告: dns.adguard.com
家庭保护: dns-family.adguard.com
无过滤: dns-unfiltered.adguard.com

OpenDNS (Cisco)

1
2
3
4
5
6
7
8
IPv4: 208.67.222.222 / 208.67.220.220
IPv4 (家庭): 208.67.222.123 / 208.67.220.123
IPv6: 2620:0:ccc::2 / 2620:0:ccd::2

DoH: https://doh.opendns.com/dns-query
DoH (家庭): https://doh.familyshield.opendns.com/dns-query

DoT: dns.umbrella.com

IBM Quad9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
默认安全:
IPv4: 9.9.9.9 / 149.112.112.112
IPv6: 2620:fe::fe / 2620:fe::fe:9

无过滤:
IPv4: 9.9.9.10 / 149.112.112.10
IPv6: 2620:fe::10 / 2620:fe::fe:10

ECS 保护:
IPv4: 9.9.9.11 / 149.112.112.11
IPv6: 2620:fe::11 / 2620:fe::fe:11

DoH:
默认: https://dns.quad9.net/dns-query
无过滤: https://dns10.quad9.net/dns-query
ECS 保护: https://dns11.quad9.net/dns-query

DoT:
默认: dns.quad9.net
无过滤: dns10.quad9.net
ECS 保护: dns11.quad9.net

参考资料