DNS和CDN及其相关原理

DNS

1. 什么是DNS

DNS (Domain Name System 的缩写)是一个分布式数据库,它将域名映射到与之关联的IP地址。DNS使得人们可以使用易于记忆的域名访问网站或其他网络服务,而不是使用长长的IP地址。例如,通过DNS,您可以使用”cyberzone.cloud“而不是“185.199.111.153”来访问本博客。

DNS通常由域名注册商或Internet服务提供商提供。

2. DNS查询过程

使用 dig 显示整个域名的查询过程

1
dig mochazz.cloud

ding mochazz.cloud

其中:

  • 查询参数和统计

    1
    2
    3
    4
    5
    ; <<>> DiG 9.10.6 <<>> mochazz.cloud
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7631
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 16
  • 查询内容

    查询域名 **mochazz.cloud **的A记录,即address的记录

    1
    2
    ;; QUESTION SECTION:
    ;mochazz.cloud. IN A
  • DNS服务器的回答

    询问DNS服务器后,会告诉你 mochazz.cloud 有哪些 A 记录,即哪些地址, 其中返回的600室TTL值(Time to live 的缩写),表示缓存时间,即600秒之内不用重新查询。

    1
    2
    ;; ANSWER SECTION:
    mochazz.cloud. 600 IN A 76.76.21.21
  • NS记录(Name Server的缩写)

    即返回哪些服务器负责管理 mochazz.cloud的DNS记录,显示结果有2条,向其中任一台查询就知道域名的地址了

    1
    2
    3
    ;; AUTHORITY SECTION:
    mochazz.cloud. 3600 IN NS ns4.dnsv2.com.
    mochazz.cloud. 3600 IN NS ns3.dnsv2.com.
  • 域名服务器地址

    回复了两个域名服务器的地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ;; ADDITIONAL SECTION:
    ns3.dnsv2.com. 169800 IN A 129.211.176.248
    ns3.dnsv2.com. 169800 IN A 183.47.126.189
    ns3.dnsv2.com. 169800 IN A 183.192.164.118
    ns3.dnsv2.com. 169800 IN A 223.166.151.17
    ns3.dnsv2.com. 169800 IN A 1.12.0.29
    ns3.dnsv2.com. 169800 IN A 117.89.178.226
    ns4.dnsv2.com. 169658 IN A 36.155.149.242
    ns4.dnsv2.com. 169658 IN A 61.151.180.45
    ns4.dnsv2.com. 169658 IN A 112.80.181.103
    ns4.dnsv2.com. 169658 IN A 117.89.178.204
    ns4.dnsv2.com. 169658 IN A 120.241.130.40
    ns4.dnsv2.com. 169658 IN A 223.166.151.18
    ns4.dnsv2.com. 169658 IN A 1.12.0.30
    ns3.dnsv2.com. 158515 IN AAAA 2402:4e00:1430:1102:0:9136:2b2f:bf6b
    ns4.dnsv2.com. 151805 IN AAAA 2402:4e00:1020:1264:0:9136:29bb:2f5e
  • DNS服务器传输的信息

    本机的DNS服务器是192.168.1.1,查询端口是53(DNS服务器的默认端口),以及回应长度是367字节。

    1
    2
    3
    4
    ;; Query time: 63 msec
    ;; SERVER: 192.168.1.1#53(192.168.1.1)
    ;; WHEN: Thu Apr 27 20:51:49 CST 2023
    ;; MSG SIZE rcvd: 367

3. 域名的层级

通过查询内容可以知道

1
2
;; QUESTION SECTION:
;mochazz.cloud. IN A

查询的是 mochazz.cloud. 而不是 mochazz.cloud

根本原因是所有域名的尾部,实际上都有一个根域名,对于所有域名都是一样的,所以平时是省略的。

带上根域名就是 mochazz.cloud.rootcyberzone.cloud.root

