写点什么

DNS 原理及其应用

用户头像
赖猫
关注
发布于: 2021 年 04 月 13 日
DNS原理及其应用

一、DNS 是什么?

概念简介

网络上的所有主机,从只能手机到笔记本电脑个人 PC 到为大量零售网站提供内容服务的服务器,都是通过 IP 的形式定位找到彼此并互相通信。然而 IP 地址对于人类来说比较不易于记忆且复杂,所以当我们打开浏览器浏览网站时,我们不再需要通过这些冗长复杂的 IP 进行访问,而是通过像 example.com 这样的域名就可以连接到正确的主机位置。

使用 DNS 进行访问控制有以下好处:

  1. 可以对服务进行一定效果的负载均衡;

  2. 对请求进行分地区的容灾管理、访问控制等;

  3. 便于人们记忆。

当然,任何事物都会有他的两面性,DNS 的主要问题可能有:

  1. 请求容易被运营商劫持,最终就会导致访问 A 网站时因为劫持的存在访问请求到了 B;

  2. 因为 local dns(下文会提及)的存在,会导致修改域名记录后修改记录无法及时生效,需要等待 TTL 过期后修改才能正确影响用户请求;

查询过程

协议格式 DNS 协议运行在 UDP/TCP 协议之上,使用端口号 53。一个 Message 的基本组成:


+---------------------+|        Header       |+---------------------+|       Question      | the question for the name server+---------------------+|        Answer       | RRs answering the question+---------------------+|      Authority      | RRs pointing toward an authority+---------------------+|      Additional     | RRs holding additional information+---------------------+
复制代码

(1)Header(头部)

                                    1  1  1  1  1  1      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                      ID                       |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                    QDCOUNT                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                    ANCOUNT                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                    NSCOUNT                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                    ARCOUNT                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
复制代码


  • ID(16bit):请求 ID,Request ID 与 Response ID 保持一致

  • QR(1bit):查询/响应的标志位,1 为响应请求,0 为查询请求

  • Opcode(4bit):定义查询或响应的类型(0 为标准的,1 为反向的,2 为服务器状态请求,3-15 保留值)

  • AA(1bit):授权回答的标志位。该位在响应报文中有效,1 表示域名服务器是权限服务器

  • TC(1bit):截断标志位。1 表示响应已超过 512 字节并已被截断

  • RD(1bit):被请求报文设置,该位为 1 表示客户端希望得到递归回答,应答时使用相同的值返回。

  • RA(1bit):支持递归, 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。

  • Z(3bit):保留字段。

  • RCODE(4bit):返回码,表示响应的差错状态,通常为 0 和 3,各取值含义如下: 0 无差错 1 报文格式差错(Format error)服务器不能理解的请求报文 2 服务器失败(Server failure)因为服务器的原因导致没办法处理的请求 3 名字错误(Name error) 只有对授权域名解析服务器有意义,指出解析的域名不存在 4 没有实现(Not Implemented)域名服务器不支持的查询类型 5 拒绝(Refused)服务器由于设置的策略据局给出应答 6 - 15 保留值

  • QDCOUNT(16bit):问题数,无符号 16 位整数表示报文请求段中的问题记录数。

  • ANCOUNT(16bit):应答数,无符号 16 位整数表示报文回答段中的回答记录数。

  • NSCOUNT(16bit): 授权资源记录数,无符号 16 位整数表示报文授权段中的授权记录数。

  • ARCOUNT(16bit):附加资源记录数,无符号 16 位整数表示报文附加段中的附加记录数。

(2)Question(查询问题区域)

                                    1  1  1  1  1  1      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                                               |    /                     QNAME                     /    /                                               /    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                     QTYPE                     |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                     QCLASS                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
复制代码
  • QNAME:查询名,查询长度不定,域名的每一“小段”通过整型进行截断并记录段长。如 www.baidu.com,格式如下:



  • QTYPE(16bit):查询类型。一般为 A,支持的选项有:A (1)、CNAME (5)、PTR (12)、HINFO (13)、MX (15)、AXFR (252)、ANY (255)。

  • QCLASS(16bit):表示查询的协议类,IN (1) 指互联网地址。

