DNS_系统设计笔记3

来自:黯羽轻扬 2020-01-21

一.DNS 是什么?

DNS(Domain Name System)相当于 互联网的通讯录 ,能够把域名( www.example.com )翻译成 IP 地址( 93.184.216.34 ):

Address book for all of internet.

从技术角度来讲, DNS 是个层次型分布式数据库,加上一些既定协议 ,包括数据库的查询和更新机制、不同服务器间数据库信息的复制机制,以及数据库模式(Schema)

DNS architecture is a hierarchical distributed database and an associated set of protocols.

P.S.除层次型数据库外,还有关系型数据库和网状数据库

二.DNS 的由来

DNS 源于互联网的早期,当时的互联网还是美国国防部(the United States Department of Defense)出于研究目的而建立的小型网络。通过一个 HOSTS 文件来管理网络中各个计算机的主机名,而这份 HOSTS 文件放在一台集中管理的服务器上,需要解析主机名的每个站点都要先下载这份文件

随着网络中主机数量的不断增加,HOSTS 文件更新过程所产生的流量以及文件大小问题逐渐暴露出来。于是,期望建立一个能够灵活扩展,支持各种数据类型的分布式主机名管理系统,作为互联网中关键的基础设施

而这个新的分布式系统就是 DNS(Domain Name System)

P.S.最早的 DNS 规范是 RFC 882 和 RFC 883 ,后来被 RFC 1034 和 RFC 1035 所取代,之后的相关规范在此基础上扩展了安全、实施、管理等部分

三.基本概念

域名

其中,各部分都有对应的名称:

根域(Root domain):树根,表示未命名的一级,例如 www.example.com. 末尾的点号

顶级域(Top-level domain):用来表示国家、区域或者组织类型,例如 .com.edu

二级域(Second-level domain):长度不固定,由个人或组织注册,例如 example.com. 中的 example 部分

子域(Subdomain):从二级域派生而来,由持有二级域的组织/个人自行创建,例如 www.example.com

主机名/资源名(Host or resource name):树结构中的叶子,例如 api.aws.amazon.com 中最左边的 api

P.S.另外,图中的 FQND 是指完整域名(Fully Qualified Domain Name),由主机名和域名构成,能够唯一标识主机在树结构中的位置

顶级域由管理 DNS 的域名注册机构负责维护,按国家或区域分配给各个组织,例如:

.com :商业组织(Commercial organizations)

.edu :教育机构(Educational institutions)

.org :非盈利组织(Non-profit organizations)

.net :网络服务商(Networks (the backbone of the Internet))

.gov :非军方政府组织(Non-military government organizations)

mil :军方政府组织(Military government organizations)

arpa :反向 DNS(Reverse DNS)

.** :两个字母的国家代码,如 .us.au.ca.fr

mydomain.microsoft.com. (末尾点号 . 表示根域)为例:

资源记录

资源记录(resource record,简称 RR)组成了 DNS 数据库,常见的有以下几种:

A 记录(Address record):地址记录,把域名指向 IP 地址

AAAA 记录(IPv6 address record):IPv6 地址记录,相当于支持 IPv6 的 A 记录

CAA 记录(Certification Authority Authorization):证书颁发机构授权记录,用来指定允许哪些 CA 机构为域名颁发证书

CNAME 记录(Canonical name record):别名记录,把一个域名指向另一个域名,或其它 CNAME 记录、A 记录

MX 记录(Mail exchange record):邮件交换记录,指定用来接收消息的邮件服务器,如有多个邮件服务器,可指定各自的优先级

NAPTR 记录(Naming Authority Pointer):允许通过正则表达式匹配并替换域名,比如网络电话系统把用户输入的电话号码转换成 SIP URI

NS 记录(Name server record):域名服务器记录,指定解析域名和子域名所使用的 DNS 服务器

PTR 记录(PTR Resource Record):PTR 记录,把 IP 地址指向域名,与 CNAME 的区别在于直接结束并返回结果,多用于反向解析(通过 IP 反查域名)

SOA 记录(Start of authority record):指定 DNS 权威信息,包括主域名服务器,域名管理员的邮箱,域名序列号等等