然后根域名的下一级为顶级域名(top-level domain,TLD)这里顶级域名为.cloud。 .com .cn都是顶级域名。

顶级域名的下一级就是次域名(second-level domain,缩写为SLD),这里的次域名为 .mochazz 和 .cyberzone。平时注册域名就是S LD

次域名的下一级就是主机名(host),比如www.mochazz.cloud 中主机名就是www。是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

域名的层级结构为

1
2
主机名.次级域名.顶级域名.根域名
host.SLD.TLD.root

4. 根域名服务器

DNS服务器根据域名的层级,进行分级查询。

需要明确的是,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。

所谓”分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下

1
2
3
从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址)
从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)
从"次级域名服务器"查出"主机名"的IP地址

分级查询

dig命令的+trace参数可以显示DNS的整个分级查询过程。

1
dig +trace www.mochazz.cloud

dig +trace www.mochazz.cloud

  • 列出根域名.的所有NS记录,即所有根域名服务器

    根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问mochazz.cloud的顶级域名服务器cloud.的NS记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ; <<>> DiG 9.10.6 <<>> +trace www.mochazz.cloud
    ;; global options: +cmd
    . 21219 IN NS i.root-servers.net.
    . 21219 IN NS h.root-servers.net.
    . 21219 IN NS d.root-servers.net.
    . 21219 IN NS g.root-servers.net.
    . 21219 IN NS e.root-servers.net.
    . 21219 IN NS f.root-servers.net.
    . 21219 IN NS l.root-servers.net.
    . 21219 IN NS a.root-servers.net.
    . 21219 IN NS b.root-servers.net.
    . 21219 IN NS c.root-servers.net.
    . 21219 IN NS k.root-servers.net.
    . 21219 IN NS m.root-servers.net.
    . 21219 IN NS j.root-servers.net.
    ;; Received 512 bytes from 192.168.1.1#53(192.168.1.1) in 58 ms
  • 显示.cloud域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。

    1
    2
    3
    4
    5
    6
    cloud.			172800	IN	NS	a.nic.cloud.
    cloud. 172800 IN NS b.nic.cloud.
    cloud. 172800 IN NS c.nic.cloud.
    cloud. 172800 IN NS x.nic.cloud.
    cloud. 172800 IN NS y.nic.cloud.
    cloud. 172800 IN NS z.nic.cloud.
  • DNS服务器向这些顶级域名服务器发出查询请求,询问www.mochazz.cloud的次级域名mochazz.cloud.的NS记录

    1
    2
    mochazz.cloud.		3600	IN	NS	ns3.dnsv2.com.
    mochazz.cloud. 3600 IN NS ns4.dnsv2.com.

    上面结果显示mochazz.cloud.有2条NS记录,同时返回的还有每一条NS记录对应的IP地址。

  • DNS服务器向上面这4台NS服务器查询mochazz.cloud.的主机名。

    1
    2
    3
    4
    www.mochazz.cloud.	600	IN	CNAME	cname.vercel-dns.com.
    mochazz.cloud. 86400 IN NS ns3.dnsv2.com.
    mochazz.cloud. 86400 IN NS ns4.dnsv2.com.
    ;; Received 134 bytes from 223.166.151.18#53(ns4.dnsv2.com) in 12 ms

    结果显示,www.mochazz.cloud有1条CNAME记录,即这CNAME 都可以访问到网站。最先返回结果的NS服务器是ns4.dnsv2.com,IP地址为223.166.151.18

5. NS 记录的查询

dig命令可以单独查看每一级域名的NS记录。

1
dig ns cloud

+short参数可以显示简化的结果。

1
dig +short www.mochazz.cloud

6. DNS的记录类型

域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type)。

常见的DNS记录类型如下:

  1. A:地址记录(Address),返回域名指向的IP地址。
  2. CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
  3. NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
  4. MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
  5. PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名

CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
╰─$ dig www.mochazz.cloud

; <<>> DiG 9.10.6 <<>> www.mochazz.cloud
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28264
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.mochazz.cloud. IN A