(3)Answer(回答区域)

                                    1  1  1  1  1  1      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                                               |    /                                               /    /                      NAME                     /    |                                               |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                      TYPE                     |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                     CLASS                     |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                      TTL                      |    |                                               |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    |                   RDLENGTH                    |    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|    /                     RDATA                     /    /                                               /    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
复制代码
  • NAME:域名,长度变长,格式与上述 QNAME 保持一致。

  • TYPE(16bit):RDATA 记录类型,取值与查询问题区域 QTYPE 一致。

  • CLASS(16bit):表示查询的协议类,与查询问题区域 QCLASS 相同。

  • TTL(16bit):Time To Live,记录过期时间。DNS 查询记录会被缓存 TTL 长度的时间。

  • RDLENGTH(16bit):RDATA 字段的长度。

  • RDATA:资源记录值,长度为 RDLENGTH。比如查询 baidu.com 的 DNS 记录,那么这里的取值可能会是 39.156.69.79。

(4)抓包

请求包

结果回包

二、DNS 记录类型

资源记录是用于答复 DNS 客户端请求的 DNS 数据库记录,每一个 DNS 服务器包含了它所管理的 DNS 命名空间的所有资源记录。资源记录包含和特定主机有关的信息,如 IP 地址、提供服务的类型等等。常见的资源记录类型有:SOA(起始授权结构)、A(主机)、AAAA(IPV6 主机)、NS(名称服务器)、CNAME(别名)和 MX(邮件交换器)。

我们可以通过 dig 命令快速获取域名的解析情况。

A

  • A 记录 又称 IP 指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。说明:指向的目标主机地址类型只能使用 IP 地址;

$ dig 689259.p23.tc.cdntip.com
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> 689259.p23.tc.cdntip.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63346;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;689259.p23.tc.cdntip.com. IN A # 要查询的记录类型
;; ANSWER SECTION:689259.p23.tc.cdntip.com. 180 IN A 58.251.150.72 # 域名的A记录689259.p23.tc.cdntip.com. 180 IN A 58.251.150.80 # 域名的A记录
;; Query time: 63 msec;; SERVER: 10.112.65.55#53(10.112.65.55);; WHEN: Mon Jan 20 19:42:36 CST 2020;; MSG SIZE rcvd: 85
复制代码


AAAA

  • 类似 A 记录,不过 AAAA 是 IPV6 版本的。

CNAME

  • CNAME 通常称别名指向。您可以为一个主机设置别名。比如设置 test.mydomain.com,用来指向一个主机 www.rddns.com 那么以后就可以用 test.mydomain.com 来代替访问 www.rddns.com 了。

$ dig jwlchina.cn CNAME
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn CNAME;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41582;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;jwlchina.cn. IN CNAME # 要查询的记录类型
;; ANSWER SECTION:jwlchina.cn. 555 IN CNAME jwlchina.cn.cdn.dnsv1.com. # 别名域名
;; Query time: 11 msec;; SERVER: 10.112.65.55#53(10.112.65.55);; WHEN: Mon Jan 20 20:06:22 CST 2020;; MSG SIZE rcvd: 79
复制代码


MX

  • MX 记录 邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。如:用户所用的邮件是以域名 mydomain.com 为结尾的,则需要在管理界面中添加该域名的 MX 记录来处理所有以 @mydomain.com 结尾的邮件。

$ dig jwlchina.cn MX
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn MX;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34364;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;jwlchina.cn. IN MX # 要查询的记录类型
;; ANSWER SECTION:jwlchina.cn. 600 IN MX 7 mxdomain.qq.com. # 委托指向的DNS服务器
;; Query time: 88 msec;; SERVER: 10.112.65.55#53(10.112.65.55);; WHEN: Mon Jan 20 20:05:52 CST 2020;; MSG SIZE rcvd: 71
复制代码


NS

  • NS 记录 解析服务器记录。用来表明由哪台服务器对该域名进行解析。

$ dig jwlchina.cn NS   
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn NS;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53303;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;jwlchina.cn. IN NS # 要查询的记录类型
;; ANSWER SECTION:jwlchina.cn. 86400 IN NS f1g1ns2.dnspod.net. # 域名解析服务器地址jwlchina.cn. 86400 IN NS f1g1ns1.dnspod.net. # 域名解析服务器地址
;; Query time: 24 msec;; SERVER: 10.112.65.55#53(10.112.65.55);; WHEN: Mon Jan 20 20:06:45 CST 2020;; MSG SIZE rcvd: 94
复制代码