SPF 记录(Sender Policy Framework record):发件人策略框架记录,早期用于验证邮件发件人的身份,已废弃,建议使用 TXT 记录代替

SRV 记录(Service locator record):通用服务定位记录,指定服务所在的服务器(域名和端口号),多用于 SIP(Session Initiation Protocol,会话发起协议)

TXT 记录(Text record):文本记录,用于字符串

其中,CAA 记录是一种证书安全机制,CA 机构颁发证书时会检查 CAA 记录,若未授权就拒绝为该域名颁发证书,具体见 DNS Certification Authority Authorization

注意, NS 记录与 SOA 记录不太容易理解,与 DNS 的结构有关 ,具体见下文结构部分

P.S.其余近百种 DNS 记录类型,见 List of DNS record types

例如:

# A记录
$ dig -t A ayqy.net
ayqy.net.       600 IN  A   121.42.135.10

# CNAME记录
$ dig -t CNAME www.baidu.com
www.baidu.com.      600 IN  CNAME   www.a.shifen.com.

# NS记录
$ dig -t NS ayqy.net
ayqy.net.       86400   IN  NS  dns10.hichina.com.
ayqy.net.       86400   IN  NS  dns9.hichina.com.

# MX记录
$ dig -t MX ayqy.net
ayqy.net.       600 IN  MX  10 mxw.mxhichina.com.
ayqy.net.       600 IN  MX  5 mxn.mxhichina.com.

P.S.其中第二列是上面提到的缓存相关的 TTL(Time-to-Live)值,单位是秒

路由策略

除基本的映射规则外,DNS 服务可能还支持一些路由策略,比如:

基于权重的路由策略(Weighted routing policy):根据指定的权重值按优先级分发流量,可用于 A/B 测试、 蓝绿部署 等场景

基于延迟的路由策略(Latency routing policy):根据延迟情况解析域名,比如选择延迟最小的 IP

基于地理位置的路由策略(Geolocation routing policy):根据用户的地理位置(各国、各大洲等)解析域名

基于地理位置邻近程度的路由策略(Geoproximity routing policy):根据用户所在地与目标资源所在地的临近程度解析域名

故障转移路由策略(Failover routing policy):用于 主动-被动故障转移模式 ,一个 IP 出问题之后换用另一个 IP

多值应答路由策略(Multivalue answer routing policy):简单的 DNS 层负载均衡,可配置一对多映射,从中随机选取

P.S.关于路由策略的更多信息,见 创建和管理流量策略

四.结构

DNS 域空间被划分成区域(Zone)进行管理,区域相当于 DNS 服务器的管辖范围

区域

一个 DNS 数据库会被划分成多个区域,每个区域包含域空间中连续的部分的资源记录及其 owner 信息,所形成的 区域文件(Zone files) 由 DNS 服务器负责维护,而一个 DNS 服务器能够管理零到多个区域

每个区域对应特定的域名,叫做该区域的根域名(Root domain),区域中包含所有以区域根域名结尾的域名信息。区域文件中的第一条记录是 SOA(Start of Authority)资源记录,标识出该区域中作为最佳信息源的主 DNS 域名服务器,以及信息更新相关的一些定时器(如 Refresh Interval、Expire Time 等等)

委托

区域中的域名可以委托给另一个位于不同 DNS 服务器上的区域, 委托(Delegation) 就是把 DNS 空间的一部分交由另一个 DNS 服务器负责的过程,比如另一个组织、部门或工作组。这种委托关系通过 NS 资源记录来标识,记录中指定了被委托的区域和与之对应的权威服务器域名

跨区域委托是 DNS 最初的设计目标之一,为了满足:

把一个 DNS 域的管理工作委托给多个组织或部门

把一个大 DNS 数据库的维护工作分散到多个 DNS 服务器上,以提升域名解析性能,和容错性

根据组织隶属关系,把主机放到合适的域下

需要跨区域解析域名时,就询问 NS 记录中的目标区域的 DNS 服务器

例如, microsoft.com. 被委托给 microsoft.commydomain.microsoft.com 两个区域管理:

五.实现原理

复制机制

域空间中的同一部分可以由多个区域来表示,分为:

主区域(Primary)

辅助区域(Secondary)

存根区域(Stub)