;; ANSWER SECTION:
www.mochazz.cloud. 600 IN CNAME cname.vercel-dns.com.
cname.vercel-dns.com. 600 IN A 76.76.21.98
cname.vercel-dns.com. 600 IN A 76.76.21.61

结果显示,www.mochazz.cloud的CNAME记录指向cname.vercel-dns.com。也就是说,用户查询www.mochazz.cloud的时候,实际上返回的是cname.vercel-dns.com的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改cname.vercel-dns.com这个域名就可以了,用户的www.mochazz.cloud域名不用修改。

由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录),这是为了防止产生冲突。举例来说,foo.com指向bar.com,而两个域名各有自己的MX记录,如果两者不一致,就会产生问题。由于顶级域名通常要设置MX记录,所以一般不允许用户对顶级域名设置CNAME记录。

PTR记录用于从IP地址反查域名。dig命令的-x参数用于查询PTR记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
╰─$ dig -x 185.199.111.153

; <<>> DiG 9.10.6 <<>> -x 185.199.111.153
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38751
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;153.111.199.185.in-addr.arpa. IN PTR

;; ANSWER SECTION:
153.111.199.185.in-addr.arpa. 3497 IN PTR cdn-185-199-111-153.github.com.

;; Query time: 54 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Apr 27 22:02:13 CST 2023
;; MSG SIZE rcvd: 90

上面结果显示,153.111.199.185这台服务器的域名是cdn-185-199-111-153.github.com

7. 其他DNS工具

  • host 命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ╰─$ host baidu.com
    baidu.com has address 110.242.68.66
    baidu.com has address 39.156.66.10
    baidu.com mail is handled by 20 usmx01.baidu.com.
    baidu.com mail is handled by 20 mx1.baidu.com.
    baidu.com mail is handled by 15 mx.n.shifen.com.
    baidu.com mail is handled by 20 jpmx.baidu.com.
    baidu.com mail is handled by 10 mx.maillb.baidu.com.
    baidu.com mail is handled by 20 mx50.baidu.com.

    host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x <ip>

  • nslookup

    用于互动式地查询域名记录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ╰─$ nslookup cyberzone.cloud                                                                                                1 ↵
    Server: 192.168.1.1
    Address: 192.168.1.1#53

    Non-authoritative answer:
    Name: cyberzone.cloud
    Address: 185.199.110.153
    Name: cyberzone.cloud
    Address: 185.199.111.153
  • whois

    用来查看域名的注册情况

    1
    whois cyberzone.cloud

CND

1. 什么是CND

CDN全称叫做“Content Delivery Network”,中文叫内容分发网络

将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。

2. 原理分析

如图

CDN简单原理图

通过域名解析IP分析

  1. 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS 系统会最终将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器。
  2. CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回用户。
  3. 用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。
  4. CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
  5. 基于以下这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址:
  6. 根据用户 IP 地址,判断哪一台服务器距用户最近;
  7. 根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;
  8. 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。
  9. 全局负载均衡设备把服务器的 IP 地址返回给用户。
  10. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

DNS 服务器根据用户 IP 地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用 CDN 服务的网站,只需将其域名解析权交给 CDN 的全局负载均衡(GSLB)设备,将需要分发的内容注入 CDN,就可以实现内容加速了。

rDNS

1. 反向DNS

计算机网络中,反向DNS查找反向DNS解析(rDNS)是查询域名系统(DNS)来确定IP地址关联的域名的技术——通常的“转发”的反向DNS查找域名的IP地址。反向DNS查询的过程使用PTR记录。互联网的反向DNS数据库植根于 .arpa 顶级域名。

反向DNS(rDNS或RDNS)是从IP地址查找域名的域名服务(DNS)。 常规的DNS请求将解析给定域名的IP地址; 因此名称为“reverse”。

2. rDNS的作用

rDNS主要用于确保邮件交换记录的有效性,用于拦截邮件服务系统中的垃圾邮件。