SOA

  • SOA 叫做起始授权机构记录,NS 用于标识多台域名解析服务器,SOA 记录用于在众多 NS 记录中那一台是主服务器。

  • SOA 记录表示此域名的权威解析服务器地址。 当要查询的域名在所有递归解析服务器中没要域名解析的缓存时,就会回源来请求此域名的 SOA 记录,也叫权威解析记录。


三、EDNS

(1)什么是 EDNS?

EDNS 就是在遵循已有的 DNS 消息格式的基础上增加一些字段,来支持更多的 DNS 请求业务。

需要注意的是,像 DNS 服务器这样一个大型且广泛应用的系统软件,新增加扩展协议的时候一定要考虑到向后兼容性(backward compatibility),即你增加了你这个特性的消息传输给未支持该特性的服务器时,后者依然能正确处理。

(2)为什么要有 EDNS?

RFC2671 中指出 EDNS 被提出来的几个理由:

1)DNS 协议头部的第二个 16 字节中都已经被用的差不多了,需要添加新的返回类型(RCODE)和标记(FLAGS)来支持其他需求;

2)只为标示 domain 类型的标签分配了两位,现在已经用掉了两位(00 标示字符串类型,11 表示压缩类型),后面如果有更多的标签类型则无法支持;

3)当初 DNS 协议中设计的用 UDP 包传输时包大小限制为 512 字节,现在很多主机已经具备重组大数据包的能力,所以要有一种机制来允许 DNS 请求方通知 DNS 服务器让其返回大包;

以后我们会看到,DNSSEC 机制和 edns-client-subnet 机制等都需要有 EDNS 的支持。

(3)EDNS 的内容是什么?

怎样在 DNS 消息协议的基础上再增加一些字段呢?为了保持向后兼容性,更改已有的 DNS 协议格式是不可能的,所以只能在 DNS 协议的数据部分中做文章。

所以,EDNS 中引入了一种新的伪资源记录 OPT(Resource Record),之所以叫做伪资源记录是因为它不包含任何 DNS 数据,OPT RR 不能被 cache、不能被转发、不能被存储在 zone 文件中。OPT 被放在 DNS 通信双方(requestor 和 responsor)DNS 消息的 Additional data 区域中。

(4)OPT 伪资源记录中的内容有哪些呢?

OPT pseudo-RR 中的内容包含固定部分和可变部分。它的结构如下:

       +------------+--------------+------------------------------+       | Field Name | Field Type   | Description                  |       +------------+--------------+------------------------------+       | NAME       | domain name  | MUST be 0 (root domain)      |       | TYPE       | u_int16_t    | OPT (41)                     |       | CLASS      | u_int16_t    | requestor's UDP payload size |       | TTL        | u_int32_t    | extended RCODE and flags     |       | RDLEN      | u_int16_t    | length of all RDATA          |       | RDATA      | octet stream | {attribute,value} pairs      |       +------------+--------------+------------------------------+
OPT RR Format
复制代码


需要注意的是,每个 DNS 消息中只能有一个 OPT 伪资源记录,当有多中 EDNS 扩展协议时,各个{attribute, value}对一个紧接一个存储在 RDATA 中。具体可以看下面这个例子:

对 jwlchina.cn 这个域名进行 dig 域名,并且访问的客户端 IP 为 2.2.2.2(client subnet),则客户端会发送以下请求包。执行的命令如下:

$ dig jwlchina.cn @119.29.29.29 +client=67.220.91.30
; <<>> DiG 9.9.3 <<>> jwlchina.cn @119.29.29.29 +client=67.220.91.30;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24076;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096; CLIENT-SUBNET: 67.220.91.30/32/24;; QUESTION SECTION:;jwlchina.cn. IN A
;; ANSWER SECTION:jwlchina.cn. 600 IN CNAME jwlchina.cn.cdn.dnsv1.com.jwlchina.cn.cdn.dnsv1.com. 600 IN CNAME 689259.p23.tc.cdntip.com.689259.p23.tc.cdntip.com. 180 IN A 220.194.87.190689259.p23.tc.cdntip.com. 180 IN A 58.251.150.72689259.p23.tc.cdntip.com. 180 IN A 14.204.144.140689259.p23.tc.cdntip.com. 180 IN A 42.56.79.189689259.p23.tc.cdntip.com. 180 IN A 113.59.43.98
;; Query time: 13 msec;; SERVER: 119.29.29.29#53(119.29.29.29);; WHEN: Tue Feb 04 21:05:53 CST 2020;; MSG SIZE rcvd: 206
复制代码