区域下所有记录的更新都发生在主区域,辅助区域和存根区域都是只读的主区域副本,区别在于存根区域只含用来标识权威服务器(托管这三种区域的 DNS 服务器)的记录。而托管主区域的 DNS 服务器就是该区域的主 DNS 服务器,托管辅助区域的 DNS 服务器是辅助 DNS 服务器

主 DNS 服务器(或辅助 DNS 服务器)上的区域文件可以被复制到多个 DNS 服务器,这个过程叫 区域传输(Zone transfer) ,传输方式分为 2 种:

推:主 DNS 服务器在区域文件发生变化时,通知一个或多个辅助 DNS 服务器

拉:辅助 DNS 服务器上的 DNS 服务启动时,以及区域文件的刷新间隔过期时,辅助服务器就主动向主 DNS 服务器询问变化

根据所传输的数据量分为:

全量:AXFR(A Full Zone Transfer),传输所有记录

增量:IXFR(incremental zone transfer),只传输有改动的记录

查询机制

DNS 查询发生在 DNS 客户端与 DNS 服务器,以及两个 DNS 服务器之间,一般会一次性查询特定域名的一组记录,比如其所有 A 记录

具体的,DNS 查询分为 2 种:

递归查询(Recursive):DNS 服务器必须联系相关的其它 DNS 服务器

迭代查询(Iterative):DNS 服务器根据本地数据作出响应,如果实在无法解析,就返回一个否定响应

前者常用于 DNS 客户端(如 DNS 解析器)和 DNS 转发服务,如果仅靠本地数据(本地区域文件以及之前查询的结果缓存)无法解析,就上升到根 DNS 服务器(转发服务先上升到源服务器)。后者常用于 DNS 服务查询其域之外的域名,此时可能要询问多个外部 DNS 服务器才能完成解析

www.whitehouse.gov 为例:

具体查询过程如下:

    客户端向本地 DNS 服务器发起递归查询(A 记录)

    本地 DNS 服务器向根 DNS 服务器发起迭代查询(A 记录)

    根 DNS 服务器返回 .gov 域名服务器的引用(A 记录)

    本地 DNS 服务器向 .gov 域名服务器发起迭代查询(A 记录)

    .gov 域名服务器返回 whitehouse.gov 域名服务器的引用(NS 记录)

    本地 DNS 服务器向 whitehouse.gov 域名服务器发起迭代查询(A 记录)

    whitehouse.gov 域名服务器回应迭代查询( www.whitehouse.gov 的 IP 地址)

    本地 DNS 服务器回应最初的递归查询( www.whitehouse.gov 的 IP 地址)

P.S.其中,引用(DNS Referral)是指 间接答案

DNS Referrals. The term referral indicates a response to a query which does not contain an answer section (it is empty) but which contains one or more authoritative name servers (in the Domain Authority section) that are closer to the required query question.

具体见 DNS Referrals

缓存机制

资源记录中的 TTL(Time-to-Live)值相当于该记录的 保质期 ,其它 DNS 服务器根据 TTL 来决定该把这条信息缓存多久。如果记录没有指定自身的 TTL 的话,DNS 服务器会从 SOA 记录继承默认 TTL,以防其它 DNS 服务器对资源记录进行扩展缓存

客户端的 DNS 解析器也会缓存所收到的 DNS 查询结果,缓存时长同样遵循 TTL。DNS 服务器用查询缓存应答时,会把缓存的 TTL 传递下去,接收方以收到的 TTL 值为准(而不根据自己的 TTL 重置),以保证资源记录能够正常过期

设置 TTL 需要考虑缓存信息的准确性,以及 DNS 服务器的效用和网络流量问题,二者有些冲突。如果 TTL 太短,出现旧信息的可能性虽然降低了,但 DNS 服务器的效用问题和流量问题就冒出来了,而 TTL 太长的话,缓存信息可能会过时,意味着解析器可能会返回错误的结果,但能够减轻效用问题和流量问题

P.S.关于 DNS 缓存及更新的更多信息,见 DNS Processes and Interactions

至此,DNS 的里里外外就都清楚了

参考资料

DNS Architecture

AWS Certified Solutions Architect Official Study Guide: Associate Exam

此内容来源于互联网 查看原文