一般情况下,垃圾邮件发送者使用动态分配的 IP 地址或者没有注册域名的 IP 地址来发送垃圾邮件,通过反向解析可以判断邮件的合法性。当邮件服务器收到邮件时,邮件服务器会查看邮件由哪个 IP 地址发出,然后根据这个 IP 地址进行反向解析,如果反向解析得到的域名与发送方邮件的域名不一致则认为邮件发送者不是从真正的邮件服务器发出,则可以拒绝接收此邮件。

比如当 [email protected] 收到一份来自 [email protected] 的邮件时,qq邮件服务器会查看邮件来源的 IP,根据 IP 进行反向解析,如果解析到的域名和 163.com 一致,则接收邮件,否则认为邮件来源 IP 伪造成了163服务器 IP ,则拒绝这封邮件。

3. rDNS过程

由于正向 DNS 将主机名映射到 IP 地址,因此 rDNS 将服务器 IP 地址映射回主机名。使用 rDNS,可以将 IP 地址反转,然后将in-addr.arpa添加到末尾。这种 IP 地址进行反向 DNS 解析的方法用到的是 PTR 记录。

使用dig 执行rDNS查找

1
dig  -x 185.199.110.153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; <<>> DiG 9.10.6 <<>> -x 185.199.110.153
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19917
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;153.110.199.185.in-addr.arpa. IN PTR

;; ANSWER SECTION:
153.110.199.185.in-addr.arpa. 3330 IN PTR cdn-185-199-110-153.github.com.

;; Query time: 101 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sat May 13 21:57:19 CST 2023
;; MSG SIZE rcvd: 90

可以在ANSWER SECTION看到完整的rDNS PTR记录的IP,返回子域名cdn-185-199-110-153.github.com.:

1
153.110.199.185.in-addr.arpa. 3330 IN	PTR	cdn-185-199-110-153.github.com.

相关的安全攻击

1. 域前置(Domain Fronting)

1.1 什么是域前置

Domain Fronting,中文译名 “域前置” 或 “域名前置”,是一种用于隐藏真实C2服务器IP且同时能伪装为与高信誉域名通信的技术,多用于木马受控端和控制端之间的隐蔽通信。

这种举动在被封锁的站点与无害站点为同一个大型服务提供商时较为可行,例如由内容分发网络提供的服务。此时审查者通常很难区分被伪装流量与合法流量的特点,迫使审查者选择放行所有看似无害的流量,或者选择彻底封锁此域的流量。而彻底封锁可能带来显著的附加损害。

简言之,利用该技术,可以让受控端以为程序是在和一个高信誉域名通信,但实际上却是在和C2服务器进行通信。

1.2 技术原理

Domain Fronting 的技术原理图如下

域前置技术原理

Domain Fronting 的核心技术是 CDN

一般情况下,1台 CDN 会同时负责多个网站的加速服务。

如果访问的两个网站(a.com 和 b.com)都是由同1台 CDN 服务器(1.1.1.1)进行加速服务,那么当使用浏览器访问这两个域名时,浏览器实际上访问的都是 1.1.1.1 这台 CDN 服务器,但是在浏览器访问的域名有可能是 a.com 也可能是 b.com,所以必须要在和 1.1.1.1 这台 CDN 服务器通信时,在 HTTP 请求包的 Host 头中填入需要访问的域名,CDN 才会知道访问的是哪一个域名后才能返回对应域名的内容。

参考链接

https://zhuanlan.zhihu.com/p/113037678

https://www.anquanke.com/post/id/195011

https://zh.wikipedia.org/zh-sg/域前置

https://www.cnblogs.com/ConfusedChenSir/articles/16201785.html


DNS和CDN及其相关原理
https://suiyideali.github.io/2023/04/26/DNS和CDN及其相关原理/
作者
m0ch4z
发布于
2023年4月26日
更新于
2023年12月29日
许可协议