client subnet 查询是一个非常有用的 edns 功能,可以查询任意 IP 子网段对应的 DNS 记录结果。

四、DNS ANYCAST

(1)anycast 是什么?

anycast 是多个主机使用相同 ip 地址的一种技术,当报文发给该地址时,根据路由协议,选择最近(跳数最少)的主机服务。

因此,当某台主机服务量大,或者被攻击,到该主机的距离变长,使得报文被发送给另外的主机。

所以,在服务器数量足够多的前提下,anycast 天然支持负载均衡和抵抗 ddos 攻击。


简而言之,anycast 就是不同服务器用了相同的 ip 地址,达到就近访问的效果。

(2)技术原理

  1. Multicast(多播):它是指网络中一个节点发出的信息被多个节点收到。实际上,在数据链路层和网络层都有 Multicast,通常所说的 Multicast 大多是针对 IP 的。这种技术用于多媒体应用、多用户交互(如聊天室)、软件分发等,相比与传统的 Unicast 可以大大提高效率。在子网内实现 Multicast 较为简单,跨越子网时需要路由器、网关等设备的支持。

  2. Unicast(单播):在客户端与媒体服务器之间需要建立一个单独的数据通道,从一台服务器送出的每个数据包只能传送给一个客户机,这种传送方式称为单播。指网络中从源向目的地转发单播流量的过程。单播流量地址唯一。每个用户必须分别对媒体服务器发送单独的查询,而媒体服务器必须向每个用户发送所申请的数据包拷贝。这种巨大冗余首先造成服务器沉重的负担,响应需要很长时间,甚至停止播放;管理人员也被迫购买硬件和带宽来保证一定的服务质量。文字单播方式下,只有一个发送方和一个接收方。与之比较,组播是指单个发送方对应一组选定接收方。

  3. Anycast 中文称为任意播。集 Multicast 和 Unicast 的特性于一身

  • 从宏观上来说,Anycast 类似于 Multicast,同一种类型的数据流同时存在多个接收者。

  • 从微观上来说,Anycast 又有着 Unicast 的唯一性。每一个单独的 IP 会话都能够找到唯一的源主机和目标主机。

(3)实际应用

DNSPOD Public Dns 地址 119.28.28.28 使用的就是 anycast 技术。

该地址同时支持 edns-client-subnet 技术,精准调度,多地集群容灾,面向所有互联网用户免费使用。

五、HTTPDNS

移动解析(HTTPDNS)基于 Http 协议向 DNS 服务器发送域名解析请求,替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式,可以避免 Local DNS 造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。

使用 HTTPDNS 有以下优点:

  1. 当 HTTPDNS 解析节点覆盖足够多足够广泛的前提下,可以更快速更高效地进行解析访问,避开了 Local Dns 跨网访问、解析异常等问题;

  2. 使用 HTTPDNS 可以由客户端自身去控制 DNS 解析的行为,在故障时可以有效地快速切换解析,避免等待漫长的 TTL 缓存时间;

  3. 可以有效地防止运营商 Local Dns 劫持;

  4. 可以更精准地识别访问来源运营商,提供更加精准的访问调度策略,进行提升 网站/应用 的访问响应速度。

当然,HTTPDNS 本身并不是万能的,他也会潜在一些缺点:

  1. 在网络环境较好的情况下,HTTPDNS 基于 TCP 协议,相较于传统的 DNS 解析使用的 UDP 协议,HTTPDNS 解析时延可能会更高;

  2. HTTPDNS 需要针对客户端逻辑进行改造,在开发上可能没有原生 DNS 解析来的方便快速。


整理了一些最新 C/C++后台开发 面试题、学习资料、教学视频和学习路线脑图(资料包括 C/C++,Linux,golang 技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享有需要的可以自行添加学习交流群973961276


用户头像

赖猫

关注

C/C++Linux服务器开发学习群960994558 2020.11.28 加入

纸上得来终觉浅,绝知此事要躬行

评论

发布
暂无评论
DNS原理及其应用